Ответ будет выполнен с помощью запланированной задачи для запуска при входе в систему. Запланированные задачи запускаются службой планировщика задач, которая работает с привилегиями SYSTEM, и поэтому их можно запускать с повышенными привилегиями без запроса пользователя при запуске. Вы все равно должны получать подтверждение пользователя один раз - когда вы настраиваете запланированную задачу, но не каждый раз, когда программа запускается.
Поскольку я не знаю, как вы устанавливаете свою программу (какой установщик вы используете, если есть), я опишу вам способ, которым вы, вероятно, можете реализовать в любой среде: с помощью schtasks.exe
и XML-файла , (Обратите внимание, что это не будет работать с Windows XP и старше, но вам не придется беспокоиться о UAC в любом случае.)
Вам нужно создать файл XML, как это:
<?xml version="1.0" ?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2013-11-01T00:00:00.0000000</Date>
<Author>USERDOMAIN\USERNAME</Author>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<Enabled>true</Enabled>
<UserId>USERDOMAIN\USERNAME</UserId>
</LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<RunLevel>HighestAvailable</RunLevel>
<UserId>USERDOMAIN\USERNAME</UserId>
<LogonType>InteractiveToken</LogonType>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>false</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>c:\path\to\your\app.exe</Command>
<Arguments>/your /parameters</Arguments>
</Exec>
</Actions>
</Task>
- Замените все
USERDOMAIN\USERNAME
здесь с указанием фактического имени пользователя и имени. Вы можете, например, прочитать данные из соответствующих переменных окружения USERDOMAIN
и USERNAME
.
- Замените
c:\path\to\your\app.exe
на путь вашего приложения и /your /parameters
с аргументами, которые вы хотите передать в свое приложение, если они есть.
- Тайная магия здесь находится в
<RunLevel>HighestAvailable</RunLevel>
, которая заставит планировщик задач запустит ваше приложение.
Date
не имеет значения, но для полноты вы можете установить его на текущую дату и время.
После создания файла XML и сохранить его где-нибудь (например, временную папку), вы должны выполнить эту команду, которая создаст реальную задачу: schtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml"
(заменить My App
с именем, которое должно появиться в планировщик задач при просмотре).
Вы можете снова удалить задачу, используя schtasks.exe /Delete /TN "My App"
.
(для чистого C++ решение, вы также могли бы принять this example и добавить недостающие вещи, которые будут задающие имя пользователя и установки флага для использования самых высоких доступных привилегий.)
Это победит всю цель ОАК. –
Нет, я надеялся, что для UAC есть что-то вроде «Всегда доверяй этой программе» или что-то в этом роде. Удалите -1. – kizeloo
Это не мой -1, но я буду бросать +1 туда, чтобы это было –