看见论坛里有人问如何查询域用户,本地用户在对应组的加入时间,以及他们最后登录的时间。
豆子写了个小脚本来实现。
对于域用户,最后登录时间很容易,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,如需转载请自行联系原作者