添加到@js2010 的有用答案,并假设您使用的是 PowerShell 5.1。我通常标识属性数组索引并Select-Object
根据需要使用来创建自定义属性。
$WinEvents =
get-winevent @{logname='system'; providername='Microsoft-Windows-Winlogon'} |
Select-Object @{Name = 'Time'; Expression = {$_.TimeCreated}},
@{Name = 'Event'; Expression = { If($_.ID -eq 7001){'Logon'} ElseIf($_.ID -eq 7002){ 'Logoff' } } },
@{Name = 'User'; Expression = { [System.Security.Principal.SecurityIdentifier]::new( $_.Properties[1].Value ).Translate([System.Security.Principal.NTAccount]) } }
在您的情况下,这应该向对象添加一个名为 User 的属性,其值类似于 DomainName\UserName。我还添加了表达式来派生您添加到自定义对象的其他属性。 Select-Object
也会发出自定义对象,因此这应该会给出您正在寻找的结果。
让我知道这是否有帮助。
更新
恭敬地,其他 2 个答案假设您正在寻找特定用户的登录/关闭事件。这不是我阅读问题的方式;尤其是:
“获取所有登录/退出服务器的用户”
虽然 PowerShell 7+ 确实允许您在 FilterHashtable 中直接引用 UserID,但它在这里并不是很有用,因为我们不是在寻找特定用户的事件。此外,它似乎对最终输出没有帮助,因为默认情况下它会作为 SID 回显。它仍然需要翻译,不仅是为了显示,而且是为了进一步过滤。我也不肯定 UserID 将始终与 相同Properties[1]
,在查看其他事件 ID 时肯定会有一些差异。
XML 工作非常酷,但我认为这里不需要它。
我的回答也有一些问题。我忽略了预先过滤事件 ID 和日期。我还意识到我们不需要实例化[System.Security.Principal.SecurityIdentifier]
类,因为该属性已经是这样输入的。除了一些可读性改进之外,我还纠正了以下这些问题。
# Should be the 1st line!
using NameSpace System.Security.Principal
$ResolveEventType = @{ 7001 = 'Logon'; 7002 = 'Logoff' }
$FilterHashTable =
@{
LogName = 'system'
ProviderName = 'Microsoft-Windows-Winlogon'
ID = 7001,7002
StartTime = (Get-Date).AddDays(-7)
}
[Array]$WinEvents =
Get-WinEvent -FilterHashtable $FilterHashTable |
Select-Object @{ Name = 'Time'; Expression = { $_.TimeCreated } },
@{ Name = 'Event'; Expression = { $ResolveEventType[ $_.ID ] } },
@{ Name = 'User'; Expression = { $_.Properties[1].Value.Translate( [NTAccount] ) } }
$WinEvents |
Where-Object{ $_.UserName -notlike "*-organization" } |
Format-Table -AutoSize
这在 PowerShell 5.1 和 7.0 中测试良好。我添加Format-Table
以显示输出,但您可以Export-Csv
根据需要将其更改为命令
注意:最后 2 个管道可以组合,但我认为这更具可读性。
让我知道这是否有帮助。