アプリケーション実行時に常にAdministratorとして実行する - C#
アプリケーション実行時に常にAdministratorとして管理者権限で実行する方法を紹介します。
概要
Windowsのレジストリやイベントログを操作するプログラムの場合、管理者権限で実行されていないとエラーになる場合があります。
プログラムの起動時に、タスクメニューから[管理者として実行する]を選択すれば管理者として実行できますが、アプリケーション起動時には常に管理者として実行したい場合があります。この記事では、マニフェストファイルを使用することで、常に管理者権限で起動されるアプリケーションの作成手順を紹介します。
手順
Windowsフォームアプリケーションを作成します。
[ソリューションエクスプローラー]のウィンドウでプロジェクトのノードをクリックして選択し右クリックします。ポップアップメニューの[追加]のサブメニューの[新しい項目]をクリックします。
[新しい項目の追加]ダイアログが表示されます。
左側のツリービューで[Visual C# アイテム]の項目をクリックして選択します。右側の項目のリストの[アプリケーション マニフェスト ファイル]をクリックして選択します。ファイル名はデフォルトの"app.manifest"とします。選択ができたらウィンドウ右下の[追加]ボタンをクリックします。
マニフェストファイルが作成されます。
作成されたマニフェストファイルの security タグ内の requestedExecutionLevel タグを変更します。level属性の値を "asInvoker" から "requireAdministrator" に変更します。
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC マニフェスト オプション
Windows のユーザー アカウント制御のレベルを変更するには、
requestedExecutionLevel ノードを以下のいずれかで置換します。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
requestedExecutionLevel 要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。
アプリケーションが下位互換性を保つためにこの仮想化を要求する場合、この要素を
削除します。
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
(以下略....)
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC マニフェスト オプション
Windows のユーザー アカウント制御のレベルを変更するには、
requestedExecutionLevel ノードを以下のいずれかで置換します。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
requestedExecutionLevel 要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。
アプリケーションが下位互換性を保つためにこの仮想化を要求する場合、この要素を
削除します。
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
(以下略....)
実行結果
プロジェクトをビルドしてデバッグ実行します。管理者として起動されるため、デバッガのVisual Studioも管理者として起動する必要がありますので、下図のダイアログが表示されます。[異なる資格情報で再起動]をクリックします。
Visual Studio を管理者権限で起動する閣員ダイアログが表示されます。[はい]ボタンをクリックします。
Visual Studio が管理者権限で起動されます。
先ほど作成したプロジェクトを開き、デバッグ実行します。Visual Studioが管理者権限で起動されているため、デバッグするアプリケーションも管理者権限での起動となります。
ビルドされたアプリケーションを起動する
ビルドされたアプリケーション実行時の動作を確認します。ビルドされたアプリケーションを実行します。
下図の[ユーザーアカウント制御]ダイアログが表示されます。[はい]ボタンをクリックします。
管理者権限でアプリケーションが起動できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用