管理者権限でアプリケーションを動作させるためには - 応用 C++Builder / Visual Basic
C++Builder 5や.NETでないVisual Basicでは、多少のテクニックが必要になります。
(A) C++Builder 5の場合
フォームを作成するアプリケーションの場合、エントリポイントとなるメインモジュールに、通常 USERES("XXX.res");がありますが、
このUSERESの手前に、USERC("YYYY.rc");を作成する必要があります。
2重にリソースを組み込むことになるため、この順番にしないとmanifestが適用されません。
下記例は、権限上昇だけでなくOSのThemeも反映しています。resrc.rcはテキストファイルで作成してください。
■■■ mnfstBCB プロジェクト
■mnfstBCB.cpp
#include <vcl.h>
#pragma hdrstop
USERC("resrc.rc");// ここに追加
USERES("mnfstBCB.res");
USEFORM("Unit1.cpp", pFormMain);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// ...省略
return 0;
} |
■resrc.rc
1 24 "mnfst2.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="mnfstBCB.exe"
type="win32"/>
<description>Privilege's elevation for BCB</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
|
(B) Visual Basic 6の場合
Visual Basic 6は、resファイルを追加することはできますが、rc(リソーススクリプト)を追加することができません。
したがって、あらかじめresファイルを作成しておき、Visual Basicのプロジェクトに追加する必要があります。
※ 普通こんなおかしな方法はとらないとは思いますが、これで製品としてリリースしたこともあるので平気なはずです(笑)
VBで権限上昇するためには、Visual C++と組み合わせる必要があります。
方法は下記の通りです。
(1) VBのプロジェクト名と同じVCのプロジェクトを作成する。
(2) VCのプロジェクトにリソーススクリプトファイル(*.rc)を新規作成・追加する。
(3) テキストエディタでリソーススクリプトファイル(*.rc)を開く。
# VC.NET以降でないと、統合開発環境からrcファイルにmanifestファイルを追加できません。
# もし統合開発環境からrcファイルを開いてしまうと、manifest宣言が削除されてしまいます(VC6で確認済み)。
(4) 以下の1行を追加する。xxxxはプロジェクト名を入力します。
1 24 "xxxx.exe.manifest"
# VC.NET以降でないとmanifestのID名は定義されていないため、コンパイルできません。
# そこで、ID名のかわりに定義されている数値を入力します(XP以降対応のPlatformSDKをVCに組み込んでも可能です)。
(5) VCプロジェクトと同一のフォルダに下記内容のファイルを作成します。下記ファイル内容はAdmin権限必須をあらわしています。
ファイル名:xxxx.exe.manifest (xxxxはプロジェクト名と同じ)
ファイル内容(xxxxはプロジェクト名と同じ):
<?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="xxxx"
type="win32"/>
<description>Privilege's elevation for Oyakonet</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>
(6) VCプロジェクトをコンパイルします。すると、debugもしくはreleaseフォルダ内にresrc.resファイルが生成されます。
(7) VBプロジェクトを開きます。
(8) VBのプロジェクトに(6)で作成されたresrc.resファイルを追加します。
(9) VBのプロジェクトでxxxx.exeを生成します。このときexe名(xxxx)は、VC/VBのプロジェクト名と同一である必要があります。
これで生成されたファイルは、権限上昇を必要とするexeファイルとなります。
# もしも1つでもファイル名が異なる場合、exeは実行できないファイルとなってしまいますので注意が必要です。
|