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

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

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

я пробовал звонить

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

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

 CreateProcessAsUser(TokenHandle,.....)

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

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

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

1 ответ

Решение

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

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

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

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

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

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

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

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

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