PowerShell中AD用户enabled字段布尔值统计异常排查
问题原因分析
- Where-Object语法错误:你使用的
[String]enabled -eq 'True'是错误写法——这里的[String]是试图将属性名enabled转换为字符串,而非对属性值做类型转换。这种写法会导致PowerShell无法正确识别要筛选的属性值,进而出现统计空值或计数错误的情况。 - 不必要的类型转换干扰:虽然你已经将AD用户的
Enabled属性转换为布尔类型,但后续筛选时强行转字符串比较,反而破坏了布尔值的原生比较逻辑,导致匹配失败。
解决方法
方法1:修正布尔值筛选逻辑
直接针对布尔类型的enabled属性进行比较,无需转换为字符串,两种简洁写法可选:
- 显式比较:
$_.enabled -eq $true - 利用布尔值本身作为筛选条件:
Where-Object enabled(仅保留enabled为$true的项)
方法2:用Measure-Object高效统计(推荐)
相比Where-Object后取Count,Measure-Object可以直接对布尔属性求和(True=1,False=0),效率更高且逻辑更清晰。
修正后的完整代码
$filter = "(&(objectClass=user)(objectCategory=person))" $params = @{ "Properties" = "userprincipalname", "whenCreated","physicaldeliveryofficename","o" } $adPath = "OU=Users,DC=site,DC=org," $now=Get-Date $endDate = Get-Date -Day 15 -Month $now.Month -Year $now.Year -Hour 0 -Minute 0 -Second 0 $startDate = $endDate.AddMonths(-1) $users = Get-ADUser -LDAPFilter $filter -SearchBase $adPath @params $u = [System.Collections.Generic.List[psobject]]::New() $users | ForEach-Object { $n = $false if ($_.whenCreated -ne $null -and $_.whenCreated -ge $startDate -and $_.whenCreated -le $endDate){ $n = $true } $x = [pscustomobject]@{ enabled = [System.Convert]::ToBoolean($_.Enabled) o = [String]$_.o new = $n } $u.Add($x) } # 采用Measure-Object实现高效统计 $u | Group o | Sort Count -Descending | Select Name, @{Name='Enabled';Expression={($_.Group | Measure-Object -Property enabled -Sum).Sum}}, @{Name='New';Expression={($_.Group | Where-Object new).Count}}, @{Name='Total';Expression={$_.Count}}, Group
代码说明
Enabled统计:Measure-Object -Property enabled -Sum自动将True视为1、False视为0,求和结果即为启用用户的数量,彻底避免语法错误。New统计:Where-Object new等价于Where-Object { $_.new -eq $true },写法更简洁直观。
验证结果
修正后,示例中ABCD分组的Enabled字段会正确返回1,与实际数据匹配。
内容的提问来源于stack exchange,提问作者Phaelax
相关产品推荐
相关产品推荐

