Как-то на хабре я наткнулся на статью, в которой был описан способ использования прав через 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) ? "Администратор" : "Обычный пользователь"; |
Если вы все сделали правильно, то на иконке программы появится щит.