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