わびさびサンプルソース

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

名前を指定されたオブジェクトのセキュリティ記述子のコピーを取得する

名前を指定されたオブジェクトのセキュリティ記述子のコピーを取得します。 SECURITY_DESCRIPTORの取得と共に、以下の情報へのポインタを取得する事が できます。取得したSECURITY_DESCRIPTORは、不要になったらLocalFree()関数 にて解放してください。

取得可能なポインタ情報

  • 所有者SID
  • プライマリグループSID
  • DACL
  • SACL(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[]
)
{
	// 標準出力にユニコード出力する
	setlocale( LC_ALL, "Japanese" );

	HRESULT hResult;

	// 特権を設定する
	EnablePrivilege( SE_SECURITY_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 );

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

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



実行結果

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







わびさびサンプルソース

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