Security

使用 RDP 列出使用者

  • September 22, 2011

視窗伺服器 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")}

預設輸出告訴我事情已經發生以及發生的時間,這是一個好的開始。我真正想要的是也顯示使用者。如果我能弄清楚如何獲取使用者和/或如何顯示它,那該死的。

這就是我的問題:如何添加與該事件 ID 4624 / Logon Type 10 事件關聯的使用者名?理想情況下,我只想顯示登錄時間和使用者名。

首先,我建議使用Get-WinEvent並傳遞一個散列在此處進行盡可能多的過濾(從而避免創建大量對象Where-Object會被丟棄):

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

0 級是成功審核。這可以使用-computer參數遠端執行。然後過濾結果得到登錄類型:

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

使用正則表達式來避免對空格進行硬編碼。

從消息中提取使用者和域會有點尷尬,因為有兩個“帳戶名稱”值:一個用於電腦,一個用於使用者。但是插入(可本地化)消息文本中的所有可替換值都在事件的 Properties 屬性,所以稍微檢查一下樣本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

給予(稍加審查,並指出在索引 #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

引用自:https://serverfault.com/questions/314386