Получить зарегистрированное имя пользователя Windows, связанное с рабочим столом - PullRequest
7 голосов
/ 07 января 2010

Я хочу перечислить все рабочие столы в системе и получить зарегистрированное имя пользователя для этого рабочего стола.Пока у меня есть следующий фрагмент кода в качестве примера получения дескриптора HDESK и попытки определить имя пользователя, связанное с ним (если есть), но вызов LookupAccountSid завершается неудачно с ERROR_NONE_MAPPED («Не было сопоставления между именами учетной записи и идентификаторами безопасностиdone ").

HDESK desk = OpenDesktop( "Default", 0, FALSE, READ_CONTROL | DESKTOP_READOBJECTS );

DWORD size = 4096;

SID * sid  = (SID *)malloc( size );

GetUserObjectInformation( desk , UOI_USER_SID, sid, size, &size );

char name[512], domain[512];
int namesz = 512, domainsz = 512;

LookupAccountSid( NULL, sid, &name, &namesz, &domain, &domainsz, &s);

Возможно, это связано с тем, что я извлекаю SID входа в систему через GetUserObjectInformation, а не из SID пользователя.Если да, могу ли я преобразовать это в SID вошедших в систему пользователей?

Кто-нибудь может указать мне правильное направление для получения имени пользователя, вошедшего в систему для произвольного рабочего стола (с помощью соответствующего дескриптора HDESK или HNWD?или даже десктоп станции HWINSTA обрабатывают)? заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 10 января 2010

Проблема в том, что рабочие столы вообще не связаны с пользователями. Попробуйте использовать psexec для запуска Notepad под учетной записью SYSTEM. Он работает на вашей оконной станции, на вашем рабочем столе. В противном случае вы бы не смогли его увидеть.

Но если вы хотите связать сеанс с оконной станцией, тогда да, это возможно. Вам нужно вызвать NtQueryObject с ObjectNameInformation, чтобы получить имя объекта. Например, вот что я получаю: \Sessions\1\Windows\WindowStations\WinSta0. Это ваш идентификатор сессии.

2 голосов
/ 08 января 2010

Если вам нужна информация о пользователе, то это будет работать.

вызовите WTSEnumerateSessions, чтобы получить массив структур WTS_SESSION_INFO.для каждой структуры передайте элемент SessionId в WTSQuerySessionInformation с элементом WTSInfoClass, установленным в WTSUserName.Это даст вам имя пользователя (если он есть), связанный с сеансом.

В качестве альтернативы вы можете установить WTSInfoClass на WTSSessionInfo и вернуть структуру WTSINFO.Это содержит много информации, включая имя пользователя и домен.Посмотрите на определение файла заголовка WTSINFO, хотя страница MSDN неверна.

Вы должны вызывать WTSEnumerateSessions дважды, один раз, чтобы получить требуемый размер буфера, а затем один раз, чтобы получить вашу информацию.

Отношения: один или несколько объектов рабочего стола находятся в Windows Station.Станция Windows связана с сеансом.

0 голосов
/ 31 июля 2013

Правильный код, который работал для меня:

TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName((TCHAR*)username, &size);

Я использую Visual Studio Express 2012 на Windows 7 x86

0 голосов
/ 14 января 2010

nbtstat раньше можно было сделать это из командной строки, используя имя компьютера или IP-адрес. Впрочем, я давно на это не смотрел.

0 голосов
/ 13 января 2010

Вы можете извлечь его из конца переменной окружения %USERPROFILE%

0 голосов
/ 12 января 2010

Это не решение, но хорошее описание станции / рабочего стола. От http://www.microsoft.com/technet/security/bulletin/fq00-020.mspx

Что такое Windows Station? Станция Windows - это безопасный контейнер, который содержит буфер обмена, некоторую глобальную информацию и набор из одного или нескольких рабочих столов. Сеанс Windows 2000 будет иметь несколько оконных станций, одна из которых будет назначена сеансу входа в систему интерактивного пользователя, а другие назначены процессу Winlogon, процессу безопасной заставки и любой службе, которая работает в контексте безопасности, отличном от интерактивного. пользователь. Станция интерактивного окна, назначенная сеансу входа в систему интерактивного пользователя, также содержит клавиатуру, мышь и устройство отображения. Интерактивная оконная станция видна пользователю и может принимать входные данные от пользователя. Все остальные оконные станции не являются интерактивными, что означает, что их нельзя сделать видимыми для пользователя, и они не могут получать вводимые пользователем данные.

Что такое рабочий стол? Рабочий стол - это защищенный контейнерный объект, который содержится в оконной станции. Там может быть много рабочих столов, содержащихся в Windows станции. Рабочий стол имеет логическую поверхность отображения и содержит окна, меню и хуки. Только рабочие столы интерактивной оконной станции могут быть видны и получать пользовательский ввод. На станции интерактивного окна активен только один рабочий стол. Этот активный рабочий стол, также известный как рабочий стол ввода, является тем, который в настоящее время видим для пользователя и который получает пользовательский ввод.

...