指定したアクセストークン内の特権を有効または無効にします。 OpenProcessToken()関数でトークンを取得して、AdjustTokenPrivileges()関数 でTOKEN_PRIVILEGESを設定します。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <windows.h> #include <aclapi.h> /* 特権設定する */ HRESULT EnablePrivilege ( TCHAR* wpPrivilegeName , BOOL bEnable ) { BOOL bRet; // トークンハンドル HANDLE hToken; /* プロセスに関連付けられているアクセストークンを開く */ bRet = ::OpenProcessToken( GetCurrentProcess() , 0 // | TOKEN_ASSIGN_PRIMARY // | TOKEN_DUPLICATE // | TOKEN_IMPERSONATE | TOKEN_QUERY // | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES // | TOKEN_ADJUST_GROUPS // | TOKEN_ADJUST_DEFAULT // | TOKEN_ADJUST_SESSIONID , &hToken ); if ( 0 == bRet ) { // エラー return( ::HRESULT_FROM_WIN32( ::GetLastError() ) ); } // ローカル一意識別子 LUID tLuid; /* 指定されたシステムで使われているローカル一意識別子(LUID)を取得 */ bRet = LookupPrivilegeValue( NULL // システムを指定する文字列のアドレス , wpPrivilegeName // 特権を指定する文字列のアドレス , &tLuid // ローカル一意識別子のアドレス ); if ( 0 == bRet ) { // エラー DWORD dwLastError = ::GetLastError(); ::CloseHandle( hToken ); return( ::HRESULT_FROM_WIN32( dwLastError ) ); } TOKEN_PRIVILEGES tTokenPrivileges; tTokenPrivileges.PrivilegeCount = 1; tTokenPrivileges.Privileges[ 0 ].Luid = tLuid; tTokenPrivileges.Privileges[ 0 ].Attributes = ( FALSE != bEnable )? SE_PRIVILEGE_ENABLED : 0; /* 指定したアクセストークン内の特権を設定 */ bRet = ::AdjustTokenPrivileges( hToken , FALSE , &tTokenPrivileges , sizeof( tTokenPrivileges ) , NULL , NULL ); if ( 0 == bRet ) { // エラー DWORD dwLastError = ::GetLastError(); ::CloseHandle( hToken ); return( ::HRESULT_FROM_WIN32( dwLastError ) ); } // トークンハンドルを閉じる ::CloseHandle( hToken ); wprintf( L"%s 特権を%sに設定しました。¥n" , wpPrivilegeName , ( FALSE == bEnable)? L"FALSE" : L"TRUE" ); // 正常終了 return( S_OK ); } /* 指定したアクセストークン内の特権を設定する */ int _tmain ( int argc , _TCHAR* argv[] ) { // 標準出力にユニコード出力する setlocale( LC_ALL, "Japanese" ); // 特権を設定する EnablePrivilege( SE_TAKE_OWNERSHIP_NAME, TRUE ); EnablePrivilege( SE_SECURITY_NAME , TRUE ); EnablePrivilege( SE_RESTORE_NAME , TRUE ); // 正常終了 return( 0 ); }
SeTakeOwnershipPrivilege 特権をTRUEに設定しました。 SeSecurityPrivilege 特権をTRUEに設定しました。 SeRestorePrivilege 特権をTRUEに設定しました。