管理者権限でアプリケーションを動作させるためには - 基本
実行用ファイルを右クリックして「管理者として実行」を選択しないでも、デフォルトで権限上昇を必須にするためには、権限上昇manifestが必要です。
manifestファイルとは、Windows XPの頃から存在するファイルで、OSのThemeをアプリケーションのGUIに反映することができました。
Windows®Vista™では、権限上昇(priviledge elevation)にも使用できます。
たとえば、sample.exeを権限上昇して実行することを強制したい場合はmanifestファイル名は、sample.exe.manifestである必要があります。
内容としては、下記のように記載します。
■ sample.exe.manifest ファイル
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="sample.exe"
type="win32"/>
<description>Privilege's elevation for sample</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
|
上記manifestファイルは、UTF-8で保存してください。
requestedExecutionLevelについてですが、この場合、
level="requireAdministrator"
Administratorsアカウントが必須で、
uiAccess="false"/>
他のアプリケーションからのUIの操作を受け付けないということです。
それぞれ、下記のように指定できます。
■ level
asInvoker … 親プロセスと同一の権限で実行される。(デフォルト)
highestAvailable … 現在のユーザとしての権限で最も高い権限を得られる。
requireAdministrator … 管理者権限(フルトークン)が得られる。管理者ユーザーであれば確認ダイアログが表示され、そうでない場合はパスワード入力を求められる。
■ uiAccess
false … 他の一切のアプリケーションからの干渉を受け付けません。つまり、マウス・キーボードを直接操作すること以外の手段での入力(フックなど)ができなくなります。デフォルトです。
true … 他のアプリケーションからの干渉を受け付けます。
ところで、OSのTheme用のmanifestは、下記両方の手段で用いることができます。
(1) exeと同一のパスに置くこと。
(2) リソースに含める。
しかし、権限上昇用のmanifestファイルは、「必ずリソースに含める」必要があります。
■■■ msfst プロジェクト
■main.cpp
#include <windows.h>
#include <tchar.h>
// エントリポイント
int WINAPI _tWinMain ( HINSTANCE hThisInstance,
HINSTANCE,
_TCHAR *,
int )
{
MessageBox ( NULL,
_TEXT ( "権限上昇のサンプルです。" ),
_TEXT ( "確認" ),
MB_OK );
return 0;
} |
■resrc.rc
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "mnfst.exe.manifest" |
■mnfst.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="sample.exe"
type="win32"/>
<description>Privilege's elevation for sample</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
|
上記をmnfstプロジェクトをビルドし実行すると、権限上昇用のダイアログが必ず表示されるようになります。
Visual C++ 6やC++Builder 5等を使用している場合は、manifest用のdefine値がありません。resrc.rcをコンパイルするとエラーになります。
その際は、manifestについては下記のようにリソース(.rc)をテキストで開いて書き換えてください。
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "mnfst.exe.manifest"
↓
1 24 "mnfst.exe.manifest"
|