名前を指定されたオブジェクトのセキュリティ記述子のコピーを取得します。 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