Centrum skryptów - Systemy operacyjne

Jak można sprawdzić datę ostatniego logowania?

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.

Jak można sprawdzić datę ostatniego logowania?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Kiedy przyszedłem dziś rano do pracy, mój komputer był uruchomiony i użytkownik zalogowany. Oczywiście mam wygaszacz ekranu z funkcją wyświetlania ekranu powitalnego i pulpit był zablokowany, ale wydaje mi się, że przed wyjściem z pracy wylogowałem się i wyłączyłem komputer. No i teraz mam obawy, czy ktoś nie logował się na moim komputerze. Słyszałem o dziennikach zabezpieczeń i innych tego typu tworach, ale… Pytanie jest proste. W innych znanych mi systemach operacyjnych mogłem sprawdzić datę ostatniego logowania. A skoro one mogły to zrobić, system Windows najpewniej również oferuje taką możliwość, prawda?

- TW

Cześć Skrypciarze! Pytanie

Cześć, TW, A zatem zamartwiasz się, ponieważ nie możesz sobie przypomnieć, czy wyłączyłeś komputer ostatniego wieczoru. Nie wiem, czy będzie to dla Ciebie jakiekolwiek pocieszenie, ale też czasami nie pamiętam, czy wyłączyłem swój komputer. Moja pierwsza myśl po przeczytaniu tego listu była następująca: "możemy przejrzeć dziennik zabezpieczeń i poszukać nieudanych prób logowania albo zajrzeć do dziennika systemu i zlokalizować operacje ponownego uruchomienia". Jednak podkreśliłeś, że chcesz po prostu wiedzieć, kiedy ostatnio logowałeś się na komputerze.

Najłatwiejszym sposobem zrealizowania tego celu jest stworzenie skryptu, który zapisuje aktualny czas w rejestrze, a następnie umieszczenie tego skryptu w grupie Startup odpowiedniego profilu. Za każdym razem, gdy zalogujemy się na komputerze, skrypt pobierze czas z rejestru i wyświetli pobraną wartość. Następnie zaktualizuje przechowywaną w rejestrze informację o czasie logowania przy użyciu aktualnego czasu komputera. Oczywiście rozwiązanie to nie stanowi zabezpieczenia, ale odpowiada na powyższe pytanie i prawdopodobnie może pomóc w przypadku problemów z pamięcią... ale o czym to ja mówiłem?

A tak. Nasza odpowiedź składa się z dwóch części: pierwszą stanowi sam skrypt, a drugą skrót do skryptu PowerShell, który umieszczamy w grupie Startup naszego profilu. Najpierw skrypt:

$command = "LastLogon"

$scriptKey = "hkcu:\software\scripting\$command"



if(test-path -path $scriptKey)

{

$newdte = (get-date).tostring()

$dte = (get-itemproperty -path $scriptKey -name date).date

set-ItemProperty -path $scriptKey  -name date -value $newdte  | out-null

"

Your  $command was $dte

"

}

else

{

"You have no record of $command."

$dte = (get-date).tostring()

new-item -path $scriptKey  -force | out-null

new-itemproperty -path $scriptKey -name date -value $dte | out-null

}

Skrypt rozpoczynamy od stworzenia kilku zmiennych. W pierwszej zmiennej $ command przechowujemy ciąg reprezentujący dokumentowaną akcję polecenia. Dlaczego? Ponieważ podstawową filozofią Skrypciarzy jest "Ekologiczne podejście do skryptowania". Dlaczego ekologiczne? Ponieważ propaguje: ograniczanie, poddawanie recyklingowi i wielokrotne wykorzystanie. Ograniczenie ilości pisanego kodu poprzez poddawanie recyklingowi istniejącego kodu oraz wykorzystanie funkcji i procedur znajdujących się w innych skryptach. A zatem pisząc ten skrypt, mamy na uwadze fakt, iż możemy w przyszłości chcieć użyć go do dokumentowania czasu wykonania innych poleceń. W takiej sytuacji wystarczy zmodyfikować wartość zmiennej $ command. Druga stworzona przez nas zmienna wskazuje miejsce w rejestrze, w którym ma być przechowywana odpowiednia informacja. Wybieramy ścieżkę HKEY_CURRENT_USER\Software i tworzymy własny klucz o nazwie scripting. Do tego celu służą nam następujące dwa polecenia:

$command = "LastLogon"

$scriptKey = "hkcu:\software\scripting\$command"

Gdy użytkownik zaloguje się na komputerze, uruchomiony skrypt musi zweryfikować istnienie odpowiedniego klucza przy pomocy cmdletu Test-Path. Jeśli klucz istnieje, używamy cmdletu Get-Date i konwertujemy zwróconą przez niego wartość do typu String przy pomocy metody tostring. Następnie umieszczamy ciąg w zmiennej o nazwie $newdte. Po uzyskaniu aktualnej daty wykorzystujemy cmdlet Get-ItemProperty do odczytania wartości daty z rejestru i przechowania jej w zmiennej o nazwie $dte. Następnie zapisujemy w rejestrze datę przechowywaną w zmiennej $newdte przy pomocy cmdletu Set-ItemProperty i wyświetlamy komunikat informujący, kiedy nastąpiło ostatnie logowanie. Komunikat ten został zaprezentowany poniżej:

Do sprawdzenia danych w rejestrze, zaktualizowania rejestru oraz wyświetlenia komunikatu o logowaniu służy następujący kod:

if(test-path -path $scriptKey)

{

$newdte = (get-date).tostring()

$dte = (get-itemproperty -path $scriptKey -name date).date

set-ItemProperty -path $scriptKey  -name date -value $newdte  | out-null

"

Your  $command was $dte

"

}

Inny scenariusz stosujemy podczas uruchamiania skryptu po raz pierwszy. W tym przypadku klucz w rejestrze jeszcze nie istnieje, a zatem nie ma żadnej wartości do wyświetlenia. Naszym zadaniem jest przechowanie aktualnej daty, stworzenie klucza rejestru i wyświetlenie odpowiedniego powiadomienia. Na początku musimy przechwycić aktualną datę i czas. Do tego celu służy nam wykorzystywana już wcześniej linia kodu. Wartość zwróconą przez cmdlet Get-Date przekształcamy w następujący sposób:

$dte = (get-date).tostring()

Następnie musimy stworzyć klucz rejestru oraz wpisać w nim przechwyconą wartość daty i czasu. Utworzony przez nas klucz rejestru będzie wyglądał podobnie do pokazanych poniższej ustawień:

Aby dodać klucz rejestru i skonfigurować jego wartość, musimy najpierw utworzyć klucz, a następnie powiązaną z nim właściwość. Do stworzenia klucza rejestru wykorzystujemy cmdlet New-Item wraz ze ścieżką do klucza. Następnie przy pomocy cmdletu New-ItemProperty tworzymy właściwość date. Zadanie to realizują następujące dwie linie kodu:

new-item -path $scriptKey  -force | out-null

new-itemproperty -path $scriptKey -name date -value $dte | out-null

Ponieważ musimy poinformować użytkownika, że żadna wartość nie została przechowana w rejestrze, wyświetlamy następujący komunikat:

"You have no record of $command."

Uruchomienie tego polecenia powoduje pojawienie się na ekranie poniższego komunikatu:

Po złożeniu omawiany fragment kodu wygląda następująco:

else

{

"You have no record of $command."

$dte = (get-date).tostring()

new-item -path $scriptKey  -force | out-null

new-itemproperty -path $scriptKey -name date -value $dte | out-null

}

Aby wszystko to stało się możliwe, musimy użyć pewnego triku, a mianowicie stworzyć skrót służący do uruchamiania skryptu. Najłatwiejszy sposób tworzenia skrótu polega na przejściu do folderu Startup w wybranym profilu, kliknięciu go prawym klawiszem myszy i wybraniu opcji New Shortcut (Nowy skrót) . Po określeniu ścieżki do skryptu i kliknięciu przycisku OK otrzymujemy skrót do skryptu. Problem polega na tym, że domyślnie pliki skryptów PowerShell są powiązane z Notatnikiem. W związku z tym zalogowanie się spowoduje wyświetlenie skryptu w Notatniku. Nie całkiem o to nam chodziło.

Aby zmienić to domyślne zachowanie, musimy skonfigurować wykonywanie skryptu w powłoce PowerShell. W tym celu otwieramy Properties (Właściwości) skrótu, przechodzimy do karty Shortcut (Skrót) i edytujemy pole Target (Element docelowy), wpisując wartość PowerShell.exe -noexit -noprofile przed ścieżką do naszego skryptu. Dzięki temu program PowerShell uruchomi skrypt, pozostawi okno PowerShell otwarte i nie będzie wykorzystywać naszego profilu. Jeśli chcecie załadować własny profil, możecie usunąć polecenie -noprofile. Jeśli potraficie czytać bardzo, bardzo szybko, możecie nawet usunąć przełącznik -noexit - tylko pamiętajcie o niemruganiu w czasie działania skryptu. Poniższy rysunek prezentuje trik, który sprawia, że skrót powoduje wykonanie skryptu PowerShell:

Mam nadzieję TW, że ten skrypt pomoże Ci w zapamiętywaniu, czy wylogowałeś się przed wyjściem do domu. Teraz już wiem, jak nie zapomnieć o kolejnej rocznicy ślubu...

Ed Wilson i Craig Liebendorfer, Skrypciarze

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne