Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> OS >> Windows®Vista™ >> 管理者権限でアプリケーションを動作させるためには - 基本

管理者権限でアプリケーションを動作させるためには - 基本

  実行用ファイルを右クリックして「管理者として実行」を選択しないでも、デフォルトで権限上昇を必須にするためには、権限上昇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"

  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita