Win32API プロセスのグループ情報を取得する

プロセスのグループ情報を取得するためには、GetKernelObjectSecurity関数、GetSecurityDescriptorGroup関数、LookupAccountSid関数を用いる


手順は以下のとおり

No項目
1GetKernelObjectSecurity関数で、カーネルオブジェクトのセキュリティ記述子を取得する
2GetSecurityDescriptorGroup関数で、セキュリティ記述子からSIDを取得する
3LookupAccountSid関数で、SIDに対するアカウント情報を取得する



  • プロセスのグループ情報を取得する例

  • 自分自身のプロセスのグループ情報を取得する

    #include <windows.h>
    #include <aclapi.h>
    #include <stdio.h>
    
    int main()
    {
        PSECURITY_DESCRIPTOR pSD;
        DWORD nLengthNeeded = 0;
        char szAccountName[256];
        DWORD dwAccountNameSize;
        char szDomainName[256];
        DWORD dwDomainNameSize;
        SID_NAME_USE snu;
        BOOL bGroupDefault;
        PSID pSID;
    
        GetKernelObjectSecurity(GetCurrentProcess(), GROUP_SECURITY_INFORMATION, NULL, nLengthNeeded, &nLengthNeeded);
    
        pSD = LocalAlloc(LPTR, nLengthNeeded);
        if (pSD == NULL) {
            return 1;
        }
    
        //1.GetKernelObjectSecurity関数で、カーネルオブジェクトのセキュリティ記述子を取得する
        GetKernelObjectSecurity(GetCurrentProcess(), GROUP_SECURITY_INFORMATION, pSD, nLengthNeeded, &nLengthNeeded);
    
        //2.GetSecurityDescriptorGroup関数で、セキュリティ記述子からSIDを取得する
        GetSecurityDescriptorGroup(pSD, &pSID, &bGroupDefault);
    
        if (pSID == NULL) {
            puts("No group");
            goto EXIT_FUNC;
        }
    
    
        dwAccountNameSize = sizeof(szAccountName)/sizeof(szAccountName[0]);
        dwDomainNameSize = sizeof(szDomainName)/sizeof(szDomainName[0]);
    
        //3.LookupAccountSid関数で、SIDに対するアカウント情報を取得する
        LookupAccountSidA(NULL,
            pSID,
            szAccountName,
            &dwAccountNameSize,
            szDomainName,
            &dwDomainNameSize,
            &snu);
    
        printf("AccountName: %s\n", szAccountName);
        printf("DomainName: %s\n", szDomainName);
    
        switch (snu) {
        case SidTypeUser:
            puts("SidTypeUser");
            break;
        case SidTypeGroup:
            puts("SidTypeGroup");
            break;
        case SidTypeDomain:
            puts("SidTypeDomain");
            break;
        case SidTypeAlias:
            puts("SidTypeAlias");
            break;
        case SidTypeWellKnownGroup:
            puts("SidTypeWellKnownGroup");
            break;
        case SidTypeDeletedAccount:
            puts("SidTypeDeletedAccount");
            break;
        case SidTypeInvalid:
            puts("SidTypeInvalid");
            break;
        case SidTypeUnknown:
            puts("SidTypeUnknown");
            break;
        case SidTypeComputer:
            puts("SidTypeComputer");
            break;
        default:
            puts("Unknown");
            break;
        }
    
    EXIT_FUNC:
    
        LocalFree(pSD);
    
        return 0;
    }