Как запустить приложение с правами администратора, используя файл 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
что вам нужно, так что вашим пользователям будет автоматически предложено повысить свои привилегии, если они еще не повышены.
Благодарности и введение
Этот вопрос помог мне, и я отвечу полученными знаниями. Благодаря:
Липика (человек, который задал вопрос) показал, что доступ администратора был причиной перенаправления доступа к системным каталогам в виртуальные каталоги. Позже стало ясно, что отсутствие прав администратора приводит к сбою записи в определенные разделы реестра.
snowcrash09 за раскрытие опции Visual Studio для включения требования доступа администратора. В ходе дальнейшего исследования MSDN я получил манифест, который нельзя встраивать в исполняемый файл в разделе «Свойства»> «Инструмент манифеста»; таким образом позволяя мне читать это.
Ссылка Наяны на ответ многочлена также хороша. Здесь я заимствую часть его ответа для демонстрации.
Отвечать
Как заявила Липика, вам потребуется доступ администратора, иначе Windows Vista и выше перенаправит вас в виртуальный каталог. Что здорово. По логике, ваше приложение должно запрашивать доступ администратора. Вы можете позволить пользователю сделать это вручную. В противном случае Windows предоставляет множество способов сделать это программно. Самый простой способ - объявить его в манифесте вашего приложения. Здесь я посвящу инструкции тем, кто не использует Visual Studio. Если вы используете Visual Studio, это так же просто, как Свойства> Компоновщик> Файл манифеста> Уровень выполнения UAC.
Если вы, например, используете CodeBlocks; создайте файл с именем app_resources.rc. С CodeBlocks очень важно, что этот файл имеет
#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.