Как я могу получить домен \ пользователя для вошедшего в систему пользователя в текущий сеанс

Я ищу способ получить имя пользователя и домен пользователя, вошедшего в сеанс, в котором запущен мой процесс. Я не могу полагаться на информацию токена моего процесса, так как он был создан из токена другого пользователя и содержит неверную информацию.

Я предпочитаю способ, который не полагается на услугу WTS.

Я пытался с помощью GetUserObjectInformation а потом LookupAccountSid, но 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;
}

Спасибо

0

Решение

Вы можете использовать API GetUserNameEx.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435(v=vs.85).aspx

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]