Как-то на хабре я наткнулся на статью, в которой был описан способ использования прав через UAC. Как мне кажется, описанный способ в той статье слишком сложен. Visual Studio позволяет все сделать гораздо легче. Давайте начнем с того, для чего же необходим UAC? UAC (User Account Control) – технология контроля учетных записей, появившаяся впервые в Windows Vista и встроена на данный момент в Windows 7. UAC запрещает программам выполнять действия, требующие права администратора. При выполнении программой таких действий, работа программы приостанавливается и пользователю выдается окно с запросом на защищенном рабочем столе – для того, чтобы невозможно было нажать программно кнопку ОК. К примеру, если вашей программе потребуется записать ключ реестра в раздел HKEY_LOCAL_MACHINE, то ей потребуются права администратора. Вы конечно же можете отключить UAC на своем компьютере, но другие пользователи не смогут пользоваться вашей программой, поэтому это не решение проблемы.
Один из способов – запустить программу с правами администратора. Для этого потребуется встроить в вашу программу так называемый manifest. Файл манифеста встраивается в программу и операционная система будет видеть, что при запуске требует файл.
В Visual Studio создайте проект и откройте меню Project->Add new item. Выберите файл, как показано на скриншоте:
После создания вы получите примерно такой файл, со следующим содержанием:
1 |
<? xml version = "1.0" encoding = "utf-8" ?> |
2 |
< asmv1:assembly manifestVersion = "1.0" xmlns = "urn:schemas-microsoft-com:asm.v1" xmlns:asmv1 = "urn:schemas-microsoft-com:asm.v1" xmlns:asmv2 = "urn:schemas-microsoft-com:asm.v2" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > |
3 |
< assemblyIdentity version = "1.0.0.0" name = "MyApplication.app" /> |
4 |
< trustInfo xmlns = "urn:schemas-microsoft-com:asm.v2" > |
6 |
< requestedPrivileges xmlns = "urn:schemas-microsoft-com:asm.v3" > |
17 |
< requestedExecutionLevel level = "requireAdministrator" uiAccess = "false" /> |
18 |
</ requestedPrivileges > |
Отредактировав файл, я вынес строку requestedexecutionlevel level=»requireAdministrator» uiAccess=»false» вне комментариев. Эта строка и будет требовать запуска программы с правами администратора.
Следующим шагом – будет установка в настройках проекта какой же манифест должен быть использован при компиляции. В свойствах проекта установите настройки, как показано на скриншоте:
Для более полного понимая того, как настраивать файл манифеста, разберем его настройки.
В данный момент нас интересует все, что находится между элементами requestedPrivileges. Для настройки прав требуется описать элемент requestedExecutionLevel с атрибутами level и uiAccess.
Атрибут level может иметь 3 возможных позиции:
1) asInvoker – приложение запускается с правами процесса-родителя. Это значит, что если запустить программу из приложения, которое уже запущено с правами администратора, то запущенная программа будет иметь те же права. Этот режим рекомендуется Microsoft в большинстве случаев. Т.е. это те программы, которые не требуют прав администратора;
2) highestAvailable – приложение запускается с более высокими правами, чем имеет текущий пользователь. С такими правами запускаются Regedit.exe, Mmc.exe и Eventvwr.exe;
3) requireAdministrator – требуются для приложений, которые не могут работать без прав администратора.
При запуске своих программ, поэкспериментируйте с различными настройками и определитесь что лучше использовать. Это значит, что если вам достаточно asInvoker, не пишите requireAdministrator.
Атрибут uiAccess отвечает за управлением окном ввода в процессах с повышенными правами для реализации специальных возможностей. Кроме того, требуется, чтобы программы была подписана и запускалась из папок \Program Files\ и \windows\system32\. Чаще всего, в этом нет необходимости.
Подведем итоги
Чтобы запускать программу с правами администратора требуется: создать файл манифеста, описать его и в свойствах проекта, где описывается манифест, выбрать этот файл. Программа может сама проверить запущена ли она с правами администратора:
1 |
string s = new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) ? "Администратор" : "Обычный пользователь" ; |
Если вы все сделали правильно, то на иконке программы появится щит.