我正在寻找一种方法来获取登录到我的进程运行的会话的用户的用户名和域。我不能依赖我的进程令牌信息,因为它是从一个令牌创建的不同的用户,包含不正确的信息。
我更喜欢不依赖WTS服务的方式。
我尝试使用GetUserObjectInformation然后使用LookupAccountSid,但LookupAccountSid返回ERROR_NONE_MAPPED,因为“它发生在没有相应帐户名称的SID上,例如标识登录会话的登录SID。”
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;
}
感谢
答案 0 :(得分:1)
您可以使用GetUserNameEx API。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435(v=vs.85).aspx