中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【Visula Studio】管理者権限を持ったアプリケーションを作成する

1.概要

Visual Studioで作成したアプリケーションで
システムファイルやレジストリの操作を行う場合
アプリケーションを管理者権限で起動する必要があります。

管理者として実行していない場合
予期せぬエラーが発生し、アプリケーションの不具合となる場合がありますので
アプリケーションの機能に管理者として実行すべき機能があるのであれば
それは明示する必要があります。

2.特に意識せず作成した場合

管理者権限を意識せずレジストリの操作を行うアプリケーションを作成してみました。
フォームにボタンを貼り付け
下記のスクリプトを実行します。

Microsoft.Win32.RegistryKey regKey_CPBA = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System");
regKey_CPBA.SetValue("ConsentPromptBehaviorAdmin", 0);
regKey_CPBA.Close();

Microsoft.Win32.RegistryKey regKey_POSD = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System");
regKey_POSD.SetValue("PromptOnSecureDesktop", 0);
regKey_POSD.Close();

スクリプトの内容は下記の記事の内容になります。
www.chuken-engineer.com



実行した結果、下図のとおり
【System.UnauthorizedAccessException】が発生し
アクセスが拒否されてしまいます。

f:id:tsu--kun:20191105134628p:plain

3.アプリケーションに管理者権限を与える

アプリケーションが常に管理者権限で実行可能なよう設定していきます。
実現するには【アプリケーションマニフェストファイル】をプロジェクトに追加します。

①アプリケーション名を右クリックし
 →【追加】→【新しい項目】をクリックします。

②【アプリケーションマニフェストファイル】を選択し【追加】をクリックします。
f:id:tsu--kun:20191105134640p:plain


追加が完了すると
【app.mainfest】
というファイルが作成されます。

ここにある

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

をコメントアウトし

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

をアンコメントします。

設定はこれで完了となります。

4.実行する

先程のスクリプトを実行してみます。
【Visula Studio】の管理画面から実行すると
下図のとおり【Visula Studio】自体のの権限を上げるようなポップアップが表示されますので
【異なる資格情報で再起動】をクリックします。
f:id:tsu--kun:20191105134657p:plain


そうすると【Visula Studio】が再起動し管理者として実行されます。

この状態でアプリケーションを実行すると
スクリプトが問題なく実行されるようになります。


ビルドされたアプリケーションも
f:id:tsu--kun:20191105134727p:plain

から

f:id:tsu--kun:20191105134735p:plain


へ変更されます。
※管理者のマークが追加されます。