Centrum skryptów - Systemy operacyjne

W jaki sposób sprawdzić, który użytkownik ostatnio logował się na komputerze?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób sprawdzić, który użytkownik ostatnio logował się na komputerze?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarzu! Czy można sprawdzić, który użytkownik logował się jako ostatni na danym komputerze?

-- SV

Cześć Skrypciarze! Odpowiedź

Cześć, SV. Wiesz, Skrypciarz piszący te słowa nie ogląda nigdy wiadomości w telewizji. (No dobra, nie licząc wiadomości sportowych.) Nie żeby nie chciał wiedzieć, co się dzieje na świecie – najlepiej posłużmy się przykładem. Zeszłej nocy Skrypciarz piszący te słowa był na siłowni, przykładnie pedałując na ćwiczebnym rowerze. Akurat włączone były wiadomości, a kiedy Skrypciarz podniósł zmęczony wzrok, trafił na reportaż o „porąbanych porywach wiatru” (określenie wymyślone przez reportera), jakie szaleją w całej Europie. Po zaprezentowaniu serii odpowiednio porąbanych ujęć (przedstawiających głównie ludzi i przedmioty miotane przez wiatr), reportaż podsumowano informacją, że 41 osób zginęło wskutek wichur.

Czterdzieści jeden osób zginęło w „porąbanych porywach wiatru”? Dlatego właśnie Skrypciarz piszący te słowa unika telewizyjnych wiadomości. Dlatego też zajmuje się pisaniem codziennych artykułów z serii Cześć Skrypciarze! – są one wystarczająco porąbane, ale nie ma tu zgonów.

A przynajmniej nie aż tyle zgonów.

I tak, oto skrypt podający nazwę użytkownika, który jako ostatni zalogował się na komputerze, a przy tym nie przysparza nikomu cierpień.

A jeśli przysparza, to nie są one długotrwałe:

Const HKEY_LOCAL_MACHINE = &H80000002



strComputer = "."

 

Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

 

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon"

strValueName = "DefaultUserName"



objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue



Wscript.Echo strValue

Jak się okazuje, każde logowanie użytkownika na komputerze wiąże się z zapisaniem jego nazwy w rejestrze; dokładnie biorąc, nazwa ta zapisywana jest w katalogu HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\DefaultUserName. (W ramach bonusu komputer zapisuje w tym samym kluczu nazwę domeny użytkownika, używając do tego wartości DefaultDomainName.) Jeśli będziemy chcieli sprawdzić nazwę użytkownika, który jako ostatni zalogował się na komputerze, wystarczy, że odczytamy wartość DefaultUserName.

Przyznajmy jednak, iż nie mamy stuprocentowej gwarancji, że się to uda - wartość DefaultUserName można zmodyfikować, a nawet usunąć. Teoretycznie, użytkownik o nazwie kenmyer mógłby zalogować się na komputerze, a następnie zmienić wartość użytkownika domyślnego na, powiedzmy, pilarackerman. Obstawiamy jednak, że sytuacje takie nie zdarzają się zbyt często i że nasze rozwiązanie zadziała w ogromnej większości wypadków.

Co nie tak często zdarza się Skrypciarzowi piszącemu te słowa.

Uwaga. Czy oznacza to, że za pomocą tego samego skryptu można określić, kto jest obecnie zalogowany na komputerze? To możliwe, przy założeniu, że ktoś istotnie jest zalogowany; wartość DefaultUserName nie zmienia się po wylogowaniu użytkownika. Aby zobaczyć, czy ktoś jest w danym momencie zalogowany, można sprawdzić, czy uruchomiony jest proces Explorer.exe, a jeśli tak, określić jego właściciela. Ale to temat na osobny artykuł.

Jak widać, nasz skrypt rozpoczyna się zdefiniowaniem stałej o nazwie HKEY_LOCAL_MACHINE, której wartość wynosi &H80000002; zmienna ta podaje standardowemu dostawcy rejestru WMI nazwę gałęzi, która nas interesuje. Po zdefiniowaniu stałej łączymy się z usługą WMI na komputerze lokalnym, a dokładnie z przestrzenią nazw root\default namespace (nie używamy częściej stosowanej przestrzeni nazw root\cimv2). Zwróćmy uwagę, że moglibyśmy bez trudu połączyć się z usługą WMI na komputerze zdalnym - wystarczyłoby przypisać zmiennej strComputer nazwę komputera zdalnego:

strComputer = "atl-fs-01"

Po połączeniu się z usługą WMI przypisujemy wartości dwóm zmiennym: zmienna strKeyPath otrzymuje ścieżkę rejestru wewnątrz HKEY_LOCAL_MACHINE, natomiast zmienna strValueName przybiera wartość pozycji rejestru, którą chcemy odczytać(czyli DefaultUserName). Następnie używamy metody GetStringValue do odczytania rejestru i zapisania w parametrze wyjściowym strValue nazwy ostatniego użytkownika, który się zalogował na komputerze:

objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
Uwaga. Co oznacza „parametr wyjściowy”? Otóż jest to zmienna, którą przekazujemy do wykorzystania w metodzie. Zwróćmy uwagę, że strValue to ostatni parametr podany metodzie GetStringValue. Metoda ta może teraz przypisać wartość interesującej nas zmiennej. W tym wypadku chodzi oczywiście o wartość DefaultUserName.

Teraz musimy jeszcze wywołać echo zmiennej strValue – i gotowe:

Wscript.Echo strValue

Przy okazji, jeśli będziemy chcieli uzyskać dodatkowo nazwę domeny, to mamy tu skrypt, który nam to umożliwi:

Const HKEY_LOCAL_MACHINE = &H80000002



strComputer = "."

 

Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

 

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon"



strValueName = "DefaultUserName"

objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue



Wscript.Echo strValue



strValueName = "DefaultDomainName"

objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue



Wscript.Echo strValue

Zauważmy na zakończenie, że artykuły z serii Cześć Skrypciarzu! wychodzą już od dwóch i pół roku, a z tego co wiemy, nikt jeszcze od ich czytania nie umarł. (Widzicie? Mówiliśmy, że nie można się zanudzić na śmierć.) Przyznajemy, że lekarze zwracają uwagę, iż jeden ze Skrypciarzy, Peter Costantini, od lat znajduje się w stanie stuporu. Jednak ta sprawa także jest kontrowersyjna – Peter utrzymuje, że na żaden stupor nie cierpi, ale lekarze się z nim nie zgadzają. Reszta Skrypciarzy odmawia wszelkich komentarzy, choć wątpimy, aby Peterowi robiło to jakąkolwiek różnicę.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne