Создание процесса в ненулевом сеансе из службы на сервере Windows-2008?

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

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

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

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

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

 CreateProcessAsUser(TokenHandle,.....)

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

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

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


person Itay Levin    schedule 10.02.2010    source источник


Ответы (1)


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

Итак, как я уже упоминал выше - токен принадлежит процессу, который запущен в сеансе 0 ...

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

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

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

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

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

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

person Itay Levin    schedule 10.02.2010
comment
Благодарим вас за кропотливую работу над этой проблемой. Конечно, пользователи W7 Home Premium не смогут подделать эти настройки, поскольку в этой версии отсутствуют эти оснастки. Я все еще ищу решение, чтобы буфер обмена [link] synergy-foss.org работал правильно во время работы как услуга. - person Barton; 14.05.2012