看見論壇裏有人問如何查詢域用戶,本地用戶在對應組的加入時間,以及他們最後登錄的時間。
豆子寫了個小腳本來實現。
對於域用戶,最後登錄時間很容易,get-aduser就能獲取了。注意一下時間格式轉換
PS C:\WINDOWS\system32> get-aduser yli -Properties lastlogon | select name, @{n="Lastlogon";e={[datetime]::FromFileTime($_.lastlogon)}}
結果如下
域用戶加入組的時間需要在對應的DC上查詢metadata。比如查詢域管理員都是什麼時候加入這個組的
$pdc=Get-ADDomainController -Discover -Service PrimaryDC $dn=(get-adgroup "domain admins").distinguishedname Get-ADReplicationAttributeMetadata $dn -Server $pdc -ShowAllLinkedValues | Where-Object {$_.attributename -eq 'member'} | select FirstOriginatingcreatetime, attributevalue
結果如下
本地用戶的登錄時間需要用 adsi來查詢。在AD 模塊開發之前,管理員只能用ADSI來操縱AD和本地對象。現在操作AD可以直接用模塊了,但是本地的貌似還得用ADSI才行。
比如查詢本機的所有本地用戶的上一次登錄時間
$adsi = [ADSI]"WinNT://$env:COMPUTERNAME" $adsi.Children | where {$_.SchemaClassName -eq 'user'} | select name,Lastlogin
最後,如果需要查詢本地用戶加入或者退出組的時間,我沒有找到現成的命令,只能通過日誌來查詢了。
首先需要gpo裏面打開審計功能。
重啓電腦之後就可以了。本地的組添加用戶會生成4732的日誌,刪除會生成4733的日誌。我只需要查詢對應的日誌,並解析XML文件就行了。
#查詢本機日誌 $eventcritea = @{logname='security';id=4732} $Events =get-winevent -ComputerName $env:COMPUTERNAME -FilterHashtable $eventcritea #$Events = Get-WinEvent -ComputerName syddc01 -Filterxml $xmlfilter $result=@() # 解析日誌 ForEach ($Event in $Events) { # Convert the event to XML $eventXML = [xml]$Event.ToXml() $groupname=$eventXML.Event.EventData.Data[2].'#text'.ToString() $sid= $eventXML.Event.EventData.Data[1].'#text'.ToString() #轉換SID到用戶名 $objSID = New-Object System.Security.Principal.SecurityIdentifier($sid) $objUser = $objSID.Translate( [System.Security.Principal.NTAccount]) #保存結果到自定義的一個對象 $temp=[pscustomobject]@{Time=$Event.TimeCreated;Username=$objUser.Value;GroupName=$groupname} $result+=$temp } $result
結果如下