Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Statistika přihlašování pro jednoho uživatele
říjen 30
Statistika přihlašování pro jednoho uživatele

Minulý týden jsem potřeboval udělat malý přehled počítačů, ze kterých se jeden určitý uživatel přihlašoval. A vzhledem k tomu, že to je docela zajímavé téma, tak to tu teďka i zveřejním. To se pomějeme :-)

Výpis přihlašovacích událostí

To se jednoduše řekne, ale není to úplně jednoduché. Nejprve si musíme uvědomit, jaké události nás ve skutečnésti zajímají. Ve Windows je možné auditovat dva druhy "přihlašovacích" událostí:

  • Account Logon Event - tohle je to, co my budeme hledat. Jedná se o událost ověření příhlašovacích údajů. Tedy buď hesla, nebo třeba čipové karty. Loguje se to tedy pouze na DC (řadičích domény). Tedy samozřejmě i na serverech a stanicích, pokud se použil lokální účet. Tyto události budou dvě. Události od Kerberos ověření, a události od pass-through ověření, jakým je NTLM, nebo Schannel. Od Windows 2008 (a to platí i pro Windows 2012) jsou to čísla událostí 4768 a 4776. Tyto události by mohly mít lepší název. Spíš je to něco jako "authentication event".
  • Logon Event - toto nás nezajímá. Jedná se o okamžik vytvoření paměťové struktury access token na počítači, na který jste se "připojili". Buď jste se tam přihlásili lokálně, nebo se tam připojili ze sítě, spustili jste se jako služba, nebo naplánovaná úloha. Lepší název těchto událostí by byl asi "session event".

V případě account logon event událostí nás zajímá pouze vydání TGT tiketu a IP adresa, ze které se o něj požádalo. V případě NTLM a Schannel v něm bude jméno počítače klienta, ze kterého se přistupovalo na nějaký server.

Musíme také prohledat Security protokol na všech DC. Příhlašujete se o libovolné DC, které je živé, takže to není moc jednoduché sjednotit.

Poznámka o jistotě - IP adresa tam bude taková, která je vidět jako zdrojová na tom Kerberos TCP spojení. Pokud to šlo zpoza NATu, tak tam bude ta jeho veřejná adresa. IP adresy se dají samozřejmě i fejknout. Jméno počítače v případě NTLM je také jenom hodně vzdušná informace. To se nijak neověřuje. Jde prostě jen o jméno klienta takové, jaké ho stanice nahlásila. Takže opět tomu věřit na 100% nelze. Ale pro naše účely to úplně stačí.

K výpisu přihlašovacích událostí jsem použil příkaz WEVTUTL. Ten je dostupný až od Windows 2008. Ale zase to má výhodu, že umí vypustit XML formát událostí. Znamená to, že nám skript pojede na všech DC, které jsou alespoň Windows 2008.

Z logu pomocí WEVTUTIL také filtruju pomocí XPath dotazu události pro daného uživatele. To je také mnohem pohodlnější, než vypisovat události přes WMI. Lépe řečeno, pomocí XPath ten dotaz lze udělat, zatímco pomocí WMI nikoliv. S WMI byste museli načíst všechny přihlašovací události obecně a potom to teprve filtrovat v paměti z položky InsertionStrings, což je multihodnota.

Skriptík

Tak tu je výsledek. Jak jsem už říkal, je nutno to spustit na všech DC, ze kterých chcete statistiku

function Measure-LogonStatistics ([string] $userToQuery, [int] $limit)
{
  $query = '*[System[band(Keywords,9007199254740992) and ((EventID=4768) or (EventID=4776))] and EventData/Data[@Name=''TargetUserName'']=''{0}'']' -f $userToQuery
  $evtXML = wevtutil qe Security /rd:true /f:RenderedXml /c:$limit /e:EVS /q:$query

  $xml = [xml] $evtXML

  $xml.Evs.Event | % {

   $oneEv = $_

   [string] $login = ($oneEv.EventData.Data | ? { $_.Name -eq 'TargetUserName' }).'#text'.ToLower().Trim()
   [string] $ip = ($oneEv.EventData.Data | ? { $_.Name -eq 'IpAddress' }).'#text'
   [string] $wks = ($oneEv.EventData.Data | ? { $_.Name -eq 'Workstation' }).'#text'

   if ($ip -ne '') { $comp = $ip.ToLower().Trim() }
   if ($wks -ne '') { $comp = $wks.ToLower().Trim() }

   if ($comp -like '::ffff:*.*.*.*') { $comp = $comp.SubString(7) }

   $oneLogin = New-Object PSCustomObject

   $oneLogin | Add-Member -MemberType NoteProperty -Name login -Value $login
   $oneLogin | Add-Member -MemberType NoteProperty -Name comp -Value $comp
   $oneLogin | Add-Member -MemberType NoteProperty -Name time -Value $oneEv.System.TimeCreated.SystemTime

   $oneLogin

  }
}

Measure-LogonStatistics 'kamil' 1000 | Select -Unique login, comp

Comments

Chybicka se vloudila....

Ondreji,

mate v tom skriptu chybku - nahore se funkce jmenuje Measure-LogonStatistic a dole volate Measure-LogonStatistics .... chyba nebo zamer ?  :-P
Roman Volf on 31.10.2012 14:46

Chybicka se vloudila....

Ondreji,

mate v tom skriptu chybku - nahore se funkce jmenuje Measure-LogonStatistic a dole volate Measure-LogonStatistics .... chyba nebo zamer ?  :-P
Roman Volf on 31.10.2012 14:55

Re: Statistika přihlašování pro jednoho uživatele

díky. opraveno
ondass on 31.10.2012 18:37

Re: Statistika přihlašování pro jednoho uživatele

Ahoj tenhle skript by se mi hodil, bohužel nevím jak ve Windows skriptovat. Stačí to vložit do .bat souboru ? Asi ne co ? Diky za pomoc.
Pavel on 21.3.2013 11:43

Re: Statistika přihlašování pro jednoho uživatele

powershell, soubor .PS1
ondass on 21.3.2013 12:08

Re: Statistika přihlašování pro jednoho uživatele

Super už jsem to nahodil mam ještě dotaz. Když mi to uděla vypis tak to jsou všechno neúspěšné, nebo úspěšné přihlášení ? Dává mi to docela dlouhý výpis. Je možnost zapsat výsledek do souboru ? mam tam toho tolik, že to nezobrazuje vše :o( Diky !
Pavel on 22.3.2013 11:06

Re: Statistika přihlašování pro jednoho uživatele

no to je potřeba se podívat, nebo si upravit ten wevtutil filter nahoře. Dívám se, že událost 4776 je NTLM ověření, zatímco 4768 je Kerberos ověření. Oboje má jak Failure Audit, tak i Success Audit. To znamená, že to měří oba typy událostí. Kdybyste chtěl jen něco konkrétního, tak byste si musel upravit ten XPath filter pro příkaz WEVTUTIL.

ten skript je samozřejmě míněn jen jako ukázka, nemůžete to brát jako nějaké definitivní řešení. Podle toho, jak se na to dívám, tak to vypisuje jednoduchou statistiku, ze kterých strojů se daný účet pokoušel ověřovat, bez ohledu na to, jestli se to povedlo, nebo nepovedlo.

Taky to vypisuje z logu jen jednoho DCčka, takže pokud jich máte více, musíte si to upravit, aby to běželo vůči všem DCčkům, nebo nějak sbírat ty událosit někam do jednoho logu (Event Forwarding).
ondass on 22.3.2013 12:14

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments