www.SAMURAJ-cz.com 

18.12.2017 Miloslav Translate to English by Google     VÍTEJTE V MÉM SVĚTĚ

Články

Powershell - poslední přihlášení počítače či uživatele

Úterý, 06.09.2011 14:44 | Samuraj - Petr Bouška |
V určitých situacích se nám může hodit, nalézt k počítačům či uživatelům v doméně informaci, kdy se naposledy přihlásili. Jednou z běžných situací je, že hledáme nepoužívané účty. Nebo naopak chceme nalézt, jak dlouho již počítač běží. Popíšeme si zde nějaké možnosti pomocí PowerShellu. První situace je relativně jednoduchá (pokud akceptujeme nějaké problémy) a informace získáme z Active Directory. V druhém případě již musíme přistupovat na jednotlivé počítače.

Když se podíváme na atributy počítačového účtu (které můžeme získat pomocí PowerShellu), tak vidíme řadu zajímavých hodnot.

Import-Module ActiveDirectory
Get-ADComputer -Identity <jmeno-pocitace> -Properties *

Počítačový nebo uživatelský účet v Active Directory má atribut lastLogonTimestamp. Tato hodnota říká, kdy se naposledy přihlásil počítač nebo uživatel do domény. Bohužel, ale tato hodnota není přesná pro (defaultně) hodnoty kratší 14 dnů. Je to z principu fungování, vždy při přihlášení se hodnota přečte a zkontroluje, jestli není starší než current_time - msDS-LogonTimeSyncInterval, pokud ano, tak se aktualizuje. Defaultně je msDS-LogonTimeSyncInterval 14 dní mínus náhodné číslo do 5 dnů. Hodnota lastLogonTimestamp je replikovaná mezi doménovými řadiči.

Hodnota msDS-LogonTimeSyncInterval je nastavena na doméně a můžeme si ji prohlédnout/změnit pomocí Active Directory Users and Computers (pravým tlačítkem na jméno domény - Properties - Attribute Editor). Pokud je zde hodnota not-set, tak to znamená, že je to defaultních 14 dní. Pokud zadáme hodnotu menší než 5, tak se neodečítá náhodná hodnota, pokud zadáme 0, tak se vypne používání lastLogontimeStamp. Vše je takto nastaveno proto, aby se nereplikovalo příliš mnoho dat. V menších prostředích to ale není problém.

Pokud použijeme PowerShell příkaz Get-ADComputer (zajímavé je, že tento příkaz nám vrací i IP adresu, což není atribut počítačového účtu, patrně se berou údaje z DNS), tak můžeme vrátit hodnotu atributu lastLogonTimestamp typu System.Int64 nebo převedenou podle aktuálního časového pásma na datum z atributu LastLogonDate (typ System.DateTime).

Get-ADComputer -Identity <jmeno-pocitace> -Properties * | FT Name, LastLogonDate, LastLogon, lastLogonTimestamp, IPv4Address

Pak máme ještě atribut lastLogon, ten obsahuje skutečný čas posledního přihlášení, ale není replikovaný, takže bychom se museli zeptat všech DC a vzít nejnovější hodnotu. Je uložen také jako číslo a můžeme jej převést na datum pomocí funkce.

[DateTime]::FromFileTime([Int64]::Parse((Get-ADComputer -Identity <jmeno-pocitace> -Properties lastLogon).lastLogon))

Pokud chceme najít účty, které se delší dobu nepřihlásili, tak nám většinou stačí hodnota lastLogonTimestamp, pokud nám stačí hodnoty starší 14 dní. Například následujícím způsobem můžeme hledat počítače, které se nepřihlásili déle než 30 dní.

$ldate = [DateTime]::Now - [TimeSpan]::Parse("30")
Get-ADComputer -Filter { lastLogonTimestamp -le $ldate } -Properties * | FT Name, LastLogonDate, Enabled, LockedOut -AutoSize

Pokud bychom dělali podrobnější pokusy, tak můžeme narazit na to, že některé účty se nám ve výstupu nezobrazí. Jsou to takové, které se nikdy nepřihlásili a jejich hodnota lastLogonTimestamp je prázdná, což asi nastane spíše u uživatelských účtů. Nevím proč, ale ve filtru nelze porovnávat null hodnotu, takže musíme předchozí příkaz trochu přepsat.

$ldate = ([DateTime]::Now - [TimeSpan]::Parse("30")).ToFileTime() 
Get-ADComputer -Filter * -Properties * | Where-Object { ($_.lastLogonTimestamp -le $ldate) -or ($_.lastLogonTimestamp -eq $null) } | FT Name, LastLogonDate, Enabled, LockedOut -AutoSize

Máme tady ještě jednodušší možnost pomocí příkazu Search-ADAccount, ale tento příkaz nám nevrátí všechny atributy.

Search-ADAccount -ComputersOnly -AccountInactive -TimeSpan "30" | FT Name, LastLogonDate, Enabled, LockedOut -AutoSize

Pokud chceme najít čas, kdy naposledy počítač nabootoval, tak nemůžeme použít ani hodnotu lastLogonTimestamp ani lastLogon, protože k autentizaci počítače dochází i za jeho běhu. Hodnota, kdy naposledy nastartoval počítač, se asi nachází pouze na něm. Můžeme ji získat třeba pomocí WMI.

[System.DateTime]::ParseExact((Get-WmiObject -Class Win32_OperatingSystem -ComputerName <jmeno-pocitace>).LastBootUpTime.split('.')[0],'yyyyMMddHHmmss',$null)

Můžeme pak například udělat test, který prochází počítače z daného kontejneru v AD, otestuje, zda je počítač zapnutý, a pokud ano, tak zjistí datum posledního startu.

Get-ADComputer -Filter * -SearchBase "OU=Pocitace,DC=firma,DC=local" | 
  ForEach-Object { 
    $str = $_.Name + ", " 
    if(Test-Connection -ComputerName $_.Name -Count 1 -Quiet) { 
      $str += "running, "
      $str += [System.DateTime]::ParseExact((Get-WmiObject -Class Win32_OperatingSystem -ComputerName $_.Name).LastBootUpTime.split('.')[0],'yyyyMMddHHmmss',$null) 
    }
    $str
  }
zobrazeno: 11231krát | Komentáře [4]

Autor:

Související články:

PowerShell

Články týkající se Microsoft skriptovacího jazyku PowerShell, který se používá ve všech nových verzích MS OS a aplikací.

Pokud se Vám článek líbil, tak mne potěšíte, když uložíte odkaz na některý server:

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže. Pokud chcete poradit s nějakým problémem či diskutovat na nějaké téma, tak použijte fórum.

Komentáře

  1. [1] Ondrej

    Dobry den, mozna jsem prehledl .... nicmene lze pomoci podobneho powershell scriptu ziskat vypis vsech pocitacu v AD na kterych se uzivatel zalogoval v nejake definovane dobe (posledni dva tydny) vcetne casovych udaju. Jinymi slovy ziskat vypis typu: uzivatel 'user1' se zalogoval behem minuleho tydne na techto hostnames v v techto casech. Snad dava smysl :-). Dekuji Ondrej

    • na komentář odpověděl [2]pepa
    Středa, 10.02.2016 13:00 | odpovědět
  2. [2] pepa

    odpověď na [1]Ondrej: hoj, zkusil bych utilitku ze sysinternals "PsLoggedOn"

    Čtvrtek, 14.04.2016 17:53 | odpovědět
  3. [3] Radek

    Dobrý den, chtěl bych se zeptat, je možné vypsat pro konkrétní počítač, který uživatel se na něj kdy zalogoval? Nedaří se mi najít návod jak to zjistit

    Neděle, 04.12.2016 15:33 | odpovědět
  4. [4] Samuraj

    odpověď na [3]Radek: Hodně těžko. Takový údaj je pouze v Security logu a záleží na logování. Vytahuje se to složitě.

    Pondělí, 05.12.2016 08:09 | odpovědět
Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O


Ochrana proti SPAMu, zdejte následující čtyři znaky image code

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách