2016-09-14 2 views
1

Я пытаюсь вытащить все имя пользователя, время созданы и общедоступных IP-адрес изВыберите некоторые строки из сообщения Event

Microsoft-Windows-TerminalServices-Gateway/Operational событий.

enter image description here

Я получаю все события из сообщений с ниже команды, но мне нужно только имя пользователя и IP

get-winevent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303} 

Пытаюсь с этим, не повезло

get-winevent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303}| select timecreated -expand Message [regex]::Match($event, 'user:\s*(.*)\s*').Groups[1].Value 

ответ

1

Я думаю, что есть лучший подход с использованием метода ToXml() на EventLogRecord объекта:

Первый Поймать события:

$Events = Get-WinEvent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303} 

Затем возьмите, например, первый элемент в массиве и преобразовать его в XML:

[xml]$Event = $Events[0].ToXml() 

Теперь вы можете увидеть всю информацию вам нужно:

$Event.Event.UserData.EventInfo 

Update: Установить это для вас, это должно сделать работу:

$Events = Get-WinEvent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303} 

$ArrayList = New-Object System.Collections.ArrayList 
Foreach ($Event in $Events) 
{ 
[xml]$Xml = $Event.ToXml() 
$Row = "" | Select Username,TimeCreated,IPAddress 
$Row.Username = $Xml.Event.UserData.EventInfo.Username 
$Row.TimeCreated = $Event.TimeCreated.ToString() 
$Row.IPAddress = $Xml.Event.UserData.EventInfo.IpAddress 
[void]$ArrayList.Add($Row) 
} 

$ArrayList 
+0

Он работает как ожидалось, но показывает 1 или 2 журнала – DisplayName

+0

Сколько журналов вы есть на '$ Events.Count'? – Avshalom

+0

Обновлен ответ – Avshalom

2

Хорошо, я могу посмотрите, что вы пытаетесь с помощью команды Select, и, хотя это звучит хорошо, это не совсем работает. Вместо этого вы можете передать его через оператор Where, соответствующий нужной строке, и захватить соответствующие данные в совпадении RegEx, а затем с помощью Select добавить эти поля в объект.

Так Where матч, который будет работать для вас должно быть:

| Where{$_.Message -match '"(.+?\\.+?)".+"(\d+\.\d+\.\d+\.\d+)"'} 

Затем труба для Select и строить пользовательские и Ipaddress свойства на лету, как это:

| Select TimeCreated,@{l='User';e={$Matches[1]}},@{l='IPAddress';e={$Matches[2]}} 

Тогда вам все это вместе, и вы получаете:

get-winevent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303} | Where{$_.Message -match '"(.+?\\.+?)".+"(\d+\.\d+\.\d+\.\d+)"'} | Select TimeCreated,@{l='User';e={$Matches[1]}},@{l='IPAddress';e={$Matches[2]}} 

Us ING, что с некоторыми рандомизированные значениями я был в состоянии выхода:

TimeCreated   User   IPAddress  
-----------   ----   ---------  
9/14/2016 9:47:29 AM DOMAIN\dhxrjqb 216.229.149.87 
9/14/2016 9:47:29 AM DOMAIN\fkoilrh 236.65.23.77 
9/14/2016 9:47:29 AM DOMAIN\mvibope 20.7.45.231 

Хорошо, решение вопроса о том, что вы отметили в ваш комментарий является несовершеннолетним твик на матч RegEx, чтобы одна часть не жадный. Это сделать:

| Where{$_.Message -match '"(.+?\\.+?)".+?"(\d+\.\d+\.\d+\.\d+)"'} 

и все вместе снова ...

get-winevent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303} | Where{$_.Message -match '"(.+?\\.+?)".+?"(\d+\.\d+\.\d+\.\d+)"'} | Select TimeCreated,@{l='User';e={$Matches[1]}},@{l='IPAddress';e={$Matches[2]}} 
+0

awesome, но у некоторых пользователей его просто добавление ip из подключенного к ресурсу типа «10.10.1 "локального компьютера – DisplayName

+0

Можете ли вы привести пример сообщения, в котором он это делает? – TheMadTechnician

+0

Хорошо, я получил его на событие, это событие 302, событие имеет 2 ips' Пользователь «doaminuser», на клиентском компьютере «10.255.188.2», подключен к ресурсу «172.10.1.1» .' – DisplayName

Смежные вопросы