Win32API プロセストークンのユーザー情報を取得

プロセストークンのユーザー情報を取得するには、

  • OpenProcessToken関数

  • GetTokenInformation関数

  • LookupAccountSid関数

  • を用いる


    手順は、以下のとおり

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


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

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

    #include <windows.h>
    #include <aclapi.h>
    #include <stdio.h>
    
    int main()
    {
        DWORD dwLength;
        HANDLE hToken;
        PTOKEN_USER pTokenUser;
        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, TokenUser, NULL, 0, &dwLength);
    
        pTokenUser = (PTOKEN_USER)LocalAlloc(LPTR, dwLength);
        if (pTokenUser == NULL) {
            CloseHandle(hToken);
            return 1;
        }
    
        //2.GetTokenInformation関数で、トークン情報を取得する
        GetTokenInformation(hToken, TokenUser, pTokenUser, dwLength, &dwLength);
    
    
        dwAccountNameSize = sizeof(szAccountName)/sizeof(szAccountName[0]);
        dwDomainNameSize = sizeof(szDomainName)/sizeof(szDomainName[0]);
    
        //3.LookupAccountSid関数で、トークンのSIDに対するアカウント情報を取得する
        LookupAccountSidA(NULL,
            pTokenUser->User.Sid,
            szAccountName,
            &dwAccountNameSize,
            szDomainName,
            &dwDomainNameSize,
            &snu);
    
        printf("TokenUser - AccountName: %s, DomainName: %s\n", szAccountName, 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;
        }
    
        CloseHandle(hToken);
        LocalFree(pTokenUser);
    
        return 0;
    }