You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选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,提问作者Йцукен

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:52:11