Создание процесса в ненулевой сессии из службы в windows-2008-server? - PullRequest
2 голосов
/ 10 февраля 2010

Мне было интересно, есть ли у сервиса простой способ создания процесса в пользовательской сессии?

Моя служба работает как учетная запись пользователя (администратора), а не как учетная запись LocalSystem, поэтому я не могу использовать функцию WTSQueryUserToken.

Я пытался позвонить

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

но когда я использую этот токен для запуска

 CreateProcessAsUser(TokenHandle,.....)

мой процесс все еще выполняется в сеансе 0. как я могу решить эту проблему?

Я использую автоматизацию Ole, поэтому мне все равно, на каком сеансе будет выполняться процесс, если это не сеанс 0 - потому что Ole по какой-то причине не создает свои процессы (winword например, .exe) в сеансе 0, но он создает их в других сеансах пользователя.

Любые предложения будут приветствоваться. Заранее спасибо.

1 Ответ

1 голос
/ 11 февраля 2010

Мне удалось решить эту проблему самостоятельно, спасибо всем, кто посмотрел на этот вопрос.

Хорошо, как я уже говорил выше, токен принадлежит процессу, который выполняется в сеансе 0 ...

так что я сделал ... ищется токен процесса, который не выполняется в сеансе 0. когда вы берете его идентификатор процесса в качестве параметра для OpenProcessToken. чем CreateProcessAsUser создаст процесс в том же сеансе (и, вероятно, с теми же преступниками, что и выбранный вами процесс);

Проблема заключалась в том, что я не мог получить какие-либо подробности о большинстве процессов, используя функцию: QueryFullProcessImageName - потому что он содержит ошибку и не работает с процессами, созданными из пути, содержащего пробелы ( например, C: \ Program Files) и еще одна проблема с этой функцией, которую я предполагаю, заключается в том, что, поскольку я запускаю исходный процесс с использованием пользователя cridentals, я не могу получить доступ к информации о процессе, который выполняется с использованием учетной записи локальной системы. что довольно плохо, потому что я хотел взять в качестве процесса winlogon.exe (потому что он указывает на новый открытый сеанс).

также, чтобы преуспеть в этом трюке, вы должны немного поиграть с безопасностью системы, чтобы позволить процессу запрашивать повышенную безопасность: то, что я выбрал для повышения: SeDebugPrivilege - для поиска информации о запущенных процессах SeAssignPrimaryTokenPrivilege - для запуска нового процесса с токеном, извлеченным из процесса пользовательской сессии (т.е. explorer.exe) SeCreateTokenPrivilege - я не знаю, нужно ли это, но я все равно сделал это, потому что это звучит как связанное.

Чтобы преуспеть в повышении этих привилегий, вы должны добавить пользователя, который запускает процесс, к соответствующим пользователям во всех этих привилегиях в run-> gpedit.msc или run-> secpol.msc (в разделе Политика локального компьютера \ Конфигурация компьютера \ Конфигурация Windows \ Параметры безопасности \ LocalPolicies \ Назначения прав пользователя)

добавить вашу учетную запись к следующим правам (совместимо с вышеуказанными привилегиями):
Создать объект токена
Отладка программ
Заменить токен уровня процесса

и это все! :) это работает отлично! Кстати, вы могли бы захотеть отключить все вещи UAC ... Я не знаю, связано ли это или нет, но это сделало работу с 2008 года менее болезненной - больше не надоедливые всплывающие окна.

...