Настройка прав администратора 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. Выберите файл, как показано на скриншоте:

manifest visual studio

manifest visual studio

После создания вы получите примерно такой файл, со следующим содержанием:

<?xml version="1.0" encoding="utf-8"?>
<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">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
            If you want to change the Windows User Account Control level replace the
            requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            If you want to utilize File and Registry Virtualization for backward
            compatibility then delete the requestedExecutionLevel node.
        -->
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

Отредактировав файл, я вынес строку requestedexecutionlevel level=»requireAdministrator» uiAccess=»false» вне комментариев. Эта строка и будет требовать запуска программы с правами администратора.
Следующим шагом — будет установка в настройках проекта какой же манифест должен быть использован при компиляции. В свойствах проекта установите настройки, как показано на скриншоте:

resource manifest edit

resource manifest edit

Для более полного понимая того, как настраивать файл манифеста, разберем его настройки.
В данный момент нас интересует все, что находится между элементами 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\. Чаще всего, в этом нет необходимости.

Подведем итоги

Чтобы запускать программу с правами администратора требуется: создать файл манифеста, описать его и в свойствах проекта, где описывается манифест, выбрать этот файл. Программа может сама проверить запущена ли она с правами администратора:

string s = new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) ? "Администратор" : "Обычный пользователь";

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

as administration

Популярность: 48%

Теги: , ,

Если у вас возникли вопросы, вы можете оставить их в комментариях

Комментарии к статье

5 Ответов на “Настройка прав администратора UAC в ваших программах”

Оставить комментарий

(обязательно)

(обязательно)


 

MAXCACHE: 0.32MB/0.01623 sec