Запрос прав администратора во время выполнения - PullRequest
46 голосов
/ 21 июня 2011

Можно ли заставить приложение C ++, работающее в Windows, запрашивать права администратора у операционной системы во время выполнения?

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

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: Что если я хочу, чтобы текущий экземпляр имел повышенные привилегии?Например, у меня могут быть данные, хранящиеся в памяти, которые я хочу сохранить.

Ответы [ 5 ]

36 голосов
/ 21 июня 2011

Если вы хотите, чтобы приложение всегда поднималось, вы можете дать ему манифест, либо встроив его (не компилируя технически), либо поместив внешний манифест в ту же папку, что и исполняемый файл. Если вы хотите решить, как личность, запустить его с повышенными правами, щелкните правой кнопкой мыши исполняемый файл или ярлык и выберите «Запуск от имени администратора». Если вы запускаете его из кода, то в качестве комментария @vcsjones вы используете глагол runas при запуске этого процесса. Например:

ShellExecute( NULL, 
    "runas",  
    "c:\\windows\\notepad.exe",  
    " c:\\temp\\report.txt",     
    NULL,                        // default dir 
    SW_SHOWNORMAL  
); 
8 голосов
/ 21 июня 2011

Вы можете поднять процесс только во время его создания. Когда процесс уже запущен, изменить его маркер безопасности невозможно: он либо работает с повышенными правами, либо нет.

Если вашему приложению необходимо выполнить административную задачу, и оно обычно выполняется без повышения прав, вам нужно создать еще один .exe-файл, который будет запрашивать повышение прав с помощью своего манифеста. Чтобы запустить процесс с повышенными правами, вы должны использовать функцию ShellExecute или ShellExecuteEx. Из вашего основного процесса вам потребуется способ передачи команд этому новому процессу, который будет работать с повышенными правами.


Для получения дополнительной информации о UAC см. Разработка приложений UAC для Windows Vista series.

8 голосов
/ 21 июня 2011

Не совсем, но вы можете сделать наоборот - вы можете отбросить привилегии, если они у вас уже есть.Таким образом, вы можете запустить свою программу как администратор, используя один из методов, перечисленных Kate Gregory .Затем отбросьте ваши ненужные привилегии;см. Удаление привилегий в C ++ в Windows , чтобы узнать, как это сделать.

2 голосов
/ 21 июня 2011

Твоему процессу (и потокам) присвоен токен.На этом токене уже настроены все ваши группы.Под UAC группа Администратор отключена.UAC удалит эту отключенную группу, чтобы вы получили полный токен администратора.

Чтобы добиться того же, вы должны иметь привилегию TCB.Другими словами, чтобы повысить уровень процесса во время выполнения, вам потребуется помощь от процесса, выполняемого под учетной записью SYSTEM, а Microsoft не предоставляет ни API, ни API для управления текущей реализацией UAC.В противном случае это приведет к поражению цели.

Для полноты картины существует белый список процессов, которые могут выполнять некоторые повышенные операции без запроса.Короче говоря, вашему исполняемому файлу необходимо:

  • Для подписи Microsoft
  • Для выполнения предопределенных операций, как с IFileOperation

Лучшее объяснение, которое я нашел, это этот хак .С тех пор он исправлен, но проливает свет на все это.

2 голосов
/ 21 июня 2011

Добавьте файл манифеста в ваш EXE, как описано здесь.

http://msdn.microsoft.com/en-us/library/bb756929.aspx

...