导出AD禁用用户数时出现ADPropertyValueCollection异常求助
AD用户统计脚本的计数异常解决方法
你遇到的问题是:当目标OU下仅存在1个禁用用户时,脚本输出的Disabled列显示Microsoft.ActiveDirectory.Management.ADPropertyValueCollection;单独执行(Get-ADUser -Filter {Enabled -eq "False"} -SearchBase $ou -Properties enabled).Count无法返回预期数字,但直接执行查询命令能正常看到该禁用用户。
问题原因
这是PowerShell的特性导致的:当Get-ADUser仅返回单个对象时,PowerShell不会自动将其包装为数组。此时访问.Count,获取的是AD用户对象自身的Count属性(属于ADPropertyValueCollection类型),而非集合的元素数量;只有当结果是多个对象组成的数组时,.Count才会返回正确的元素个数。
解决办法
- 强制转为数组:用
@()包裹Get-ADUser命令,确保即使只有一个对象,也会被当作数组处理,让.Count返回正确数量。 - 改用推荐的Filter格式:AD模块更推荐使用字符串格式的Filter(而非脚本块),避免潜在的解析问题。
- 优化查询效率:一次获取当前OU下的所有用户,再基于内存对象分别统计总数、启用/禁用用户数,减少对AD服务器的重复查询。
修改后的完整脚本
$ous = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Root,DC=contoso,DC=domain" ` | Where-Object {$_.DistinguishedName -like "*OU=Users,*"} ` | Select-Object -ExpandProperty DistinguishedName $results = foreach ($ou in $ous) { # 一次获取当前OU下所有用户,包含Enabled属性 $allUsers = @(Get-ADUser -Filter * -SearchBase $ou -Properties Enabled) # 统计各类用户数量 $userCount = $allUsers.Count $userCountEnabled = ($allUsers | Where-Object {$_.Enabled -eq $true}).Count $userCountDisabled = ($allUsers | Where-Object {$_.Enabled -eq $false}).Count [PSCustomObject]@{ OU = $ou Count = $userCount Enabled = $userCountEnabled Disabled = $userCountDisabled } } $results | Export-Csv -Path "C:\Migrate\totalusers.csv" -NoTypeInformation -Encoding UTF8
关键修改说明
@(Get-ADUser ...)强制将查询结果转为数组,确保.Count始终返回正确的元素数量。- 仅执行一次AD查询,后续统计基于内存中的用户集合,既减轻AD服务器负载,也提升脚本运行速度。
- 直接对内存对象进行筛选,逻辑更清晰,避免重复查询带来的潜在问题。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

