• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

Настройка прав администратора UAC в ваших программах

Как-то на хабре я наткнулся на статью, в которой был описан способ использования прав через 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">
5     <security>
6       <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
7         <!-- UAC Manifest Options
8             If you want to change the Windows User Account Control level replace the
9             requestedExecutionLevel node with one of the following.
10  
11         <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
12         <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
13  
14             If you want to utilize File and Registry Virtualization for backward
15             compatibility then delete the requestedExecutionLevel node.
16         -->
17         <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
18       </requestedPrivileges>
19     </security>
20   </trustInfo>
21 </asmv1:assembly>

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

Если вы все сделали правильно, то на иконке программы появится щит.