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

简介:

看见论坛里有人问如何查询域用户,本地用户在对应组的加入时间,以及他们最后登录的时间。

豆子写了个小脚本来实现。


对于域用户,最后登录时间很容易,get-aduser就能获取了。注意一下时间格式转换

1
PS C:\WINDOWS\system32>  get-aduser  yli -Properties lastlogon | select name, @{n= "Lastlogon" ;e={ [datetime] ::FromFileTime( $_ .lastlogon)}}

结果如下

wKiom1bGfwuA6TeOAAAXlpoohQk774.png

域用户加入组的时间需要在对应的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


结果如下

wKioL1bGf4eibR_ZAAGGBYDJv94828.png

本地用户的登录时间需要用 adsi来查询。在AD 模块开发之前,管理员只能用ADSI来操纵AD和本地对象。现在操作AD可以直接用模块了,但是本地的貌似还得用ADSI才行。


比如查询本机的所有本地用户的上一次登录时间

1
2
$adsi  [ADSI] "WinNT://$env:COMPUTERNAME"
$adsi .Children | where { $_ .SchemaClassName  -eq  'user' }  | select name,Lastlogin

wKiom1bGf2WiztBWAAAjA3AN-uE269.png


最后,如果需要查询本地用户加入或者退出组的时间,我没有找到现成的命令,只能通过日志来查询了。


首先需要gpo里面打开审计功能。


wKioL1bGfgygRCq7AACB8Juqlxg701.png



重启电脑之后就可以了。本地的组添加用户会生成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


结果如下

wKiom1bGfmaQmNSmAAAMC81CjgM937.png










本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1743238,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
49 0
|
11月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结
Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
86 0
window powershell 获取所有用户的最后登录时间
ComputerName) | Where-Object {adsi = [ADSI]"WinNT://adsi.Children | where {today=Get-Date -Format 'yyyyMMdd'ipaddr+""+ -replac...
1047 0
|
jenkins 持续交付 Windows
Jenkins基础--Windows批处理,PowerShell获取指定的Credentials账户信息
Jenkins中Windows批处理,PowerShell获取指定的Credentials账户信息
4820 0
|
网络协议 网络虚拟化