Создать процесс с обычными правами из процесса администратора - PullRequest
2 голосов
/ 05 февраля 2010

Есть ли способ запустить другой процесс с обычными правами из процесса, выполняемого от имени администратора? Из процесса с повышенными правами я хочу запустить процесс с обычными правами, как это было запущено из проводника. Я пытался подражать, но я не работал.

Ответы [ 6 ]

2 голосов
/ 05 февраля 2010

Использовать CreateProcessAsUser () . Подробности в связанных документах SDK.

1 голос
/ 10 ноября 2014

Метод, который я успешно использовал, заключается в использовании IShellDispatch2 :: ShellExecute, чтобы попросить Explorer запустить процесс. Поскольку Explorer обычно работает как обычная целостность, это эффективно. Хитрость в том, что получить объект IShellDispatch2 - это немного работы. Я следовал процессу, описанному в этом блоге .

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

Это кажется хорошим способом сделать это, при условии, что вас не волнуют ситуации, когда оболочка не работает (например, возможно, некоторые настройки служб терминалов, возможно, только для приложений, хотя я не уверен): *

http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/

Он получает интерфейс к Explorer.exe, который должен работать в обычном контексте пользователя, и просит Explorer выполнить команду от его имени. Это делается с помощью простых, документированных COM-интерфейсов и без необходимости возиться с токенами процессов или внедрением кода / DLL.

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

Нет, это невозможно (есть несколько хакерских способов сделать это (добавить в проводник, планировщик задач, SaferAPI + MediumIL и т. Д.), Но ни один из них не работает во всех сценариях)

0 голосов
/ 09 ноября 2014

Если это вообще возможно, используйте вместо этого решение Ларри Остермана (в комментариях к ответу Андерса), т. Е. Используйте родительский процесс, который выполняется без повышения прав, и запускайте как процесс с повышенными правами, так и процесс без повышенных прав.

Если это невозможно, есть подход, который должен работать почти во всех случаях, хотя обычно это больше проблем, чем стоит:

  • Установите и запустите системную службу, настроенную для работы в качестве локальной системы. Присвойте ему идентификатор сеанса удаленного рабочего стола, например, через аргумент командной строки или параметр реестра, а также идентификатор процесса и командную строку, которую вы хотите запустить.

  • Из системной службы используйте GetTokenInformation с TokenLinkedToken, чтобы получить связанный токен из целевого процесса. Вы должны сделать это из системной службы, потому что вам нужен SE_TCB_NAME, чтобы получить токен, который можно использовать. (Это ограничение, похоже, не задокументировано, но соответствует поведению токенов в Windows.)

  • Или, если нет связанного токена, используйте WTSQueryUserToken , чтобы получить копию токена пользователя. Я считаю, что это всегда дает вам ограниченный токен (если он есть), но если вы хотите быть в безопасности, вы можете проверить, является ли он токеном с повышенным или ограниченным доступом, используя GetTokenInformation и TokenElevationType; если это токен с повышенными правами, вы можете использовать TokenLinkedToken, чтобы получить ограниченный токен.

  • Если нет связанного токена (TokenElevationTypeDefault), вы должны использовать токен как есть. Это может произойти либо потому, что пользователь не является администратором, либо потому что UAC отключен, либо глобально, либо потому, что пользователь вошел в систему с использованием встроенной учетной записи администратора. Если пользователь не является администратором, токен уже подходит. Если UAC отключен, вы должны уважать намерения пользователя и использовать административный токен.

  • Затем вы можете использовать CreateProcessAsUser или CreateProcessWithTokenW из системной службы для запуска нового процесса.

  • Наконец, служба должна удалить себя и остановить.

Существует как минимум один крайний случай: если ваш повышенный процесс запускается из командного окна (или другого процесса), которое было запущено с использованием runas и неадминистративных учетных данных. В этом случае нет разделенного токена, и исходный токен, возможно, уже был удален, поэтому, если вы не захватили копию до того, как произошло повышение прав (решение Ларри или его варианты), не существует общего способа запустить дочерний процесс в том же самом пользовательский контекст, из которого изначально был запущен повышенный процесс. Лучшее, что вы можете сделать, - это контекст вошедшего в систему пользователя (через WTSQueryUserToken, как описано выше), который может не соответствовать поведению, ожидаемому конечным пользователем. (Однако это может быть приемлемым ограничением в зависимости от сценария.)

0 голосов
/ 05 февраля 2010

в Linux вы можете использовать setuid для изменения идентификатора пользователя программы

для окон Вы можете посмотреть на его: https://serverfault.com/questions/16886/is-there-an-equivalent-of-su-for-windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...