Хорошо, я могу посмотрите, что вы пытаетесь с помощью команды 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]}}
Он работает как ожидалось, но показывает 1 или 2 журнала – DisplayName
Сколько журналов вы есть на '$ Events.Count'? – Avshalom
Обновлен ответ – Avshalom