Вопрос

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

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

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

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

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

 CreateProcessAsUser(TokenHandle,.....)

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

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

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

Это было полезно?

Решение

Я смог решить эту проблему сам, спасибо всем тем, кто рассмотрел этот вопрос.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top