Запрос на повышение прав появляется, когда ваше приложение по какой-либо причине запрашивает его. Вы можете управлять им с помощью манифеста приложения. См. Создание и вставка манифеста приложения (UAC) , чтобы узнать, как добавить манифест.
Я бы предложил вам следующее:
- Разделите Updater и Update Checker , чтобы они находились в разных .EXE-файлах.
- UpdateChecker.exe не требует прав администратора, поэтому элемент манифеста
requestedExecutionLevel
имеет уровень asInvoker
.
- 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 без дополнительной обработки.