Я пытаюсь использовать строку get-winevent + select для фильтрации и получения IP-адреса из событий 4625.
После get-winevent я хочу отфильтровать результаты, чтобы показать только строку «Адрес исходной сети:», которая предоставит мне список IP-адресов, которые мне нужно заблокировать.
Ниже приведен пример результатов, заранее спасибо!
PS C:\Users\Administrator> Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 1 | фл
Время Создано : 15.02.2023 07:43:25 ProviderName : Microsoft-Windows-Security-Auditing Идентификатор: 4625 Сообщение: Не удалось войти в учетную запись.
Subject:
Security ID: S-1-0-0
Account Name: -
Account Domain: -
Logon ID: 0x0
Logon Type: 3
Account For Which Logon Failed:
Security ID: S-1-0-0
Account Name: ADMINISTRATOR
Account Domain:
Failure Information:
Failure Reason: Unknown user name or bad password.
Status: 0xC000006D
Sub Status: 0xC0000064
Process Information:
Caller Process ID: 0x0
Caller Process Name: -
Network Information:
Workstation Name: -
Source Network Address: 209.45.48.94
Source Port: 0
Detailed Authentication Information:
Logon Process: NtLmSsp
Authentication Package: NTLM
Transited Services: -
Package Name (NTLM only): -
Key Length: 0
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 100 | Select-String -Pattern «Адрес исходной сети:» пытался таким образом, но результатов не было
Поскольку кажется, что вам нужно извлечь IP-адрес, я бы предложил использовать регулярное выражение для его сопоставления.
$regex = [regex]::new("\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b")
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 100 | Foreach {$regex.Match($_.Message).Value}
Этот код перебирает каждый результат, который возвращает Get-WinEvent, и проверяет с помощью регулярного выражения IP-адрес в свойстве сообщения. Если совпадений не найдено, возвращается пустая строка.
Чтобы получить информацию из журнала событий Windows, сложно попытаться проанализировать ее из строки сообщения.
Лучше посмотрите на XML, где значения можно найти под собственными именами атрибутов:
$result = Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 100 | ForEach-Object {
# convert the event to XML and grab the Event node
$eventXml = ([xml]$_.ToXml()).Event
# output the values from the XML representation
[PsCustomObject]@{
UserName = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
IpAddress = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'IpAddress' }).'#text'
EventDate = [DateTime]$eventXml.System.TimeCreated.SystemTime
}
}
Теперь, если все, что вам нужно, это список IP-адресов, просто выполните
$result.IpAddress
Тео Спасибо за пример, попробую!
(Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 1).Message.split(':') -split("`t") | ? { $_ -match '\d+\.\d+\.\d+.\d+'} | % {$_ -replace ("`n","")}
Удивительный! Работал, как ожидалось! Спасибо!
Удивительный! Работал, как ожидалось! Спасибо!