Как я могу выдать себя за администратора пользователя из службы Windows?

Я застрял в этом вопросе в течение длительного времени. Вот мой сценарий: я создаю службу Windows и хочу, чтобы служба запускала исполняемый установщик с интерактивным графическим интерфейсом. Поскольку служба работает под Session0 в моей системе Windows 10, я должен найти способ сделать это правильно.
Я много гуглил и нашел несколько тем о том, как выдать себя за пользователя из службы Windows. И я попробовал каждый из них. Никто из них на самом деле не решил мою проблему. Процедуры в основном понятны.
1. Получите токен некоторого процесса в пространстве пользователя, я выбрал explorer.exe.

Process[] processByName = Process.GetProcessesByName("explorer");
hProcess = processByName[0].Handle;
OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, ref procToken)

2. Дублирующий токен

DuplicateTokenEx(procToken,
                 TOKEN_ALL_ACCESS,
                 ref sa,
                 (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
                 (int)TOKEN_TYPE.TokenPrimary,
                 ref DupedToken);

3. Создать блок среды

CreateEnvironmentBlock(ref EnvironmentFromUser, DupedToken, false);

4. Запустите CreateProcessAsUser, чтобы запустить мой исполняемый установщик с графическим интерфейсом.

CreateProcessAsUser(DupedToken,
                        "myexeinstaller.exe",
                        null,
                        ref sa,
                        ref sa,
                        true,
                        CREATE_NEW_PROCESS_GROUP | CREATE_UNICODE_ENVIRONMENT, 
                        EnvironmentFromUser,
                        null,
                        ref si,
                        out pi);

Все идет хорошо, пока не появилось окно с ошибкой, прежде чем появится графический интерфейс. Я попробовал два исполняемых установщика. И они показали разные ошибки.
Один говорит: NSIS ошибка записи временного файла. Убедитесь, что временная папка действительна.
А другой говорит: ошибка Доступ запрещен.
Я как-то понял разницу между этими двумя установщиками. Первый пытался что-то записать в HKEY_CURRENT_USER, а второй пытался что-то записать в HKEY_LOCAL_MACHINE.
И мое предположение: я запустил установщик как пользователь, но без прав администратора. Поэтому установщик выдает ошибку, когда ему нужно сделать что-то, что требует прав администратора.
Я не сдавался здесь и гуглил больше, и наконец нашел эту статью. http://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite

И это мне очень помогло. Теперь я могу запустить программу установки с правами администратора под системной учетной записью. Для второго установщика он работал отлично, но для первого установщика молча не получалось. Я думаю, что это возможно, потому что установщик теперь работает под системной учетной записью, в то время как он должен сделать что-то под учетной записью пользователя, например, написать в HKEY_CURRENT_USER.
Дело в том, что я наконец-то получил права администратора, но мой установщик должен был работать под учетной записью системы.
Может кто-нибудь сказать мне, возможно ли даже запустить установщик с графическим интерфейсом из службы и работает под учетной записью пользователя с правами администратора? Любая идея ценится, большое спасибо заранее.

0 ответов

Другие вопросы по тегам