わびさびサンプルソース

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

指定されたオブジェクトのセキュリティ記述子に、指定されたセキュリティ情報を設定する

指定されたオブジェクトのセキュリティ記述子に、指定されたセキュリティ情報を設定します。

設定できる内容

  • 所有者SID(WRITE_OWNER or SE_TAKE_OWNERSHIP_NAMEアクセス権が必要)
  • プライマリグループSID(WRITE_OWNER or SE_TAKE_OWNERSHIP_NAMEアクセス権が必要)
  • DACL(WRITE_DACアクセス権が必要)
  • SACL(SE_SECURITY_NAMEアクセス権が必要)
#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 );

	// 正常終了
	return( S_OK );
}



/*
	指定されたオブジェクトのセキュリティ記述子に、指定されたセキュリティ情報を設定する
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	HRESULT hResult;

	// 標準出力にユニコード出力する
	setlocale( LC_ALL, "Japanese" );

	// 特権を設定する
	EnablePrivilege( SE_TAKE_OWNERSHIP_NAME, TRUE );
	EnablePrivilege( SE_SECURITY_NAME      , TRUE );
	EnablePrivilege( SE_RESTORE_NAME       , TRUE );

	// 名前を指定されたオブジェクトのセキュリティ記述子のコピーを取得する。
	{
		PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
		PSID pSidOwner = NULL;	// 所有者SID
		PSID pSidGroup = NULL;	// プライマリグループSID
		ACL* pDacl     = NULL;	// DACL
		ACL* pSacl     = NULL;	// SACL

		// 名前を指定されたオブジェクトのセキュリティ記述子のコピーを取得します。
		DWORD dwResult = ::GetNamedSecurityInfo(
				  L"c:¥¥org¥¥test1.txt"
				, SE_FILE_OBJECT
//				, SE_SERVICE
//				, SE_PRINTER
//				, SE_REGISTRY_KEY
//				, SE_LMSHARE
//				, SE_KERNEL_OBJECT
//				, SE_WINDOW_OBJECT
//				, SE_DS_OBJECT
//				, SE_DS_OBJECT_ALL
//				, SE_PROVIDER_DEFINED_OBJECT
//				, SE_WMIGUID_OBJECT
//				, SE_REGISTRY_WOW64_32KEY
				, 0
				| OWNER_SECURITY_INFORMATION
				| GROUP_SECURITY_INFORMATION
				| DACL_SECURITY_INFORMATION
				| SACL_SECURITY_INFORMATION		// SE_SECURITY_NAMEアクセス権が必要
				| LABEL_SECURITY_INFORMATION
				, &pSidOwner				// 所有者SID
				, &pSidGroup				// プライマリグループSID
				, &pDacl					// DACL
				, &pSacl					// SACL
				, &pSecurityDescriptor		// SECURITY_DESCRIPTOR
			);
		if ( ERROR_SUCCESS != dwResult ) {
			hResult = ::HRESULT_FROM_WIN32( dwResult );
		}

		wprintf( L"pSidOwner           = 0x%08x¥n", pSidOwner );
		wprintf( L"pSidGroup           = 0x%08x¥n", pSidGroup );
		wprintf( L"pDacl               = 0x%08x¥n", pDacl );
		wprintf( L"pSacl               = 0x%08x¥n", pSacl );
		wprintf( L"pSecurityDescriptor = 0x%08x¥n", pSecurityDescriptor );


		/*
			指定されたオブジェクトのセキュリティ記述子に、指定されたセキュリティ情報を設定する
		*/
		dwResult = ::SetNamedSecurityInfo(
				  L"c:¥¥org¥¥test2.txt"
				, SE_FILE_OBJECT
//				, SE_SERVICE
//				, SE_PRINTER
//				, SE_REGISTRY_KEY
//				, SE_LMSHARE
//				, SE_KERNEL_OBJECT
//				, SE_WINDOW_OBJECT
//				, SE_DS_OBJECT
//				, SE_DS_OBJECT_ALL
//				, SE_PROVIDER_DEFINED_OBJECT
//				, SE_WMIGUID_OBJECT
//				, SE_REGISTRY_WOW64_32KEY
				, 0
				| OWNER_SECURITY_INFORMATION
					// WRITE_OWNER or SE_TAKE_OWNERSHIP_NAMEアクセス権が必要
				| GROUP_SECURITY_INFORMATION
					// WRITE_OWNER or SE_TAKE_OWNERSHIP_NAMEアクセス権が必要
				| DACL_SECURITY_INFORMATION		// WRITE_DACアクセス権が必要
				| SACL_SECURITY_INFORMATION		// SE_SECURITY_NAMEアクセス権が必要
				, pSidOwner					// 所有者SID
				, pSidGroup					// プライマリグループSID
				, pDacl						// DACL
				, pSacl						// SACL
			);
		if ( ERROR_SUCCESS != dwResult ) {
			hResult = ::HRESULT_FROM_WIN32( dwResult );
		}

		// セキュリティ記述子を解放する
		LocalFree( pSecurityDescriptor );
	}

	// 正常終了
	return( 0 );
}



実行結果

pSidOwner           = 0x00463a34
pSidGroup           = 0x00463a40
pDacl               = 0x00463a4c
pSacl               = 0x00000000
pSecurityDescriptor = 0x00463a20





わびさびサンプルソース

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