Win32: обход UAC с использованием имени пользователя и пароля - PullRequest
3 голосов
/ 15 февраля 2012

Я ищу способ повысить привилегии выполнения потока или процесса без появления всплывающего окна UAC. Пользователь, который запускает процесс, является администратором, и у меня есть его имя пользователя и пароль.

Мне нужно сделать это для выполнения некоторых административных задач, таких как перезапуск службы и запись файлов в системные каталоги. Мое приложение запускается удаленно, и нет интерактивного пользователя для подтверждения диалога UAC. Отключение UAC не вариант.

Я пытался жонглировать LogonUser(), ImpersonateLoggedOnUser(), CreateProcessAsUser() и DuplicateTokenEx() на лучшую часть или два дня, но не смог найти правильную комбинацию, и если вообще это вообще возможно.


В частности, я попробовал вот что:

HANDLE token = 0;
LogonUserA(user, NULL, pass, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_DEFAULT, &token);
HANDLE impToken = 0;
DuplicateToken(token, SecurityImpersonation, &impToken);
ImpersonateLoggedOnUser(impToken);
CreateFileA("C:\\windows\\blabla.dll", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

последний вызов завершается неудачно с GetLastError() = 1346, «либо требуемый уровень олицетворения не был предоставлен, либо предоставленный уровень олицетворения недействителен».

Что я делаю не так?
Примечание - это работает на Win2008 R2

Ответы [ 4 ]

4 голосов
/ 16 февраля 2012

Вы никуда не денетесь, пытаясь войти в систему того или иного пользователя.Проблема не в пользователе, а в контексте, где вы спрашиваете права администратора.Даже администраторы должны подтверждать запросы UAC.

Если то, что вы просите, возможно, это полностью разрушит концепцию UAC.Пока сеанс является интерактивным (а на Win7 программа не входит в короткий список Windows, такой как апплет Services), вы не сможете обойти приглашение.

Как и другиеСказано, что обычным решением является написание сервиса и взаимодействие вашего интерактивного приложения со службой с использованием стандартного механизма IPC, такого как именованные каналы.Остерегайтесь, однако, дескрипторов безопасности, необходимых при создании вашего объекта IPC на обоих концах: контексты пользователей различаются в службе и в интерактивном приложении.

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

Обычно предлагаемое решение, где вам нужно обойти UAC, - написать сервис. Служба будет работать с полными привилегиями, и ваши приложения просят ее выполнить действия.

1 голос
/ 08 июля 2014

Проблема в том, что вы указали неверное значение уровня олицетворения (переменная SecurityImpersonation). Это должно быть «магическое число» 2

1 голос
/ 16 февраля 2012

Я полагаю, что вы можете использовать планировщик задач, чтобы обойти приглашение UAC. Нашел набор инструкций здесь: http://www.vikitech.com/253/create-shortcuts-for-trusted-programs-to-bypass-windows-7-uac-check

Это была бы некоторая работа, но она, безусловно, может быть выполнена с помощью кода.

...