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

Powershell 从事件消息中选择一些字符串,powershell,Powershell,我试图从中提取所有用户名、创建时间和公共ip地址 Microsoft Windows终端服务网关/操作事件 我用下面的命令从消息中获取所有事件,但我只需要用户名和ip get-winevent -FilterHashtable @{Logname = "Microsoft-Windows-TerminalServices-Gateway/Operational" ; ID = 300,302,303} 试着用这个不走运 get-winevent -FilterHashtable @{Logn

我试图从中提取所有用户名、创建时间和公共ip地址

Microsoft Windows终端服务网关/操作事件

我用下面的命令从消息中获取所有事件,但我只需要用户名和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

好的,我可以看到您正在使用
Select
命令尝试什么,虽然它听起来不错,但不太管用。相反,您可以通过与所需字符串匹配的
Where
语句传递它,并在正则表达式匹配中捕获相关数据,然后使用
Select
将这些字段添加到对象上

因此,适合您的
匹配应该是:

| Where{$_.Message -match '"(.+?\\.+?)".+"(\d+\.\d+\.\d+\.\d+)"'}
然后通过管道连接到
选择
,并动态生成用户和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   
好的,您在评论中提到的问题的解决方案是对正则表达式匹配进行一个小的调整,以使一部分不贪婪。这将做到:

| 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]}}

我认为在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

真棒,但在一些用户中,它只是从连接到资源(如本地计算机的“10.10.1”)的“10.10.1”中添加ip。你能给出一个这样做的消息示例吗?好的,我在event it 302中得到它。事件有两个ip
用户“DoamUser”,在客户端计算机“10.255.188.2”上,连接到资源“172.10.1.1”.
我们可以选择两个IP地址吗?一个是本地的,另一个是公共的。我们将只删除csv标题。PowerShell上没有任何困难。更新了答案。这个问题解决了提供商名称
$Events=Get WinEvent-FilterHashtable@{Logname=“Microsoft Windows TerminalServices Gateway/Operational”;ID=300302303}$ArrayList=New Object System.Collections.ArrayList Foreach($Events中的事件){[xml]$xml=$Event.ToXml()$Row=”“|选择用户名、TimeCreated、IPAddress$Row.Username=$xml.Event.UserData.EventInfo.Username$Row.TimeCreated=$Event.TimeCreated.ToString()$Row.IPAddress=$xml.Event.UserData.Info.IPAddress[void]$ArrayList.Add($Row)}$ArrayList