看見論壇裡有人問如何查詢域使用者,本地使用者在對應組的加入時間,以及他們最後登入的時間。
豆子寫了個小腳本來實作。
對于域使用者,最後登入時間很容易,get-aduser就能擷取了。注意一下時間格式轉換
1
<code>PS C:\WINDOWS\system32> </code><code>get-aduser</code> <code>yli -Properties lastlogon | select name, @{n=</code><code>"Lastlogon"</code><code>;e={</code><code>[datetime]</code><code>::FromFileTime(</code><code>$_</code><code>.lastlogon)}}</code>
結果如下
<a href="http://s2.51cto.com/wyfs02/M02/7B/12/wKiom1bGfwuA6TeOAAAXlpoohQk774.png" target="_blank"></a>
域使用者加入組的時間需要在對應的DC上查詢metadata。比如查詢域管理者都是什麼時候加入這個組的
2
3
<code>$pdc</code><code>=</code><code>Get-ADDomainController</code> <code>-Discover -Service PrimaryDC</code>
<code>$dn</code><code>=(</code><code>get-adgroup</code> <code>"domain admins"</code><code>).distinguishedname</code>
<code>Get-ADReplicationAttributeMetadata</code> <code>$dn</code> <code>-Server </code><code>$pdc</code> <code>-ShowAllLinkedValues | </code><code>Where-Object</code> <code>{</code><code>$_</code><code>.attributename </code><code>-eq</code> <code>'member'</code><code>} | select FirstOriginatingcreatetime, attributevalue</code>
<a href="http://s1.51cto.com/wyfs02/M02/7B/12/wKioL1bGf4eibR_ZAAGGBYDJv94828.png" target="_blank"></a>
本地使用者的登入時間需要用 adsi來查詢。在AD 子產品開發之前,管理者隻能用ADSI來操縱AD和本地對象。現在操作AD可以直接用子產品了,但是本地的貌似還得用ADSI才行。
比如查詢本機的所有本地使用者的上一次登入時間
<code>$adsi</code> <code>= </code><code>[ADSI]</code><code>"WinNT://$env:COMPUTERNAME"</code>
<code>$adsi</code><code>.Children | where {</code><code>$_</code><code>.SchemaClassName </code><code>-eq</code> <code>'user'</code><code>} | select name,Lastlogin</code>
<a href="http://s4.51cto.com/wyfs02/M00/7B/12/wKiom1bGf2WiztBWAAAjA3AN-uE269.png" target="_blank"></a>
最後,如果需要查詢本地使用者加入或者退出組的時間,我沒有找到現成的指令,隻能通過日志來查詢了。
首先需要gpo裡面打開審計功能。
<a href="http://s3.51cto.com/wyfs02/M01/7B/12/wKioL1bGfgygRCq7AACB8Juqlxg701.png" target="_blank"></a>
重新開機電腦之後就可以了。本地的組添加使用者會生成4732的日志,删除會生成4733的日志。我隻需要查詢對應的日志,并解析XML檔案就行了。
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>#查詢本機日志</code>
<code>$eventcritea</code> <code>= @{logname=</code><code>'security'</code><code>;id=4732}</code>
<code>$Events</code> <code>=</code><code>get-winevent</code> <code>-ComputerName </code><code>$env:COMPUTERNAME</code> <code>-FilterHashtable </code><code>$eventcritea</code>
<code>#$Events = Get-WinEvent -ComputerName syddc01 -Filterxml $xmlfilter </code>
<code>$result</code><code>=@()</code>
<code> </code>
<code># 解析日志 </code>
<code>ForEach</code> <code>(</code><code>$Event</code> <code>in</code> <code>$Events</code><code>) { </code>
<code> </code>
<code> </code><code># Convert the event to XML </code>
<code> </code><code>$eventXML</code> <code>= </code><code>[xml]</code><code>$Event</code><code>.ToXml() </code>
<code> </code><code>$groupname</code><code>=</code><code>$eventXML</code><code>.Event.EventData.Data[2].</code><code>'#text'</code><code>.ToString()</code>
<code> </code><code>$sid</code><code>= </code><code>$eventXML</code><code>.Event.EventData.Data[1].</code><code>'#text'</code><code>.ToString()</code>
<code> </code>
<code>#轉換SID到使用者名</code>
<code> </code><code>$objSID</code> <code>= </code><code>New-Object</code> <code>System.Security.Principal.SecurityIdentifier(</code><code>$sid</code><code>)</code>
<code> </code><code>$objUser</code> <code>= </code><code>$objSID</code><code>.Translate( </code><code>[System.Security.Principal.NTAccount]</code><code>)</code>
<code>#儲存結果到自定義的一個對象 </code>
<code> </code><code>$temp</code><code>=</code><code>[pscustomobject]</code><code>@{Time=</code><code>$Event</code><code>.TimeCreated;Username=</code><code>$objUser</code><code>.Value;GroupName=</code><code>$groupname</code><code>}</code>
<code> </code><code>$result</code><code>+=</code><code>$temp</code>
<code>} </code>
<code> </code>
<code> </code><code>$result</code>
<a href="http://s2.51cto.com/wyfs02/M02/7B/12/wKiom1bGfmaQmNSmAAAMC81CjgM937.png" target="_blank"></a>
本文轉自 beanxyz 51CTO部落格,原文連結:http://blog.51cto.com/beanxyz/1743238,如需轉載請自行聯系原作者