Win32API プロセストークンのDACL情報を取得する

プロセストークンのDACL情報を取得する手順は、以下のようになる。

No項目
1OpenProcessToken関数で、プロセストークンを取得する
2GetTokenInformation関数で、第2引数にTokenDefaultDaclを指定してプロセストークンのDACLを取得する
3GetAclInformation関数で、DACLのサイズ情報を取得する
4GetAce関数で、DACLに含まれるACEを取得する
5LookupAccountSid関数で、ACEに含まれるSIDからACEのアカウント名とドメイン名を取得する
6ACEのアクセスマスクやACEタイプを調査する


  • プロセストークンのDACL情報をダンプするプログラム例

  • 自分自身のプロセスの、プロセストークンの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