| Včera jsem měl a dneska budu mít WUG.
Slajdy a screenshoty
No používal jsem slajdy například ze svého GOC 175 kurzu, který školím v GOPASu. Slajdy, například tu tabulku s porovnáním jednotlivých servisních účtů, nebo screenshoty z procexp najdete zde. Nebo ještě lépe, přijděte na to pětidenní školení.
A nebo vůbec přijďte na konferenci GOPAS TechEd 2014 (www.teched.cz)
Budu tam také mít několik přednášek, ale hlavně tam bude milión dalších úžasných přednášek, které se nikde jinde nevidí. A samozřejmě plno luxusního jídla a zábavy.
Statistika přihlašování z logu
Něco podobného jsem tu psal už nedávno. Pro zopakování ze včerejška jednotlivé PowerShell skriptové kousky. Upozorňuju, že to chce ještě dodělat i pro NTLM ověřování, to znamená zapracovat ještě druhou událost číslo 4776, která má trošku jinak rozhozené InsertionStrings a navíc to obsahuje jméno počítače a nikoliv IP adresu.
Začali jsme takto se všemi successful Kerberos Authentication Service událostmi číslo 4768:
gwmi -Query 'SELECT * FROM Win32_NTLogEvent WHERE EventCode=4768'
A pokračovali s transformací InsertionStrings na tabulku o dvou sloupečcích:
gwmi -Query 'SELECT * FROM Win32_NTLogEvent WHERE EventCode=4768' | select @{ n ='Login'; e = { $_.InsertionStrings[0] } }, @{ n='IP'; e = { $_.InsertionStrings[9] } }
Pak nás napadlo tam přidat i datum a čas události:
gwmi -Query 'SELECT * FROM Win32_NTLogEvent WHERE EventCode=4768' | select @{ n ='Login'; e = { $_.InsertionStrings[0] } }, @{ n='IP'; e = { $_.InsertionStrings[9] } }, @{ n = 'Date' ; e = { $_.ConvertToDateTime($_.TimeGenerated) } }
Načež bych z toho odstranil přihlašování počítačů, tedy loginů, které končí dolarem $ (ale bacha, nic neříká, že normální účet nemůže končit dolarem):
gwmi -Query 'SELECT * FROM Win32_NTLogEvent WHERE EventCode=4768' | select @{ n ='Login'; e = { $_.InsertionStrings[0] } }, @{ n='IP'; e = { $_.InsertionStrings[9] } }, @{ n = 'Date' ; e = { $_.ConvertToDateTime($_.TimeGenerated) } } | ? { $_.Login -notlike '*$' }
No a mě se vůbec nelíbily ty IP adresy, takže bychom to mohli zkusit přeložit na jména počítačů. To už ale chce trošku sofistikovanější skript:
function Resolve-LogIP ([string] $ip, [string] $eventFromServer)
{
if ($ip -eq '::1') { return $eventFromServer }
if ($ip -like '::ffff:*.*.*.*') { return [System.Net.DNS]::Resolve($ip.SubString(7)).HostName }
return [System.Net.DNS]::Resolve($ip).HostName
}
gwmi -Query 'SELECT * FROM Win32_NTLogEvent WHERE EventCode=4768' | select @{ n ='Login'; e = { $_.InsertionStrings[0] } }, @{ n='IP'; e = { $_.InsertionStrings[9] } }, @{ n = 'Host' ; e = { Resolve-LogIP $_.InsertionStrings[9] $_.__SERVER } }, @{ n = 'Date' ; e = { $_.ConvertToDateTime($_.TimeGenerated) } } | ? { $_.Login -notlike '*$' }
No a poslední krok bylo to doplnit o dotaza na více řadičů domény. Pro jednoduchost jsem tam dal prostě jenom seznam. Pokud byste to chtěli lepší, tak stačí použít například Get-AdComputer, nebo DSQUERY SERVER -o RDN:
function Resolve-LogIP ([string] $ip, [string] $eventFromServer)
{
if ($ip -eq '::1') { return $eventFromServer }
if ($ip -like '::ffff:*.*.*.*') { return [System.Net.DNS]::Resolve($ip.SubString(7)).HostName }
return [System.Net.DNS]::Resolve($ip).HostName
}
'dc1', 'dc2', 'dc3' | % { gwmi -Query 'SELECT * FROM Win32_NTLogEvent WHERE EventCode=4768' -Comp $_ } | select @{ n ='Login'; e = {
$_.InsertionStrings[0] } }, @{ n='IP'; e = { $_.InsertionStrings[9] } }, @{ n = 'Host' ; e = { Resolve-LogIP $_.InsertionStrings[9]
$_.__SERVER } }, @{ n = 'Date' ; e = { $_.ConvertToDateTime($_.TimeGenerated) } } | ? { $_.Login -notlike '*$' }
|