わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

指定したアクセストークン内の特権を有効または無効にする

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






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。