Как выполнить приложение без повышения прав? - PullRequest
7 голосов
/ 12 октября 2011

Я хочу вызвать программу обновления для проверки наличия обновлений (не для того, чтобы фактически выполнить обновление, а только для проверки наличия).Я хотел бы сделать это в фоновом режиме и молча.Если есть обновление, я бы попросил пользователя о повышенных разрешениях и запустил программу обновления с этим.Проверка включает чтение файла в каталоге приложения и сравнение найденной в нем версии с версией на веб-сайте.

Как я могу запустить его без повышения прав только для проверки?QProcess::start() терпит неудачу, потому что требуется повышенное разрешение, а ShellExecute работает только в том случае, если я добавляю глагол «runas» по той же причине (что я хочу, только если в этом каталоге действительно будет запись, т.е. я хочу выполнить обновление).Я предполагаю, что мне нужно добавить какой-то манифест, но я не знаю его содержания.

Ответы [ 3 ]

10 голосов
/ 17 октября 2011

Получается, что у меня была другая ошибка, из-за которой во всех случаях работала ветка без повышенных прав. Модель, которую я описал в посте, работает. Чтобы Windows не поняла необходимость повышенных разрешений, вам необходимо добавить ресурс манифеста. (например, если имя вашего exe-приложения содержит слово «Updater», оно будет запущено)

Содержимое манифеста следующее:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

Компиляция его в ваш .exe зависит от вашего компилятора и среды, поэтому я показываю только мои: Qt Creator и mingw-gcc:

Создайте файл rc для ресурсов со следующим содержимым:

1 24 DISCARDABLE manifest.xml

Добавьте этот rc-файл в ваш .pro следующим образом:

win32:RC_FILE = resources.rc

После этого ShellExecute без параметра глагола будет работать без повышения прав, а использование «runas» будет запускать его с повышением прав.

4 голосов
/ 16 октября 2011

Запрос на повышение прав появляется, когда ваше приложение по какой-либо причине запрашивает его. Вы можете управлять им с помощью манифеста приложения. См. Создание и вставка манифеста приложения (UAC) , чтобы узнать, как добавить манифест.

Я бы предложил вам следующее:

  1. Разделите Updater и Update Checker , чтобы они находились в разных .EXE-файлах.
  2. UpdateChecker.exe не требует прав администратора, поэтому элемент манифеста requestedExecutionLevel имеет уровень asInvoker.
  3. Updater.exe требует прав администратора, поскольку записывает обновленный файл приложения в Program Files. Поэтому элемент requestedExecutionLevel его манифеста имеет уровень requireAdministrator.

В вашей программе вы можете запустить UpdateChecker.exe любым удобным вам способом. Для запуска Updater.exe вам придется использовать ShellExecute; если приложение имеет манифест (и я настоятельно рекомендую встраивать манифест), оно покажет запрос UAC для повышения прав, если приложение хочет привилегии администратора. Нет необходимости использовать runas глагол.

В качестве альтернативы вы можете проверить, доступно ли обновление из вашего основного приложения. И запускайте Updater.exe только при наличии новой версии на сервере.


Другой вариант - заставить Updater.exe проверять наличие обновлений и применять их, если они есть, точно так же, как вы делаете это сейчас. В этом случае Updater.exe должен иметь уровень asInvoker в манифесте. При запуске без параметров проверяется наличие новой версии на сервере. Если он находит более новую версию, он перезапускает себя с правами администратора и передает параметр командной строки, например /doUpdate, который указывает, что он действительно выполняет обновление.

Чтобы перезапустить себя с повышенными правами, он должен использовать функцию ShellExecute и глагол runas, потому что ShellExecute не сможет автоматически обнаруживать, что ваш Updater.exe теперь требует прав администратора.

Имейте в виду, что значение глагола runas отличается в Windows XP и Windows Vista / 7, поэтому вам следует разобраться с этой ситуацией, если вы хотите поддерживать предыдущие версии Windows. Первый описанный мной подход будет работать в Windows XP без дополнительной обработки.

0 голосов
/ 13 октября 2011

Я предлагаю использовать один из следующих сценариев:

  • поместить этот файл в профиль пользователя вместо пути приложения
  • скопировать содержимое этого файла в профиль пользователя, если он находится в режиме только для чтения, а затем запустить QProcess::start()
  • включить этот файл в файл .qrc, а затем извлечь его в профиль пользователя в случае сбоя чтения или запуска QProcess::start()
...