プログラムの特権を強化する(AdjustTokenPrivileges)



Enhance Programs Privileges



まず、必要な機能をリストアップします

1.OpenProcessToken



2.AdjustTokenPrivileges

3. LookupPrivilegeValue



-------------------------------------------------- ------------

最初にプロセストークンへのハンドルを取得する必要があります

OpenProcessTokenプロトタイプ。



BOOL WINAPI OpenProcessToken( __in HANDLE ProcessHandle, __in DWORD DesiredAccess, __out PHANDLE TokenHandle )

最初のパラメータープロセスハンドル(現在のプロセスはパラメーターとしてGetCurrentProcess()です)

2番目のパラメーターアクセストークン特権

3番目のパラメーターは、AdjustTokenPrivilegesのパラメーターを返す最初のパラメーターです。

例:

HANDLE hToken bool retn = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) if(!retn) { return // get the token failed. . }

注:2番目のパラメーターは権限のトークンです。この権限には、権限を変更する権限があります。つまり、プログラムをさらに高く変更する権限が必要です。

他のパーミッションではMSDNを確認できます。すべてのパーミッションはTOKEN_ALL_ACCESSを書き込むことができます。トークンの権限を確認してください。TOKEN_QUERY

以下の関数が書かれています。

-------------------------------------------------- ------------

まず、AdjustTokenPrivilegesの使用について説明します。

3および5この関数パラメーターは、TOKEN_PRIVILEGES構造体を使用する必要があります。この構造体には、本体構造体LUID_AND_ATTRIBUTESがあります。

TOKEN_PRIVILEGES構造

typedef struct _TOKEN_PRIVILEGES { DWORD PrivilegeCount LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY] }TOKEN_PRIVILEGES

次の引数は特権配列です。

上記のパラメータは、変更する特権の数です

LUID_AND_ATTRIBUTES構造

typedef struct _LUID_AND_ATTRIBUTES { LUID Luid DWORD Attributes } LUID_AND_ATTRIBUTES

最初のパラメータはLuidです。Luidはフラグです。Luidはさまざまな種類の特権を表します。

2番目のパラメーターは、この特権を有効にするなど、これを行うための特権です(SE_PRIVILEGE_ENABLED)

ここでのLuid値はLookupPrivilegeValueを取得する必要があります。

-------------------------------------------------- ----------------------------------------

LookupPrivilegeValueプロトタイプ

BOOL WINAPI LookupPrivilegeValue( __in_opt LPCTSTR lpSystemName, __in LPCTSTR lpName, __out PLUID lpLuid ) The first parameter is the name of the system, if it is NULL, the local name is (fill in here NULL) The second parameter is the name of the privilege, the privilege to view details, see the article my blog Translator Categories included in the privileges. (Here write SE_DEBUG_NAME) The third parameter may return Luid LUID identifier of a type of the pointer through. With this value we can just fill in the structure. ---------------------------------------------------------------------------------------------------------------------------- Finally, we can introduce AdjustTokenPrivilege it should be no problem. Its prototype is: BOOL WINAPI AdjustTokenPrivileges( __in HANDLE TokenHandle, __in BOOL DisableAllPrivileges, __in_opt PTOKEN_PRIVILEGES NewState, __in DWORD BufferLength, __out_opt PTOKEN_PRIVILEGES PreviousState, __out_opt PDWORD ReturnLength )

最初のパラメーターはポインターパラメーターですOpenProcessToken3番目の発信ハンドル値

2番目のパラメーターは、すべてがすべての特権を無効にするかどうかです(ここにfalseを入力してください)

3番目のパラメーターは、新しい特権構造ポインターTOKEN_PRIVILEGESです。

4番目のパラメーターは、上記の構造体のバイト長(sizeof)です。

5番目のパラメーターは、元の構造を受け取る特権です。

6番目のパラメーターは、構造体のバイト長へのポインターです。

ここでの2つの引数の後は制御しません。

私のブログの詳細な電源オフの手順を読む

MSDNによると

5番目のパラメーターがNULLでない場合、TOKEN_ADJUST_PRIVILEGESで指定されたOpenProcessTokenシュトゥットガルトの権利に加えて、TOKEN_QUERYも指定する必要があります。

5番目のパラメーターがNULLの場合、元の構造(6番目のコースであるNULL)を受け入れないため、TOKEN_QUERYの追加の特権を指定する必要はありません。

また注意してください:

この関数がtrueを返した場合でも、GetLastError()を呼び出して、完全に成功したかどうかをテストします。

ERROR_SUCCESSに代わって戻ると、変更が非常に成功した場合。 。 。戻り値は私の他のブログをチェックしてください。

これは非常に重要です! !

成功するには、管理者モードのVistaとWindow7が開いている必要があります

-------------------------------------------------- -

完全な例

VC6。0年に直接コピーできます

#include #include using namespace std void main() { BOOL retn HANDLE hToken retn = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) if(retn != TRUE) { cout << 'to get a token handle failure!' << endl return } TOKEN_PRIVILEGES tp // new privileged structure LUID Luid retn = LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid) if(retn != TRUE) { cout << 'Failed to obtain Luid' << endl return } // to TP and TP in the LUID structure assignment tp.PrivilegeCount = 1 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED tp.Privileges[0].Luid = Luid AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) if(GetLastError() != ERROR_SUCCESS) { cout << 'modify privilege incomplete or fail!' << endl } else { cout << 'modified successfully!' << endl } }

記事から転載したオリジナルの作者に感謝します: http://hi.baidu.com/honfei/item/c8f53302a60104c32f4c6b76