指定したアクセストークン内の特権を有効または無効にします。 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に設定しました。