Как вы относитесь к UAC при создании процесса от имени другого пользователя? - PullRequest
3 голосов
/ 26 марта 2010

У меня проблема с UAC, и я выполняю неинтерактивный процесс как другой пользователь (такие API, как CreateProcessAsUser или CreateProcessWithLogonW).

Моя программа предназначена для следующих действий:

1) Создать новую учетную запись пользователя Windows (проверить, работает правильно)

2) Создать неинтерактивный дочерний процесс как новую учетную запись пользователя (происходит сбой при включенном UAC)

Мое приложение содержит манифест администратора и корректно поднимается при включенном контроле учетных записей для выполнения шага 1.

Но шаг 2 не выполняется правильно. Я подозреваю, что это потому, что дочерний процесс, который выполняется как другой пользователь, не наследует повышенные права моего основного процесса (который выполняется как интерактивный пользователь).

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

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

Ответы [ 2 ]

6 голосов
/ 29 марта 2010

Причина, по которой порожденный процесс не имеет прав администратора при использовании CreateProcessWithLogon и CreateProcessAsUser, объясняется в этом сообщении в блоге:

http://blogs.msdn.com/cjacks/archive/2010/02/01/why-can-t-i-elevate-my-application-to-run-as-administrator-while-using-createprocesswithlogonw.aspx

Короче говоря: CreateProcess - это такой низкий слой в окнах, который не знает о возвышении. ShellExecute (Ex) делает. Таким образом, вы должны создать и запустить приложение начальной загрузки с CreateProcessWithLogon / CreateProcessAsUser, которое, в свою очередь (теперь действует как другой пользователь), запускает ваше окончательное приложение с ShellExecute (Ex), который будет запрашивать права администратора (если вы укажете «runas» как lpVerb или предоставить манифест для вашего приложения). А поскольку это такая простая и веселая задача, в Windows нет функции ShellExecuteWithLogon.

Надеюсь, это поможет.

2 голосов
/ 16 февраля 2016

Только что столкнулся с подобной проблемой в Windows 7 при максимальном UAC.

Когда UAC включен, CreateProcessWithLogon создает ограниченный токен, как это делает LogonUser с LOGON32_LOGON_INTERACTIVE. Этот токен предотвращает повышение прав.

Решение состоит в том, чтобы сначала вызвать LogonUser с LOGON32_LOGON_BATCH, который возвращает токен полного доступа. После получения просто вызовите CreateProcessWithToken.

...