0

プロセスが実行されているセッションにログオンしているユーザーのユーザー名とドメインを取得する方法を探しています。プロセストークン情報は別のユーザーのトークンから作成されているため、信頼できません。間違った情報が含まれています。

私は WTS サービスに依存しない方法を好みます。

GetUserObjectInformationを使用してからLookupAccountSidを使用してみましたが、「ログオン セッションを識別するログオン SID など、対応するアカウント名を持たない SID で発生する」ため、LookupAccountSid は ERROR_NONE_MAPPED を返します。

bool GetCurrentUserAndDomain(OUT wstring & user, OUT wstring & domain)
{
bool ret = false;

HWINSTA hWinStation = GetProcessWindowStation();
if (hWinStation == NULL) {
    //LOG_ERROR(L"Failed to GetProcessWindowStation");
    return false;
}

SID * pSID = NULL;
USEROBJECTFLAGS uof = {4};
DWORD requiredSize;

GetUserObjectInformation(hWinStation, UOI_USER_SID, NULL, NULL, &requiredSize);

pSID = (SID*) new BYTE[requiredSize];

if (!GetUserObjectInformation(hWinStation, UOI_USER_SID, pSID, requiredSize, NULL))
{
    //LOG_ERROR(L"Failed to GetUserObjectInformation2");
    goto end;
}

SID_NAME_USE sidType;
DWORD dwUserNameSize = 64, dwDomainNameSize = 64;
wchar_t szUserName[64], szDomainName[64];
szDomainName[0] = '\0';
szUserName[0] = '\0';

if (LookupAccountSid(NULL, pSID, szUserName, &dwUserNameSize, szDomainName, &dwDomainNameSize, &sidType))
{
    ret = true;
    user = szUserName;
    domain = szDomainName;
}

if  (GetLastError() == ERROR_NONE_MAPPED)
{
    // the SID is a Logon sid
}
end:
delete [] pSID;
return ret;
}

ありがとう

4

1 に答える 1

1

GetUserNameEx API を使用できます。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435(v=vs.85).aspx

于 2012-11-01T17:18:53.233 に答える