アプリケーション実行時に常に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を愛用
掲載日: 2018-08-28
iPentec all rights reserverd.