您的位置:首页 > 运维架构 > Shell

PowerShell 查询域用户和本地用户加入组的时间和最后登录信息

2016-02-19 10:36 573 查看
看见论坛里有人问如何查询域用户,本地用户在对应组的加入时间,以及他们最后登录的时间。
豆子写了个小脚本来实现。

对于域用户,最后登录时间很容易,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


结果如下



本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1743238
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: