答えは、ログオン時に実行するスケジュールされたタスクを使用することです。スケジュールされたタスクは、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
は実際問題ではありませんが、完全性のために現在の日付と時刻に設定することができます。見たときschtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml"
(タスクスケジューラに表示された名前を持つMy App
を置き換える:
XMLファイルを作成し、どこか(例えば、一時フォルダを)それを保存した後、あなたは、実際のタスクを作成します。このコマンドを実行する必要があります)。
schtasks.exe /Delete /TN "My App"
を使用してタスクを再度削除できます。
(純粋なC++ソリューションについて、あなたはまたthis exampleを取ると、ユーザー名を指定すると、利用可能な最も高い特権を使用するためのフラグを設定することになる欠けているものを追加することができます。)
これは、UACの全目的を凌駕します。 –
いいえ、私は、「常にこのプログラムを信頼する」のようなUACのためのものがあることを期待していました。あなたの-1を削除してください。 – kizeloo
それは私の-1ではありませんが、そこに+1を投げても –