管理者権限での実行を要求する方法

管理者権限でのプログラムの実行を要求

Windows Vista 以降では、プログラムを Administrator として実行させることを要求することができます。

Administrator 権限をもつアカウントでもフィルタード・トークン (フィルタ済みトークン, filtered token) で実行中の場合は、 それにリンクされたフルトークンでの実行に切り替えることを促されます。

マニフェストで管理権限を要求する

管理者権限を要求するには、マニフェストファイルで実行レベルを設定します。

実行レベルを指定する要素は requestedExecutionLevel です。管理者権限を要求する場合は、 requestedExecutionLevel 要素の level 属性を requireAdministrator に設定します。

実際に管理者権限を要求するテストをしてみましょう

わかりやすいように、実際に管理者権限を要求する例を試してみましょう。

次の C 言語のソースコードを ratest1.cpp という名前で保存します。

#include <stdio.h>

void main() {

     printf( "Hello, world!\n" );

}

今回は起動時に管理者権限を要求することだけが目的なので、このコードの中身には意味はありません。

マニフェストファイルとして、次の内容を ratest1.exe.manifest として保存してください。 ここでは上のソースコードから ratest1.exe というプログラムを作りますから、マニフェストファイルの名前も [実行ファイル].manifest ということで ratest1.exe.manifest とします。

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns='urn:schemas-microsoft-com:asm.v3'>
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='requireAdministrator' uiAccess='false'/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

上記のソースコードから実行可能ファイルを作成します。

> cl ratest1.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

ratest1.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:ratest1.exe
ratest1.obj

この結果オブジェクトファイル (ratest1.obj) と実行可能ファイル (ratest1.exe) が作成されます。

ratest1.exe と同じディレクトリに上記のマニフェストファイルを配置すれば OK です。

試しに ratest1.exe を実行すると、以下のように実行時に UAC のプロンプトが表示され、管理者権限を要求されることがわかります。

このダイアログに Yes と答えれば、プログラムの実行が継続され No と答えれば、「アクセスが拒否されました」 というエラーメッセージを表示してプログラムが実行されません。

管理者権限を要求する時のプログラムアイコンの変化

ちなみにマニフェストファイルを配置した時点で、プログラムのアイコンが以下のように変わり、管理者権限を要求するプログラムであることがわかります。

マニフェストの配置前 マニフェストの配置後

電子署名の有無による UAC プロンプトの違い

また、プログラムが電子署名されている場合には UAC のプロンプトダイアログの色とメッセージが変わります。 例えばレジストリエディタなどを起動すると、次のようなプロンプトが表示されました。

この資料で作成した例では、背景色が黄色だったのに対して、レジストリエディタの例では背景色が青色であることがわかります。

(おまけ) UAC プロンプトの画面キャプチャをとる方法

UAC プロンプトされる時の動作についてですが、デフォルトでは全画面がグレーアウトされます。この状態では、プリントスクリーン・キーも効かず、 他のプログラムを起動することもできないので、画面のキャプチャをとることができません。

しかしながら、 ローカルセキュリティポリシーのローカルポリシー (Local Policies) → セキュリティオプション (Security Options) → User Account Control: Switch to the secure desktop when prompting for elevation を無効 (Disable) にすれば、画面全体がグレーアウトされません。これなら画面のキャプチャをとることができます。

こうした資料を作る時などは、リモートデスクトップで接続して画面のスクリーンショットを採るなどの方法もありますが、このオプションも利用できます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説