Chr*_*s_K 3 security powershell windows-event-log windows-server-2008-r2
视窗服务器 2008 R2
我正在尝试使用 PowerShell 获取过去一天登录远程桌面服务(以前称为终端服务)的用户列表。由于很少理解和大量复制和粘贴,我有这个小脚本:
$a = (Get-Date).AddDays(-1)
Get-EventLog -LogName Security -after $a | Where-Object {($_.EventID -eq '4624') -and $_.EntryType -eq 'SuccessAudit') -and ($_.Message | Select-String "Logon Type:\t\t\t10")}
Run Code Online (Sandbox Code Playgroud)
默认输出告诉我事情已经发生以及它们何时发生,这是一个好的开始。我真正想要的是还显示用户。如果我能弄清楚如何获取用户和/或如何显示它,那该死。
这就是我的问题:如何添加与该事件 ID 4624/登录类型 10 事件关联的用户名?理想情况下,我只想显示登录时间和用户名。
首先,我建议使用Get-WinEvent
和 传递散列在那里进行尽可能多的过滤(从而避免创建大量Where-Object
会丢弃的对象):
Get-WinEvent -filterHashtable @{LogName='Security'; StartTime=$a; Id=4624; Level=0}
Run Code Online (Sandbox Code Playgroud)
0 级是成功审核。这可以通过-computer
参数远程执行。然后过滤结果以获取登录类型:
... | Where-Object { $_.Message -match 'Logon Type:\s+10'}
Run Code Online (Sandbox Code Playgroud)
使用正则表达式来避免对空格进行硬编码。
从消息中提取用户和域会有点尴尬,因为有两个“帐户名称”值:一个用于计算机,一个用于用户。但是插入(可本地化)消息文本中的所有可替换值都在事件的 Properties 属性,所以稍微检查一下样本1的索引
... | Select-Object *, @{l='LogonAccount';e={$_.Properties[6].Value + "\" + $_.Properties[5].Value }}
Run Code Online (Sandbox Code Playgroud)
清楚地捕获其他详细信息(例如 SID、客户端 IP)遵循相同的模式。
因此:
Get-WinEvent -filterHashtable @{LogName='Security'; StartTime=$a; Id=4624; Level=0} |
Where-Object { $_.Properties[8].Value -eq 10} |
Select-Object *, @{l='LogonAccount';e={$_.Properties[6].Value + "\" + $_.Properties[5].Value }}
Run Code Online (Sandbox Code Playgroud)
1在$ev
我使用的单个事件中:
0..($ev.Properties.Count-1) | Select @{l='Idx';e={$_}},@{l='Property';e={$ev.Properties[$_].Value}} |
ft -auto
Run Code Online (Sandbox Code Playgroud)
给予(稍加审查,并注意到在索引 #8 处获得登录类型的更好方法):
Idx 属性 --- -------- 0 S-1-5-18 1 *电脑账户* 2 *计算机域* 3 999 4 *用户的SID* 5 *用户的用户名* 6 *用户的域* 7 151556 8 10 9 用户 32 10 谈判 11 *计算机名称* 12 00000000-0000-0000-0000-000000000000 13 - 14 - 15 0 16 2964 17 C:\Windows\System32\winlogon.exe 18 *客户端IP* 19 15532
归档时间: |
|
查看次数: |
7954 次 |
最近记录: |