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 }
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
odpověď na [1]Ondrej: hoj, zkusil bych utilitku ze sysinternals "PsLoggedOn"
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
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ě.