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

プロセストークンのグループ情報を取得するには、OpenProcessToken関数、GetTokenInformation関数、LookupAccountSidA関数を用いる


手順は、以下のとおり

No項目
1OpenProcessToken関数で、プロセストークンを取得する
2GetTokenInformation関数で、トークン情報を取得する
3LookupAccountSidA関数で、トークンのSIDに対するアカウント情報を取得する


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

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

    #include <windows.h>
    #include <aclapi.h>
    #include <stdio.h>
    
    int main()
    {
        DWORD dwLength;
        HANDLE hToken;
        PTOKEN_GROUPS pTokenGroups;
        char szAccountName[256];
        DWORD dwAccountNameSize;
        char szDomainName[256];
        DWORD dwDomainNameSize;
        SID_NAME_USE snu;
        DWORD i;
    
        //1.OpenProcessToken関数で、プロセストークンを取得する
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
            return 1;
        }
    
        GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwLength);
    
        pTokenGroups = (PTOKEN_GROUPS)LocalAlloc(LPTR, dwLength);
        if (pTokenGroups == NULL) {
            CloseHandle(hToken);
            return 1;
        }
    
        //2.GetTokenInformation関数で、トークン情報を取得する
        GetTokenInformation(hToken, TokenGroups, pTokenGroups, dwLength, &dwLength);
    
    
        for (i = 0; i < pTokenGroups->GroupCount; i++) {
    
            dwAccountNameSize = sizeof(szAccountName)/sizeof(szAccountName[0]);
            dwDomainNameSize = sizeof(szDomainName)/sizeof(szDomainName[0]);
    
            //3.LookupAccountSid関数で、トークンのSIDに対するアカウント情報を取得する
            LookupAccountSidA(NULL,
                pTokenGroups->Groups[i].Sid,
                szAccountName,
                &dwAccountNameSize,
                szDomainName,
                &dwDomainNameSize,
                &snu);
    
            puts("==================================================================");
            printf("AccountName: %s, DomainName: %s\n", szAccountName, szDomainName);
    
            puts("\n===Attribute===");
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_MANDATORY) {
                puts("SE_GROUP_MANDATORY");
            }
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_ENABLED_BY_DEFAULT) {
                puts("SE_GROUP_ENABLED_BY_DEFAULT");
            }
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_ENABLED) {
                puts("SE_GROUP_ENABLED");
            }
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_OWNER) {
                puts("SE_GROUP_OWNER");
            }
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_USE_FOR_DENY_ONLY) {
                puts("SE_GROUP_USE_FOR_DENY_ONLY");
            }
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_LOGON_ID) {
                puts("SE_GROUP_LOGON_ID");
            }
            if (pTokenGroups->Groups[i].Attributes & SE_GROUP_RESOURCE) {
                puts("SE_GROUP_RESOURCE");
            }
        
    
            puts("\n===SID_NAME_USE===");
            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;
            }
    
            puts("\n\n");
    
        }
    
        CloseHandle(hToken);
        LocalFree(pTokenGroups);
    
        return 0;
    }


  • 実行結果
  • ==================================================================
    AccountName: None, DomainName: [マシン名]
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeGroup
    
    
    
    ==================================================================
    AccountName: Everyone, DomainName:
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: Users, DomainName: BUILTIN
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeAlias
    
    
    
    ==================================================================
    AccountName: INTERACTIVE, DomainName: NT AUTHORITY
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: Authenticated Users, DomainName: NT AUTHORITY
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: This Organization, DomainName: NT AUTHORITY
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: This Organization, DomainName: NT AUTHORITY
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    SE_GROUP_LOGON_ID
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: LOCAL, DomainName:
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: NTLM Authentication, DomainName: NT AUTHORITY
    
    ===Attribute===
    SE_GROUP_MANDATORY
    SE_GROUP_ENABLED_BY_DEFAULT
    SE_GROUP_ENABLED
    
    ===SID_NAME_USE===
    SidTypeWellKnownGroup
    
    
    
    ==================================================================
    AccountName: Medium Mandatory Level, DomainName: Mandatory Label
    
    ===Attribute===
    
    ===SID_NAME_USE===
    Unknown