看见论坛里有人问如何查询域用户,本地用户在对应组的加入时间,以及他们最后登录的时间。
豆子写了个小脚本来实现。
对于域用户,最后登录时间很容易,get-aduser就能获取了。注意一下时间格式转换
1
|
PS C:\WINDOWS\system32>
get-aduser
yli -Properties lastlogon | select name, @{n=
"Lastlogon"
;e={
[datetime]
::FromFileTime(
$_
.lastlogon)}}
|
结果如下
域用户加入组的时间需要在对应的DC上查询metadata。比如查询域管理员都是什么时候加入这个组的
1
2
3
|
$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才行。
比如查询本机的所有本地用户的上一次登录时间
1
2
|
$adsi
=
[ADSI]
"WinNT://$env:COMPUTERNAME"
$adsi
.Children | where {
$_
.SchemaClassName
-eq
'user'
} | select name,Lastlogin
|
最后,如果需要查询本地用户加入或者退出组的时间,我没有找到现成的命令,只能通过日志来查询了。
首先需要gpo里面打开审计功能。
重启电脑之后就可以了。本地的组添加用户会生成4732的日志,删除会生成4733的日志。我只需要查询对应的日志,并解析XML文件就行了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#查询本机日志
$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
|
结果如下
本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1743238,如需转载请自行联系原作者