Centrum skryptów - Systemy operacyjne

Co zrobić, aby wylogować użytkownika po pięciu minutach bezczynności?

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.

Co zrobić, aby wylogować użytkownika po pięciu minutach bezczynności?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Co zrobić, aby wylogować użytkownika po pięciu minutach bezczynności?

-- CS

Cześć Skrypciarze! Odpowiedź

Cześć, CS. Z całą pewnością nasi czytelnicy zastanawiają się, czemu Skrypciarze tak się ekscytują Olimpiadą Skrypciarską (12-23 lutego). O co chodzi – czy dostają bonus do pensji za każdego uczestnika?

Nie byłby to wcale zły pomysł… Jednak okazuje się, że przyczyny naszego podekscytowania są inne. Otóż, po pierwsze, olimpiada jest fajna; oraz, po drugie, co najmniej dwóch Skrypciarzy uwielbia współzawodnictwo, nawet jeśli w nim nie uczestniczą.

Poza tym, mamy szansę zabawić się w Świętych Mikołajów, rozdając laleczki doktora Scripto i egzemplarze książki Windows PowerShell in Action.

Ale najistotniejszy powód, dla którego tak promujemy Olimpiadę, jest boleśnie prozaiczny. Otóż mamy dość sytuacji, w której Wy zadajecie pytania, a my musimy na nie odpowiadać i postanowiliśmy ją odwrócić!

Plan ten jednak nie wypalił – w końcu musieliśmy też opracować rozwiązania na zadane pytania, a w dodatku napisać oficjalny harmonogram Olimpiady Skrypciarskiej (j.ang.) oraz artykuł szkoleniowy (j.ang.). A perspektywa na najbliższe tygodnie to przeglądanie setek nadesłanych skryptów…

No cóż. Za późno już, żeby odwołać Olimpiadę, więc musimy sobie radzić. Tymczasem przedstawiamy skrypt mogący wylogować użytkownika po 5 minutach bezczynności:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set objEventSource = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'")



Do While True

    Set objEventObject = objEventSource.NextEvent()

    If Right(objEventObject.TargetInstance.Name, 4) = ".scr" Then

        Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

        For Each objItem in colItems

            objItem.Win32Shutdown(4)

        Next

    End If

Loop

Zanim wyjaśnimy, jak on działa, przyznamy się do pewnego oszustwa. Dosyć często słyszymy pytania z serii: jak sprawić, aby komputer zrobił coś po pewnym czasie bezczynności? Mogłoby to być bardzo przydatne, ale przy pomocy skryptu ciężko określić, czy komputer faktycznie jest bezczynny, czy nie. Dlatego też nawet nie próbowaliśmy określać tego używając skryptu. Nasz trik polega na tym, że komputer sam sprawdzi, czy jest bezczynny, czy nie.

Jak to zrobić? No cóż, nasz skrypt zakłada, że wygaszacz ekranu został skonfigurowany tak, by włączać się po 5 minutach bezczynności. Tak więc wystarczy sprawdzić, czy na komputerze działa wygaszacz, a jeśli tak, to wylogować użytkownika.

Innymi słowy, nasze motto to: „Niech zajmie się tym ktoś inny”.

Ale jak określić, czy wygaszacz jest włączony? Otóż, jak widzimy, skrypt zaczyna swoje działanie od połączenia się z usługą WMI komputera lokalnego (oczywiście równie dobrze można się połączyć z komputerem zdalnym). Następnie włączamy kwerendę powiadomień o zdarzeniach, która co 10 sekund tworzy listę uruchomionych procesów:

Set objEventSource = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'")
Uwaga. Osobom, które nie znają się zbyt dobrze na zdarzeniach WMI i kwerendach powiadomień o zdarzeniach polecamy ten webcast Skrypciarzy.

Po wysłaniu kwerendy uruchamiamy pętlę Do While, skonfigurowaną tak, aby działać bez końca. Wewnątrz pętli poniższy wiersz kodu wstrzymuje dalsze działanie skryptu, dopóki kwerenda powiadomień o zdarzeniach nie zgłosi jakiegoś powiadomienia:

Set objEventObject = objEventSource.NextEvent()

Wiersz ten „zawiesza” skrypt – nie wykonuje on żadnych nowych czynności, dopóki kwerenda o czymś nie poinformuje. W naszym wypadku kwerenda co 10 sekund (częstotliwość ustawia klauzula WITHIN 10) zbiera listę uruchomionych procesów i przekazuje ją do skryptu.

Naszym zadaniem jest teraz sprawdzić, czy wśród uruchomionych procesów znajduje się wygaszacz ekranu. Możemy to zrobić, włączając pętlę, która przejdzie przez całą kolekcję, sprawdzając, czy właściwość Name (czyli nazwa pliku) któregoś z nich nie kończy się na .scr. Odpowiada za to poniższy wiersz kodu:

If Right(objEventObject.TargetInstance.Name, 4) = ".scr" Then

Jak widać, używamy tu funkcji Right, która sprawdza ostatnie cztery znaki nazwy pliku. Jeśli znaleziony zostanie ciąg .scr (jak np. w ssstars.scr), zakładamy, że wygaszacz ekranu jest włączony.

Uwaga. Jeśli ktoś jakimś trafem zapomniał, przypominamy, że w Centrum Skryptów można pobrać skrypciarski wygaszacz.

Załóżmy, że wygaszacz jest akurat włączony. W takim wypadku uruchamiamy drugą kwerendę QMI, która ma za zadanie połączyć się z klasą Win32_OperatingSystem:

Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

Kwerenda ta zwraca kolekcję, zawierającą jeden element – system operacyjny uruchomiony obecnie na komputerze. Możemy teraz uruchomić pętlę For Each, która przejdzie przez naszą kolekcję, wywołując metodę Win32Shutdown:

objItem.Win32Shutdown(4)

Jeśli ktoś się zastanawia, to liczba 4 instruuje metodę Win32Shutdown, by wymusić wylogowanie. Gdybyśmy woleli zrestartować lub wyłączyć komputer, również nie ma problemu. Odpowiednie parametry metody Win32Shutdown wymienione są w przewodniku Microsoft Windows 2000 Scripting Guide (j.ang.).

I już gotowe. Jak mówiliśmy, trzeba było uciec się do oszustwa, ale ważne, że działa.

Teraz pytanie za 3 grosze: skoro Skrypciarze oszukiwali, to czy wolno oszukiwać na Olimpiadzie Skrypciarskiej? No cóż, nie tylko wolno. Wręcz do tego zachęcamy – można używać wszelkich możliwych metod, by ukończyć zadania. I tak np. w wypadku konkurencji dla początkujących (j.ang.) można wygrzebać w Centrum Skryptów gotowe skrypty, które rozwiążą niektóre problemy – wystarczy je skopiować i wkleić. Nie przyznajemy punktów za oryginalność czy kreatywność, a jedynie za to, że skrypt działa.

Jeszcze ciekawsze jest to, że nagrodę można wygrać nawet za rozwiązania, które nie działają. Wystarczy się zapisać i przesłać nam cokolwiek. Teraz już wiecie, za co Skrypciarze kochają Olimpiadę.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne