Windows: dowiadujemy się, kto jest zalogowany

Windows: dowiadujemy się, kto jest zalogowany
— Ojej, nic mi nie działa, pomóżcie!
— Nie martw się, zaraz wszystko naprawimy. Podaj nazwę komputera…
(klasyka gatunku z rozmów do wsparcia technicznego)

Dobrze, jeśli masz narzędzie typu BgInfo lub Twoi użytkownicy znają skrót Windows+Pause/Break i potrafią go użyć. Zdarzają się nawet rzadkie przypadki, które zdążyły nauczyć się nazwy swojego komputera. Ale często poza swoim głównym problemem, dzwoniący ma także drugi: dowiedzieć się nazwy/adresu IP komputera. I często rozwiązanie tego drugiego problemu zajmuje znacznie więcej czasu, niż pierwszego (a tak naprawdę trzeba było tylko zmienić tapetę lub przywrócić znikającą ikonę :().
A znacznie przyjemniej usłyszeć coś w stylu:
— Tatiano Siergiejewna, nie martwcie się, już się łączę…


A do tego nie potrzeba wiele.
Specjaliście wsparcia technicznego wystarczy tylko nauczyć się na pamięć nazwy maszyn i pamiętać, kto na jakiej pracuje.
Przed opisaniem rozwiązania, którego teraz używamy, krótko omówię inne opcje, aby skrytykować je w puch i wyjaśnić swój wybór.

  1. BgInfo, Desktop Info i im podobne. Jeśli masz dużo pieniędzy, są też płatne. Chodzi o to, że na desktopy wyświetlana jest techniczna informacja: nazwa maszyny, adres IP, login itd. W Desktop Info można nawet na połowie ekranu pokazać wykresy wydajności.
    Nie podoba mi się to, że dla tego samego BgInfo użytkownik musi minimalizować okna, aby zobaczyć potrzebne dane. Zauważyliśmy z kolegami nie jeden raz u BgInfo charakterystyczny artefakt, gdy nowy tekst pojawia się na starym.
    Niektórych użytkowników irytuje fakt, że administratorzy malują przerażające 192.168.0.123 na mordce rozciągniętego na pulpicie kotka, psując estetykę tła, i oczywiście, to strasznie demotywuje i całkowicie zabija chęć do pracy.
  2. Skrót typu „Kim jestem” (nie próbujcie dodawać znaku zapytania na końcu :). Klasyczny skrót na pulpicie, za którym kryje się schludny lub mniej schludny skrypt, wyświetlany w formie okna dialogowego. Czasami zamiast skrótu na pulpicie kładzie się sam skrypt, co moim zdaniem jest nietaktem.
    Minusem jest to, że aby uruchomić skrót, jak w pierwszym przypadku, trzeba zminimalizować wszystkie otwarte okna (nie bierzemy pod uwagę faworytów losu, którzy mają na swoim komputerze otwarte tylko jedno okno z pasjansem). A tak przy okazji, czy twoi użytkownicy wiedzą, gdzie należy kliknąć, aby zminimalizować wszystkie okna? Właściwie, palcem w oko administratorowi.

Także kapitan podpowiada, że w obu opisanych powyżej metodach głównym minusem jest to, że w uzyskaniu informacji uczestniczy użytkownik, który może być nieco ślepy, głupi i w ogóle skłamać.
Nie będę rozważał opcji z podniesieniem umiejętności komputerowych, kiedy wszyscy wiedzą, gdzie w Windows znaleźć nazwę swojego komputera: to szlachetna sprawa, ale bardzo trudna. A jeśli w firmie jest rotacja kadrowa, to w ogóle akuratne. Co tu mówić, w większości przypadków nawet swojego loginu nie pamiętają.

Wylałem duszę, a teraz do rzeczy.
Inspiracją była idea jednego z użytkowników Habr. średni z tego artykułu.
Istota pomysłu polega na tym, że przy logowaniu użytkownika do Windows skrypt logon wpisuje potrzebne informacje (czasu i nazwę komputera) w określony atrybut konta użytkownika. A przy wylogowaniu działa analogiczny skrypt logoff.

Pomysł mi się podobał, ale w realizacji coś mnie nie zadowoliło.

  1. Zasada polityki grupowej, w której zapisane są skrypty logon i logoff dla użytkowników, stosowana jest w całej domenie, więc skrypty będą działać na każdej maszynie, na którą logują się użytkownicy. Jeśli oprócz stacji roboczych używane są rozwiązania terminalowe (na przykład Microsoft RDS lub produkty Citrix), takie podejście będzie niewygodne.
  2. Dane wpisywane są w atrybucie Department konta użytkownika, do którego zwykły użytkownik ma dostęp tylko do odczytu. Oprócz atrybutu konta użytkownika, skrypt również wprowadza zmiany w atrybucie Department konta komputera, który standardowo użytkownicy również nie mogą zmieniać. Dlatego aby rozwiązanie działało, autor proponuje zmienić standardowe ustawienia zabezpieczeń dla obiektów AD.
  3. Format daty zależy od ustawień lokalizacji na końcowej maszynie, więc z jednej maszyny możemy uzyskać 10 listopada 2018 o 14:53, a z innej 11/10/18 o 14:53.

Aby wyeliminować te niedogodności, zrobiono coś takiego.

  1. GPO jest powiązane nie z domeną, a z OU z maszynami (dzielę użytkowników i maszyny na różne OU i innym również to polecam). W tym przypadku dla trybu przetwarzania polityki loopback ustawiony jest tryb merge.
  2. Skrypt będzie wprowadzać dane tylko do konta użytkownika w atrybucie Info, który użytkownik może zmieniać samodzielnie dla swojego konta.
  3. Zmieniony został fragment kodu generujący wartość atrybutu

Teraz skrypty wyglądają następująco:
SaveLogonInfoToAdUserAttrib.vbs

On Error Resume Next
Set wshShell = CreateObject("WScript.Shell")
strComputerName = wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
Set adsinfo = CreateObject("ADSystemInfo")
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
strMonth = Month(Now())
If Len(strMonth) < 2 then
  strMonth = "0" & strMonth
End If
strDay = Day(Now())
If Len(strDay) < 2 then
  strDay = "0" & strDay
End If
strTime = FormatDateTime(Now(),vbLongTime)
If Len(strTime) < 8 then
  strTime = "0" & strTime
End If
strTimeStamp = Year(Now()) & "/" & strMonth & "/" & strDay & " " & strTime
oUser.put "info", strTimeStamp & " " & " @ " & strComputerName
oUser.Setinfo

SaveLogoffInfoToAdUserAttrib.vbs

On Error Resume Next
Set wshShell = CreateObject("WScript.Shell")
strComputerName = wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
Set adsinfo = CreateObject("ADSystemInfo")
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
strMonth = Month(Now())
If Len(strMonth) < 2 then
  strMonth = "0" & strMonth
End If
strDay = Day(Now())
If Len(strDay) < 2 then
  strDay = "0" & strDay
End If
strTime = FormatDateTime(Now(),vbLongTime)
If Len(strTime) < 8 then
  strTime = "0" & strTime
End If
strTimeStamp = Year(Now()) & "/" & strMonth & "/" & strDay & " " & strTime
oUser.put "info", strTimeStamp & " " & " @ " & strComputerName
oUser.Setinfo

Kto pierwszy znajdzie wszystkie różnice między skryptami logon a logoff, ten zyskuje punkty karmy. 🙂
Dla uzyskania przejrzystych informacji stworzony został taki mały skrypt PS:
Get-UsersByPCsInfo.ps1

$OU = "OU=MyUsers,DC=mydomain,DC=com"
Get-ADUser -SearchBase $OU -Properties * -Filter * | Select-Object DisplayName, SamAccountName, info | Sort DisplayName | Out-GridView -Title "Informacje o logonach" -Wait

W sumie wszystko ustawia się w prosty sposób:

  1. tworzymy GPO z odpowiednimi ustawieniami i łączymy je z jednostką organizacyjną, w której znajdują się stacje robocze użytkowników:
    Windows: dowiadujemy się, kto jest zalogowany
  2. idziemy pić herbatę (jeżeli AD ma dużą liczbę użytkowników, to herbaty potrzebujemy dużo 🙂
  3. uruchamiamy skrypt PS i uzyskujemy wynik:
    Windows: dowiadujemy się, kto jest zalogowany
    W górnej części okna znajduje się wygodny filtr, w którym można wybierać dane według wartości jednego lub kilku pól. Kliknięcie w kolumny tabeli sortuje rekordy według wartości odpowiednich pól.

Możemy ładnie «opakować» nasze rozwiązanie.
Windows: dowiadujemy się, kto jest zalogowany
W tym celu dodamy skrót do uruchamiania skryptu dla specjalistów wsparcia technicznego, który w polu „obiekt” będzie miał coś takiego:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File "servershareScriptsGet-UsersByPCsInfo.ps1"

Jeśli jest dużo pracowników wsparcia technicznego, można rozdać skrót za pomocą GPP.

Kilka uwag na koniec.

  • Na maszynie, z której uruchamiany jest skrypt PS, powinien być zainstalowany moduł Active Directory dla PowerShell (wystarczy dodać narzędzia administracyjne AD w komponentach Windows).
  • Większość atrybutów swojego konta użytkownik nie może edytować domyślnie. Weź to pod uwagę, jeśli zdecydujesz się użyć atrybutu innego niż Info.
  • Poinformuj wszystkich zaangażowanych kolegów o tym, jaki atrybut zamierzasz użyć. Na przykład ten sam Info jest używany do interaktywnego dodawania notatek do skrzynki użytkownika w panelu administracyjnym Exchange Server i ktoś łatwo może go nadpisać, albo zasmucić się, gdy dodana przez niego informacja zostanie zastąpiona przez twój skrypt.
  • Jeśli masz wiele witryn Active Directory, uwzględnij opóźnienia replikacji. Na przykład, jeśli chcesz uzyskać aktualne informacje o użytkownikach z witryny AD A, a uruchamiasz skrypt z maszyny w witrynie AD B, można to zrobić w ten sposób:
    Get-ADUser -Server DCfromSiteA -SearchBase $OU -Properties * -Filter * | Select-Object DisplayName, SamAccountName, info | Sort DisplayName | Out-GridView -Title "Informacje o logonach" -Wait

    DCfromSiteA — nazwa kontrolera domeny witryny A (domyślnie polecenie Get-AdUser łączy się z najbliższym kontrolerem domeny)

Windows: dowiadujemy się, kto jest zalogowany

Źródło obrazków

Będę wdzięczny, jeśli wypełnisz krótką ankietę poniżej.

Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. Zaloguj się, proszę.

Z czego korzystasz?

  • bginfo, Desktop info itd. (darmowe oprogramowanie)

  • płatne odpowiedniki bginfo

  • zrobię tak, jak w artykule

  • nieaktualne, ponieważ używam VDI/RDS itd.

  • na razie nic nie używam, ale się nad tym zastanawiam

  • nie potrzebuję zbierać takich danych

  • inne (podziel się w komentarzach)

Zagłosowało 112 użytkowników. Wstrzymało się 39 użytkowników.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster