首页 > 解决方案 > (PowerShell) 如何使用 Get-EventLog 过滤用户名

问题描述

我正在编写一个 Powershell 脚本来获取过去 7 天内登录/退出服务器的所有用户,他们的名字不像“*-organization”。以下有效,但无论我尝试什么,我都无法过滤名称

$logs = get-eventlog system -ComputerName $env:computername -source Microsoft-Windows-Winlogon -After (Get-Date).AddDays(-7)
$res = @()
ForEach ($log in $logs)
{
    if($log.instanceid -eq 7001){
        $type = "Logon"
    }
    Elseif ($log.instanceid -eq 7002){
        $type = "Logoff"
    }
    Else { Continue } 
    
    $res += New-Object PSObject -Property @{Time = $log.TimeWritten; "Event" = $type; User = (New-Object System.Security.Principal.SecurityIdentifier $Log.ReplacementStrings[1]).Translate([System.Security.Principal.NTAccount])}};
$res

我试过在不同的地方和方式添加这条线,但无论如何我都无法过滤它。它要么失败并告诉我我的操作员必须有一个属性和值,要么它运行良好并忽略任何用户名过滤。

| Where-Object $_.User -notlike "*-organization"

甚至可以用这种方法过滤登录用户名吗?如果是这样,我做错了什么?如果不可能,有没有其他方法可以得到我需要的东西?

标签: powershellfilteringget-eventlog

解决方案


必须有一个名为“用户”的属性才能工作。get-eventlog 现在实际上已经过时了,取而代之的是 get-winevent。不幸的是,您必须进入 xml 才能按用户 ID 进行过滤。我已经包含了一个时间过滤器。

$a = get-winevent @{logname='system';
  providername='Microsoft-Windows-Winlogon'} -MaxEvents 1
$e = $a.ToXml() -as 'xml'
$e.event.EventData

Data
----
{TSId, UserSid}

get-winevent @{logname='system';providername='Microsoft-Windows-Winlogon';
  data='S-2-6-31-1528843147-473324174-2919417754-2001';starttime=(Get-Date).AddDays(-7);
  id=7001,7002}

在 powershell 7 中,您可以直接引用名为 data 字段的 eventdata:

get-winevent @{logname='system';providername='Microsoft-Windows-Winlogon';
  usersid='S-2-6-31-1528843147-473324174-2919417754-2001'}

get-winevent 文档说您可以在 filterhashtable 中使用“userid”,但我无法让它工作。

编辑:实际上这有效。但是不要限制太多,至少对我来说是这样。

get-winevent @{logname='system';userid='js2010'}
get-winevent @{providername='Microsoft-Windows-Winlogon';userid='js2010'}

推荐阅读