使用 RDP 列出用户

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 事件关联的用户名?理想情况下,我只想显示登录时间和用户名。

Ric*_*ard 6

首先,我建议使用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