Jak za pomocą PowerShella znaleźć IP, z którego zalogował się użytkownik AD?
Chodzi mi o coś w stylu:
Get-ADUser nazwa_usera | "Get-IP-Of-PC"
Jak za pomocą PowerShella znaleźć IP, z którego zalogował się użytkownik AD?
Chodzi mi o coś w stylu:
Get-ADUser nazwa_usera | "Get-IP-Of-PC"
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 }
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
}