如何筛选AD组内近期活跃用户?PowerShell命令报错求助
如何筛选隶属于指定AD组且近期活跃的用户?
问题分析与错误修复
第一个命令的错误原因
你用的第一个命令:
Get-ADGroupMember $group -Recursive | ? {$_.objectClass -eq "user"} | Get-ADUser -filter {(LastLogonTimeStamp -gt $LastLogonDate)}
报错是因为Get-ADGroupMember输出的ADPrincipal对象无法直接绑定到Get-ADUser的参数上。Get-ADUser通过管道接收输入时,需要的是用户标识(如SamAccountName、DistinguishedName),但该对象类型不匹配;同时-Filter用脚本块引用变量时容易出现作用域问题,更推荐用字符串格式的筛选条件。
第二个命令的错误原因
第二个命令:
Get-ADGroupMember $group -Recursive | ? {$_.objectClass -eq "user"} | Get-ADUser -Properties LastLogonTimeStamp | ? {$_.LastLogonTimeStamp -gt $LastLogonDate}
报错是因为LastLogonTimeStamp存储的是Int64类型的Windows文件时间,而$LastLogonDate是DateTime对象,两者类型不匹配,无法直接比较,必须做类型转换后再对比。
正确的实现命令
这里提供两种可行写法:
写法一:将DateTime转换为文件时间
# 定义活跃时间阈值,示例为30天前 $LastLogonDate = (Get-Date).AddDays(-30) # 把DateTime转为对应Int64文件时间 $lastLogonFileTime = $LastLogonDate.ToFileTime() Get-ADGroupMember $group -Recursive | Where-Object {$_.objectClass -eq "user"} | Get-ADUser -Properties LastLogonTimeStamp | Where-Object {$_.LastLogonTimeStamp -gt $lastLogonFileTime -and $_.LastLogonTimeStamp -ne $null}
写法二:将LastLogonTimeStamp转换为DateTime
$LastLogonDate = (Get-Date).AddDays(-30) Get-ADGroupMember $group -Recursive | Where-Object {$_.objectClass -eq "user"} | Get-ADUser -Properties LastLogonTimeStamp | Where-Object { $null -ne $_.LastLogonTimeStamp -and [DateTime]::FromFileTime($_.LastLogonTimeStamp) -gt $LastLogonDate }
效率优化写法
如果想减少管道处理的对象数量,可以在Get-ADUser的-Filter里直接筛选:
$lastLogonFileTime = (Get-Date).AddDays(-30).ToFileTime() Get-ADGroupMember $group -Recursive | Where-Object {$_.objectClass -eq "user"} | Get-ADUser -Properties LastLogonTimeStamp -Filter "LastLogonTimeStamp -gt $lastLogonFileTime"
内容的提问来源于stack exchange,提问作者Йцукен
相关产品推荐
相关产品推荐

