从事件中选择一些字符串消息

时间:2016-09-14 15:36:52

标签: powershell

我正在尝试从

中提取所有用户名,时间创建和公共IP 地址

Microsoft-Windows-TerminalServices-Gateway / Operational event。

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

2 个答案:

答案 0 :(得分:2)

好的,我可以通过Select命令查看您正在尝试的内容,虽然听起来不错,但这并不是很有效。您可以做的是通过匹配您需要的字符串的Where语句,并在RegEx匹配中捕获相关数据,然后使用Select将这些字段添加到对象上。

所以适合你的Where匹配应该是:

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

然后你管道到Select并像这样动态构建User和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]}}

使用一些随机值,我能够输出:

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 :(得分:1)

我认为在EventLogRecord对象上使用ToXml()方法有更好的方法:

首先抓住事件:

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

然后,以数组中的第一项为例,将其转换为XML:

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

现在您可以看到所需的所有信息:

$Event.Event.UserData.EventInfo

更新:为您设置,这应该做的工作:

$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