列出使用RDP的用户

Windows Server 2008 R2

我正尝试使用PowerShell为我提供在过去一天中login到远程桌面服务(以前称为“terminal服务”)的用户列表。 没有多less理解和复制和粘贴,我有这个小脚本:

$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")} 

默认的输出告诉我事情已经发生,什么时候发生,这是一个好的开始。 我真的很喜欢也显示用户。 达尔如果我能弄清楚如何获得用户和/或如何显示它。

这就是我的问题:如何添加与该事件ID 4624 /logintypes10事件关联的用户名? 理想情况下,我只想显示login时间和用户名。

首先,我会build议使用Get-WinEvent并传递一个哈希以尽可能多地进行过滤(从而避免创build许多Where-Object将丢弃):

 Get-WinEvent -filterHashtable @{LogName='Security'; StartTime=$a; Id=4624; Level=0} 

级别0是成功审计。 这可以通过-computer参数远程执行。 然后过滤结果以获取logintypes:

 ... | Where-Object { $_.Message -match 'Logon Type:\s+10'} 

使用正则expression式来避免对空格进行硬编码。

从消息中提取用户和域名会有些尴尬,因为有两个“帐户名称”值:一个用于计算机,一个用于用户,但插入(localisable)消息文本的所有可replace值都在事件的属性属性,所以稍微检查一下示例1的索引

 ... | Select-Object *, @{l='LogonAccount';e={$_.Properties[6].Value + "\" + $_.Properties[5].Value }} 

清楚地捕获其他细节(例如,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 }} 

1使用$ev的单个事件:

 0..($ev.Properties.Count-1) | Select @{l='Idx';e={$_}},@{l='Property';e={$ev.Properties[$_].Value}} | ft -auto 

给(有点审查,并注意到一个更好的方式来获得索引#8logintypes):

 Idx属性
 --- --------
   0 S-1-5-18
   1 *电脑账户*
   2 *计算机的域*
   3 999
   4 *用户的SID *
   5 *用户的用户名*
   6 *用户的域名*
   7 151556
   8 10
   9 User32
  10谈判
  11 *电脑名称*
  12 00000000-0000-0000-0000-000000000000
  13  - 
  14  - 
  15 0
  16 2964
  17 C:\ Windows \ System32 \ winlogon.exe
  18 *客户端IP *
  19 15532

我会做如下 –

 $filter = "<QueryList>" + ` "<Query Id=`"0`" Path=`"Security`">" + ` "<Select Path=`"Security`">" + ` "*[System[(EventID=4624) and " + ` "TimeCreated[@SystemTime&gt;='2011-09-21T06:00:00Z' and @SystemTime&lt;'2011-09-22T06:00:00Z']]] and " + ` "*[EventData[Data[@Name=`'LogonType`']=10]]" + ` "</Select>" + ` "<Suppress Path=`"Security`">" + ` "*[EventData[Data[@Name=`'LogonGuid`']=`'{00000000-0000-0000-0000-000000000000}`']]" + ` "</Suppress>" + ` "</Query>" + ` "</QueryList>" Get-WinEvent -FilterXML $filter | %{ [xml]$xml = $_.ToXml() $xml.getElementsByTagName("Data") | where{$_.name -eq "TargetUserName"} | select '#text' } 

编辑:这现在返回个人的名字。 你可以玩弄你想从XML文档中提取的东西。

注意:您需要使用TimeCreated值(可能会立即生成它们)。 我包括这些,所以你可以看到他们需要的格式。

Get-WinEvent将比Get-EventLog快得多,因为过滤将在服务器端完成,而不是在pipe道中完成。 你也可以通过使用FilterXML参数来获得更具体的查询。 与login事件关联的用户名在返回的EventLogRecordMessage属性中。