.NET TIPS

常に管理者としてアプリケーションを実行させるには?[C#、VB、VS 2008]

デジタルアドバンテージ 一色 政彦
2009/12/17

 Windows VistaやWindows Server 2008 R2、Windows 7などの最新のWindows OSでは、UAC(ユーザー・アカウント制御)というセキュリティ機構が採用されている。その環境下では、管理者権限が必要なアプリケーションを実行しようとしても、通常は失敗する。これを失敗しないようにするには、エンド・ユーザーにアプリケーションを管理者として実行してもらう必要がある(つまり、権限の昇格をしてもらう必要がある)。

 ユーザーが管理者としてアプリケーションを実行する方法は、「Windows Vistaでプログラムを管理者モードで実行する」で紹介されているが、これを実際のエンド・ユーザーに手作業で行ってもらうのは現実的にはなかなか難しい場合もあるだろう。そのような場合には、常にアプリケーションを管理者権限で実行させるように設定するという手法が取れる。

 これを行うには、アプリケーション・マニフェスト・ファイル(app.manifest)に、管理者権限を要求する設定を記述すればよい。

 具体的には、C#の場合、Visual Studio 2008の[ソリューション エクスプローラ]で(Windowsフォーム・アプリケーションやWPFアプリケーションなどの)プロジェクト項目を右クリックし、表示されるコンテキスト・メニューから[追加]−[新しい項目]を選択する。

 これにより、下のような[新しい項目の追加]ダイアログが表示されるので、左側の[カテゴリ]から[全般]を選び、右側の[テンプレート]から[アプリケーション マニフェスト]を選択し、[ファイル名]は「app.manifest」にしたまま[追加]ボタンをクリックして、アプリケーション・マニフェスト・ファイルを新規に追加する。

アプリケーション・マニフェスト・ファイル(app.manifest)の追加

 Visual Basicの場合は、[ソリューション エクスプローラ]でプロジェクト項目の右クリック・メニューから[プロパティ]を選択してプロジェクト・プロパティを開き、その[アプリケーション]タブのページにある[UAC 設定の表示]ボタンをクリックすればよい。このタイミングで、アプリケーション・マニフェスト・ファイル(app.manifest)が自動的に追加される。

 アプリケーション・マニフェスト・ファイル(app.manifest)が追加されると、そのファイルがVisual Studio 2008のコード・エディタで開かれる。そのファイルには次のようなコードがひな型として記述されている。

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <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>
</asmv1:assembly>
アプリケーション・マニフェスト・ファイル(app.manifest)のひな型コード

 このコードの「<requestedExecutionLevel level="asInvoker" uiAccess="false" />」と記述された点に着目してほしい。ここがアクセス権限を要求する設定である。

 アプリケーションが常に「管理者として実行」されるように設定するには、<requestedExecutionLevel>要素のlevel属性の値を「asInvoker」から「requireAdministrator」に変えるだけである。このlevel属性に指定できる権限は、下の表のようになっている。

level属性の値 アクセス権限 権限昇格の確認ダイアログ
asInvoker 親プロセスと同じアクセス権限(標準) 表示されない
requireAdministrator 管理者としての完全なアクセス権限 表示される
highestAvailable 現在のユーザーが獲得できる最高のアクセス権限。つまり、現在のユーザーが管理者グループのメンバであれば、管理者権限となる 表示される
level属性に指定できる権限

 ちなみに、<requestedExecutionLevel>要素のuiAccess属性には「false」が設定されているが、これはユーザー補助アプリケーションの場合にのみ「true」に設定できる(既定値はfalse)。これをtrueに設定すると、オンスクリーン・キーボードなどのユーザー補助のUI(ユーザー・インターフェイス)にアクセスできるようになる。

 最後に、上記コードの「<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>」の部分のバージョン番号とアプリケーション名を、適切なアセンブリ・バージョンとアセンブリ名(.exe部分は除く)に書き換える必要がある。

 以上の書き換えを実際に行ったのが、次のコードである。

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="UAC"/>
  <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>
</asmv1:assembly>
管理者権限による実行設定を施したアプリケーション・マニフェスト・ファイル(app.manifest)のコード

 以上で設定は完了だ。プロジェクトのビルドを行い、アプリケーション(.exeファイル)を実行すると、次の画面のような権限昇格の確認ダイアログが表示される。

権限昇格の確認ダイアログ

 このダイアログが、エンド・ユーザー環境で(UACの設定によっては)常に表示されることになる。ここで[はい]を選択すると、アプリケーションが管理者として実行される。[いいえ]を選択するとアプリケーションは起動しない。

 なお、先ほど作成したアプリケーション・マニフェスト・ファイル(app.manifest)はアセンブリに自動的に埋め込まれている。C#の場合、この設定は、プロジェクト・プロパティの[アプリケーション]タブのページの下の方にある[マニフェスト]で確認/変更できる(この設定は、アプリケーション・マニフェスト・ファイルを新規追加した際に自動で行われる)。

アセンブリに対するマニフェストの設定
プロジェクト・プロパティを開くには、[ソリューション エクスプローラ]でプロジェクト項目の右クリック・メニューから[プロパティ]を選択すればよい。

 本TIPSでは自身のアプリケーションを管理者として実行する方法を紹介した。ほかのアプリケーションを管理者として実行する方法については、「TIPS:管理者としてほかのアプリケーションを実行するには?」で紹介している。End of Article

カテゴリ:クラス・ライブラリ 処理対象:Windows環境
カテゴリ:クラス・ライブラリ 処理対象:UAC
関連TIPS:管理者としてほかのアプリケーションを実行するには?

この記事と関連性の高い別の.NET TIPS
管理者としてほかのアプリケーションを実行するには?
[ASP.NET]Windows VistaでWebサイトのコピー機能を利用するには?
Windowsアプリケーションの位置やサイズを保存するには?
[ASP.NET]アプリケーション個別の構成ファイルの変更を禁止するには?
アプリケーション設定を活用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間