AD域用户管理者身份验证方法求助及代码问题排查
判断AD域用户是否为管理者的最简方法
咱们先聊聊你原来代码里的问题:
- 语法逻辑错误:
Get-AdUser -Identity $User -Filter "DirectReports -like '*' -eq $True"写法不对——-Identity已经指定了单个用户,再叠加-Filter完全多余,而且Filter的判断逻辑也有误,不需要画蛇添足加-eq $True。 - 效率极低:用
-Properties *会拉取用户的所有属性,不仅慢还浪费资源;循环里每次调用Get-ADUser会频繁发起AD查询,大域环境里会卡到崩溃。
给你两种高效的解决方法,其中第二种是最简单直接的:
方法一:一次查询+本地判断(最优推荐)
只需要一次AD查询获取所有用户的必要属性,然后直接检查DirectReports属性是否有值(有值就说明该用户是管理者):
# 获取所有AD用户,仅加载需要的属性(DirectReports是判断关键,其余用来友好显示) $allUsers = Get-ADUser -Filter * -Properties DirectReports, DisplayName, SamAccountName foreach ($user in $allUsers) { # 直接判断DirectReports属性是否非空——有下属时会返回用户DN数组,无下属则为$null if ($user.DirectReports) { Write-Host "$($user.DisplayName) ($($user.SamAccountName)) is a Manager" } else { Write-Host "$($user.DisplayName) ($($user.SamAccountName)) is NOT a Manager" } }
为什么这个方案最优?
- 仅发起一次AD查询,比循环查N次效率提升数倍
- 只获取必要属性,大幅减少数据传输量
- 判断逻辑简单直观,无需额外复杂处理
方法二:先获取管理者列表再对比
如果需要单独提取管理者集合做后续操作,可以先批量拿到管理者的唯一标识,再和所有用户对比:
# 先批量获取所有有直接下属的管理者,仅取唯一标识DistinguishedName $managerDNs = Get-ADUser -Filter "DirectReports -ne `$null" | Select-Object -ExpandProperty DistinguishedName # 获取所有用户的基础属性 $allUsers = Get-ADUser -Filter * -Properties DisplayName, SamAccountName foreach ($user in $allUsers) { if ($managerDNs -contains $user.DistinguishedName) { Write-Host "$($user.DisplayName) ($($user.SamAccountName)) is a Manager" } else { Write-Host "$($user.DisplayName) ($($user.SamAccountName)) is NOT a Manager" } }
内容的提问来源于stack exchange,提问作者curtcab
相关产品推荐
相关产品推荐

