Как запустить приложение с правами администратора, используя файл Manifest в Visual Studio 2005?

Мне нужно создать приложение, которое должно создавать файлы / папки в "C:\Program Files","Users[username]" и Sys32. Также приложение должно внести некоторую запись в реестр.

Это приложение должно работать на Vista и выше. Также на Windows Server 2003 и выше.

Вышеуказанные операционные системы имеют концепцию контроля учетных записей (UAC), где для доступа к программным файлам и записи в реестре требуются права администратора.

Я просмотрел множество форумов и обнаружил, что с помощью Microsoft SDK мы можем проверить, есть ли у текущего пользователя права администратора или нет. Но функция "CheckTokenMembership" не работает для Vista и более поздних версий ОС.

Я также нашел решение, в котором можно использовать файл манифеста, чтобы заранее сообщить ОС, что текущее приложение требует прав администратора. Это делается с помощью тэга "requiredExecutionLevel".

Я использую Visual Studio 2005 для создания приложения. Когда мы создаем приложение в Visual Studio, создается файл манифеста по умолчанию. Могу ли я изменить этот файл манифеста, включив в него тег "требуемый ExecutionLevel", чтобы мое приложение всегда выполнялось с правами администратора?

Есть ли какой-либо другой способ, с помощью которого мое приложение запускается с правами администратора, не запрашивая пользователя (администратора или стандартного) для запуска моего приложения как "запуск от имени администратора"??

Спасибо!

2 ответа

Вы должны найти опцию для этого в свойствах проекта Linker -> Manifest File -> UAC Execution Level. Установите это в requireAdminstrator,

Это заставит сгенерированный по умолчанию манифест включать requestedExecutionlevel что вам нужно, так что вашим пользователям будет автоматически предложено повысить свои привилегии, если они еще не повышены.

снимок экрана параметров визуальной студии UAC

Благодарности и введение

Этот вопрос помог мне, и я отвечу полученными знаниями. Благодаря:

  1. Липика (человек, который задал вопрос) показал, что доступ администратора был причиной перенаправления доступа к системным каталогам в виртуальные каталоги. Позже стало ясно, что отсутствие прав администратора приводит к сбою записи в определенные разделы реестра.

  2. snowcrash09 за раскрытие опции Visual Studio для включения требования доступа администратора. В ходе дальнейшего исследования MSDN я получил манифест, который нельзя встраивать в исполняемый файл в разделе «Свойства»> «Инструмент манифеста»; таким образом позволяя мне читать это.

Ссылка Наяны на ответ многочлена также хороша. Здесь я заимствую часть его ответа для демонстрации.

Отвечать

Как заявила Липика, вам потребуется доступ администратора, иначе Windows Vista и выше перенаправит вас в виртуальный каталог. Что здорово. По логике, ваше приложение должно запрашивать доступ администратора. Вы можете позволить пользователю сделать это вручную. В противном случае Windows предоставляет множество способов сделать это программно. Самый простой способ - объявить его в манифесте вашего приложения. Здесь я посвящу инструкции тем, кто не использует Visual Studio. Если вы используете Visual Studio, это так же просто, как Свойства> Компоновщик> Файл манифеста> Уровень выполнения UAC.

Если вы, например, используете CodeBlocks; создайте файл с именем app_resources.rc. С CodeBlocks очень важно, что этот файл имеет расширение, поэтому CodeBlocks знает, как скомпилировать его с помощью инструмента ресурсов Windows. Скопируйте следующий код в этот файл и добавьте его в свой проект.

      #include <windows.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "adminAccess.manifest"

Создайте файл манифеста с именем adminAccess.manifest. скопируйте следующий код в файл. Не нужно добавлять этот файл в свой проект, так как это ссылка из вашего RC-файла.

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
      <assemblyIdentity 
          version="1.0.0.0"
          processorArchitecture="X86"
          name="MyApplication"
          type="win32"/> 

     <description>Description of your application</description> 

     <!-- Identify the application security requirements. -->
     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
           <requestedPrivileges>
              <requestedExecutionLevel 
                   level="requireAdministrator" 
                   uiAccess="false"/>
           </requestedPrivileges>
         </security>
     </trustInfo>
 </assembly>

Теперь вы можете скомпилировать свое приложение, и при запуске оно будет автоматически запрашивать учетные данные администратора. Он вернет ошибку, если доступ администратора не был предоставлен. В Windows Xp вам не будет предлагаться какая-либо аутентификация.

Обратите внимание, что отсюда вы можете редактировать манифест, чтобы добавить такие функции, как визуальные стили для виджетов Windows и осведомленность о DPI.

Если вы не используете CodeBlocks. Например, вы компилируете из командной строки. Вам в значительной степени придется скомпилировать rc-файл с помощью Windows Resource Tool. В инструментах сборки MinGw это называется windres.exe. Я думаю, что после компиляции вы должны связать его со своим исполняемым файлом. Я не уверен.

Обратите внимание, что rc-файл является файлом ресурсов Windows и содержит все ресурсы, используемые вашим приложением, такие как BITMAP, ICON, STRING, шаблон диалогового окна. Все это будет сохранено в окончательном исполняемом файле. Который затем можно загрузить из исполняемого файла с помощью специальных функций Windows. Это очень похоже на то, что делает Android.

Другие вопросы по тегам