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

导出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才会返回正确的元素个数。

解决办法

  1. 强制转为数组:用@()包裹Get-ADUser命令,确保即使只有一个对象,也会被当作数组处理,让.Count返回正确数量。
  2. 改用推荐的Filter格式:AD模块更推荐使用字符串格式的Filter(而非脚本块),避免潜在的解析问题。
  3. 优化查询效率:一次获取当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:15:06