Security
使用 RDP 列出使用者
視窗伺服器 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