2010-01-07 7 views
7

Chcę wymienić wszystkie komputery w systemie i uzyskać nazwę zalogowanego użytkownika dla tego pulpitu. Do tej pory mam następujący kod snippitu jako przykład uzyskania uchwytu HDESK i próby określenia nazwy użytkownika z nim powiązanej (jeśli jest), ale wywołanie LookupAccountSid kończy się niepowodzeniem z ERROR_NONE_MAPPED ("Nie było mapowania między nazwami kont i identyfikatorami bezpieczeństwa Gotowe").Uzyskaj zalogowaną nazwę użytkownika systemu Windows skojarzoną z pulpitem

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); 

Być może dlatego jestem wyciągając SID logowania, a następnie poprzez GetUserObjectInformation użytkownika SID. Jeśli tak, czy mogę przekonwertować to na identyfikator SID zalogowanego użytkownika?

Czy ktoś może wskazać mi właściwy kierunek, aby uzyskać uzyskanie nazwy użytkownika dla dowolnego pulpitu (za pomocą odpowiedniego uchwytu HDESK lub HNWD, a nawet uchwytu pulpitu HWINSTA)? z góry dzięki.

Odpowiedz

2

Jeśli to, czego chcesz, to informacje o użytkowniku, to zadziała.

zadzwoń do WTSEnumerateSessions, aby uzyskać tablicę struktur WTS_SESSION_INFO. dla każdej struktury należy przekazać członkowi SessionId do WTSQuerySessionInformation, przy czym element członkowski WTSInfoClass ma wartość WTSUserName. W ten sposób otrzymasz nazwę użytkownika (jeśli taki istnieje) powiązaną z sesją.

Alternatywnie można ustawić WTSInfoClass na WTSSessionInfo i odzyskać strukturę WTSINFO. Zawiera wiele informacji, w tym nazwę użytkownika i domenę. Spójrz na definicję pliku nagłówkowego WTSINFO, ponieważ strona MSDN jest nieprawidłowa.

Musisz dwukrotnie wywołać WTSEnumerateSessions, aby uzyskać wymagany rozmiar bufora, a następnie jeden raz, aby uzyskać informacje.

Relacje: Jeden lub więcej obiektów Desktop znajduje się w Windows Station. Stacja Windows jest powiązana z sesją.

+0

Dzięki, dobrą propozycję, ale po wypróbowaniu go. podczas gdy mogę wyświetlić listę sesji i skojarzone nazwy użytkowników (jeśli są), nazwa sesji sesji jest zawsze nazwą sesji RDP, a nie nazwą stacji Windows (patrz definicja WTSWinStationName w http://msdn.microsoft.com/en-us/library/ aa383861% 28VS.85% 29.aspx). Gdybym mógł połączyć identyfikator sesji ze stacją Windows, chociaż ta technika byłaby doskonała, ale nie mogę tego znaleźć. – QAZ

+0

@QAZ, który nie działa, każda sesja ma stację okna winsta0, która jest stacją okien, która ma wszystkie widoczne widnows (jedyną inną stacją będącą przedmiotem zainteresowania jest bezpieczny deaktop dla tej sesji). – Joshua

2

Problem polega na tym, że komputery stacjonarne nie są w ogóle kojarzone z użytkownikami. Spróbuj użyć psexec, aby uruchomić Notatnik na koncie SYSTEM. Działa na twojej stacji Windows na twoim pulpicie. W przeciwnym razie nie byłbyś w stanie tego zobaczyć.

Ale jeśli chcesz uzyskać sesję związaną ze stacją okna, to tak, to jest możliwe. Aby uzyskać nazwę obiektu, należy wywołać NtQueryObject z ObjectNameInformation. Na przykład, oto co otrzymuję: \Sessions\1\Windows\WindowStations\WinSta0. Jest twój identyfikator sesji.

+0

dzięki, dobry punkt. Chciałbym móc uzyskać zalogowanego użytkownika na pulpicie, jeśli taki istnieje, co może być użyteczne w połączeniu z odpowiedzią Janglina. Przetestuję jutro i złożę raport. – QAZ

0

To nie jest rozwiązanie, ale jest dobrym opisem stacji/pulpitu. Od http://www.microsoft.com/technet/security/bulletin/fq00-020.mspx

Co to jest stacja Windows? Stacja Windows to bezpieczny kontener zawierający schowek, niektóre informacje globalne i zestaw jednego lub więcej komputerów stacjonarnych. Sesja Windows 2000 będzie miała kilka stacji Windows, jedną przypisaną do sesji logowania użytkownika interaktywnego i innych przypisanych do procesu Winlogon, bezpiecznego procesu wygaszacza ekranu i każdej usługi działającej w kontekście zabezpieczeń innym niż interaktywny użytkownik. Interaktywna stacja okien przypisana do sesji logowania użytkownika interaktywnego zawiera również klawiaturę, mysz i urządzenie wyświetlające. Interaktywna stacja okienna jest widoczna dla użytkownika i może odbierać dane wejściowe od użytkownika. Wszystkie pozostałe stacje okien są nieinteraktywne, co oznacza, że ​​nie mogą być widoczne dla użytkownika i nie mogą odbierać danych wprowadzanych przez użytkownika.

Co to jest pulpit? Pulpit to bezpieczny obiekt kontenerowy, który jest zawarty w stacji okna. W stacji Windows może znajdować się wiele pulpitów. Pulpit ma logiczną powierzchnię wyświetlania i zawiera okna, menu i zaczepy. Tylko pulpity interaktywnej stacji okien mogą być widoczne i odbierane przez użytkownika. W interaktywnej stacji okna aktywny jest tylko jeden komputer na raz. Ten aktywny pulpit, nazywany także pulpitem wejściowym, jest aktualnie widoczny dla użytkownika i odbiera dane wprowadzane przez użytkownika.

+0

Pomaga to wyjaśnić, co zawiera i co wiąże ze sobą – fupsduck

0

Można wyodrębnić go z końca środowisku zmiennym

0

nbtstat%USERPROFILE% używane, aby móc to zrobić z wiersza poleceń, albo z nazwy komputera lub adresu IP. Minęło jednak sporo czasu, odkąd na to patrzyłem.

0

Prawidłowy kod, który pracował dla mnie:

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

Używam programu Visual Studio Express 2012 na Windows 7 x86

Powiązane problemy