Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 6
  • 511

Odpowiedzi (2)

  • 27

Informacje, o które Pan pyta, można znaleźć w dzienniku zdarzeń na kontrolerach domeny.

Ja posłużyłem się zdarzeniem ID 4769, niestety obiekt utworzony przez PowerShell nie posiada właściwości, w której wprost wypisana jest nazwa użytkownika ani adres IP klienta.

Trzeba wyciągnąć w/w informacje z treści komunikatu zdarzenia. Informacje te zawarte są we właściwościach Message i Replacementstrings, jak nazwy właściwości wskazują pierwsza będzie tekstem dla administratora formatowanym enterami i spacjami, druga będzie łatwiejsza do obsługi z poziomu skryptu, ale w dalszym ciągu będą to stringi.

Poniższa funkcja rozdziela stringi z właściwości Replacementstrings, dokładając do naszych obiektów jako nowe właściwości, dopiero tak przerobione obiekty filtrujemy, sortujemy i wybieramy najnowszy, bo tak zrozumiałem pytanie.

Co za tym idzie, musimy pobrać wszystkie wpisy z dziennika zdarzeń kontrolera domeny z konkretnym identyfikatorem zdarzenia, nie możemy filtrować po stronie serwera – może to być czasochłonne i mieć wpływ na wydajność kontrolera domeny.

Poniższa funkcja jest tylko podpowiedzią, jak poradzić sobie z prasowaniem tekstu, działa tylko w konkretnych warunkach.

Za pomocą parametrów podajemy listę kontrolerów domeny, z których dziennik ma być odczytany oraz UPN użytkownika:

 

function Get-UserLastLogonIp {
  param (
    [parameter(mandatory=$true)][string]$upn,
    [parameter(mandatory=$true)][string[]]$dc
  )
  $events = @()
  foreach ($idc in $dc) {
    try {$event = Get-EventLog Security -ComputerName $idc -InstanceId 4769 -ea stop |
       Select-Object TimeGenerated,
         @{n="p0";e={($_ | select -ExpandProperty replacementstrings)[0]}},
         @{n="p2";e={($_ | select -ExpandProperty replacementstrings)[2]}},
         @{n="p6";e={($_ | select -ExpandProperty replacementstrings)[6]}} |
        Where-Object {$_.p0 -eq $upn -and $_.p2 -ne "$idc$" -and $_.p2 -ne "krbtgt"} |
        Sort-Object TimeGenerated -Descending | Select-Object -First 1 
      $events += $event
    }
    catch {continue}
  }

  $llip = $events | Sort-Object TimeGenerated -Descending | Select-Object -First 1 |
                    Select-Object -ExpandProperty p6 |
                    ForEach-Object{$_.Substring($_.LastIndexOf(":") + 1)}
                  
  return $llip
}
  • Odpowiedział
  • @ | 17.04.2014
  • TRENER ALTKOM AKADEMII
  • 0

A tu trochę inny sposób na to samo:

 

function Get-UserLastLogonIp {
param (
[parameter(mandatory=$true)][string]$upn,
[parameter(mandatory=$true)][string[]]$dc
)

$Events=@()

$FilterXML = '<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=4769)] and EventData[Data[@Name="TargetUserName"] and (Data="'+$UPN+'")]]</Select>
</Query>
</QueryList>'

$Events = Get-WinEvent -computername $dc –FilterXml $FilterXml

foreach ($Event in $Events ) {
([xml]$Event.ToXml()).Event.EventData.ChildNodes | % {
Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name $_.name -Value $_.'#text'
}
}

$Events | Select-Object TargetUserName, IpAddress, MachineName, TimeCreated | Out-GridView
}

Jakub_Bator
  • Odpowiedział
  • @ Jakub_Bator | 29.04.2016
    • 8
    • 0
    • 6