Win32API プロセストークンのDACL情報を取得する
プロセストークンのDACL情報を取得する手順は、以下のようになる。
No | 項目 |
1 | OpenProcessToken関数で、プロセストークンを取得する |
2 | GetTokenInformation関数で、第2引数にTokenDefaultDaclを指定してプロセストークンのDACLを取得する |
3 | GetAclInformation関数で、DACLのサイズ情報を取得する |
4 | GetAce関数で、DACLに含まれるACEを取得する |
5 | LookupAccountSid関数で、ACEに含まれるSIDからACEのアカウント名とドメイン名を取得する |
6 | ACEのアクセスマスクやACEタイプを調査する |
自分自身のプロセスの、プロセストークンのDACL情報をダンプする
#include <windows.h> #include <aclapi.h> #include <stdio.h> int main() { DWORD i; DWORD dwLength; HANDLE hToken; PACCESS_ALLOWED_ACE pAce; ACL_SIZE_INFORMATION aclSize; PTOKEN_DEFAULT_DACL pDefaultDacl; char szAccountName[256]; DWORD dwAccountNameSize; char szDomainName[256]; DWORD dwDomainNameSize; SID_NAME_USE snu; //1.OpenProcessToken関数で、プロセストークンを取得する if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { return 1; } GetTokenInformation(hToken, TokenDefaultDacl, NULL, 0, &dwLength); pDefaultDacl = (PTOKEN_DEFAULT_DACL)LocalAlloc(LPTR, dwLength); if (pDefaultDacl == NULL) { CloseHandle(hToken); return 1; } //2.GetTokenInformation関数で、第2引数にTokenDefaultDaclを指定して //プロセストークンのDACLを取得する GetTokenInformation(hToken, TokenDefaultDacl, pDefaultDacl, dwLength, &dwLength); //3.GetAclInformation関数で、DACLのサイズ情報を取得する GetAclInformation(pDefaultDacl->DefaultDacl, &aclSize, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation); for (i = 0; i < aclSize.AceCount; i++) { //4.GetAce関数で、DACLに含まれるACEを取得する GetAce(pDefaultDacl->DefaultDacl, i, (LPVOID*)&pAce); dwAccountNameSize = sizeof(szAccountName)/sizeof(szAccountName[0]); dwDomainNameSize = sizeof(szDomainName)/sizeof(szDomainName[0]); //5.LookupAccountSid関数で、ACEに含まれるSIDから //ACEのアカウント名とドメイン名を取得する LookupAccountSidA(NULL, &pAce->SidStart, szAccountName, &dwAccountNameSize, szDomainName, &dwDomainNameSize, &snu); puts("=========================================================="); printf("AccountName: %s, DomainName:%s\n",szAccountName, szDomainName); //6.ACEのアクセスマスクやACEタイプを調査する puts("\n===AccessMask==="); printf("AccessMask: 0x%08x\n", pAce->Mask); if (pAce->Mask & GENERIC_READ) { puts("GENERIC_READ"); } if (pAce->Mask & GENERIC_EXECUTE) { puts("GENRIC_EXECUTE"); } if (pAce->Mask & GENERIC_ALL) { puts("GENERIC_ALL"); } char *pAceType; switch (pAce->Header.AceType) { case ACCESS_ALLOWED_ACE_TYPE: pAceType = "ACCESS_ALLOWED_ACE_TYPE"; break; case ACCESS_DENIED_ACE_TYPE: pAceType = "ACCESS_DENIED_ACE_TYPE"; break; case SYSTEM_AUDIT_ACE_TYPE: pAceType = "SYSTEM_AUDIT_ACE_TYPE"; break; default: puts("Unknown ACE type"); break; } puts("\n================"); printf("AceType: %s\n", pAceType); puts("\n\n"); } CloseHandle(hToken); LocalFree(pDefaultDacl); return 0; }
========================================================== AccountName: [ログオンユーザー名], DomainName:[マシン名] ===AccessMask=== AccessMask: 0x10000000 GENERIC_ALL ================ AceType: ACCESS_ALLOWED_ACE_TYPE ========================================================== AccountName: SYSTEM, DomainName:NT AUTHORITY ===AccessMask=== AccessMask: 0x10000000 GENERIC_ALL ================ AceType: ACCESS_ALLOWED_ACE_TYPE ========================================================== AccountName: SYSTEM, DomainName:NT AUTHORITY ===AccessMask=== AccessMask: 0xa0000000 GENERIC_READ GENRIC_EXECUTE ================ AceType: ACCESS_ALLOWED_ACE_TYPE