如何获取 AD 用户的经理

最后更新于:

无论您是需要查找用户的经理、解析经理的显示名称、列出经理的直接下属,还是将经理数据导出为 CSV,Get-ADUser PowerShell cmdlet 都是完成此任务的标准工具。本文将引导您完成从安装 Active Directory (AD) 模块到检索经理信息的每一步,并附有完整示例。我们还将展示如何使用 AD user reportsADManager Plus —— 一个全面的 AD reporting tool 中,几次点击即可生成相同的报告。

  • PowerShell
  • ADUC
  • ADManager Plus
  • 为什么选择 ADManager Plus
  • 常见问题解答
 

什么是 Get-ADUser 的 manager 属性?

manager 属性是一个 AD 用户属性,用于将一个用户对象链接到另一个。它不存储名称或电子邮件地址,而是存储经理的 DN 引用,即该经理对象在目录中的完整唯一路径。这使得 AD 能够模拟组织的汇报结构。每个用户最多只能指向一个经理,这条引用链是组织结构图、直接下属列表和管理链的基础。

由于 manager 属性不是默认属性集的一部分,Get-ADUser cmdlet 默认不会返回它,除非您明确请求。默认情况下,它只返回一小部分核心属性,如 name、sAMAccountName 和 distinguishedName。要获取用户的经理,必须添加 -Properties Manager 参数。AD 为了保持查询速度,会隐藏非默认属性,因此 cmdlet 只返回您明确请求的属性。

前提条件

本页所有示例均依赖于 Windows PowerShell 的 AD 模块。开始之前,请确保该模块可用且您拥有相应权限。

  • Install Remote Server Administration Tools (RSAT) and AD tools from an elevated PowerShell prompt:
    Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0"
  • 在 Windows Server 上,可通过 Server Manager 添加该功能,或使用 Install-WindowsFeature RSAT-AD-PowerShell cmdlet。
  • Import the module using:
    Import-Module ActiveDirectory
  • Set the execution policy if scripts are blocked. To run saved PS1 scripts, you may need to relax the execution policy for the current session using:
    Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
  • 确认您拥有所需权限。运行查询的账户需要对您打算查询的域或 OU 中的用户对象具有读取权限。标准认证用户默认可以读取大多数属性,但安全性较高的环境可能会限制此权限。

使用 PowerShell 获取经理的显示名称

检索带有 manager 属性的用户,然后将返回的 DN 解析为可读名称。先从单个用户开始:

Get-ADUser -Identity "jdoe" -Properties Manager | Select-Object Name, Manager

Manager 值是 DN,而非名称。将其传递给第二个 Get-ADUser 调用并请求 DisplayName:

$user = Get-ADUser -Identity "jdoe" -Properties Manager
if ($user.Manager) {
$manager = Get-ADUser -Identity $user.Manager -Properties DisplayName
Write-Host "The manager for $($user.Name) is $($manager.DisplayName)."
} else {
Write-Host "$($user.Name) does not have a manager assigned."
}

这个嵌套的 Get-ADUser 调用是关键模式。第一次调用返回经理的 DN,第二次调用使用该 DN 获取经理对象。if ($user.Manager) 检查防止了对无经理用户(如 CEO 或服务账户)产生错误。

DN 从右到左读取,从最通用的容器到最具体的对象。在 CN=Steve Graham,OU=Management,DC=skyy,DC=com 中,DC 部分标识域,OU=Management 是组织单位 (OU),CN=Steve Graham 是对象的通用名称。AD 以 DN 形式存储经理引用,因为 DN 是全局唯一且稳定的,而 DisplayName 可能会重复。

使用 PSCustomObject 构建自定义输出

PSCustomObject 从不同对象中提取的值组装成一个干净的、具名属性的记录。每个键成为一列,使输出整洁且可直接传递给 Export-Csv:

Get-ADUser -Filter * -Properties Manager | ForEach-Object {
$managerName = ""
if ($_.Manager) {
$managerName = (Get-ADUser -Identity $_.Manager -Properties DisplayName).DisplayName
}
[PSCustomObject]@{
Name = $_.Name
SamAccountName = $_.SamAccountName
Manager = $managerName
}
}

示例与用例

按经理筛选用户并查找直接下属

一旦知道经理的 DN,通过筛选 manager 属性找到所有向其汇报的用户:

$manager = Get-ADUser -Identity "jsmith"
Get-ADUser -Filter "Manager -eq '$($manager.DistinguishedName)'" |
Select-Object Name, SamAccountName

这会列出经理的直接下属。要将搜索范围限定在大型目录中的特定 OU,添加 -SearchBase:

Get-ADUser -Filter "Manager -eq '$($manager.DistinguishedName)'" `
-SearchBase "OU=Sales,DC=skyy,DC=com" |
Select-Object Name, SamAccountName

使用 Filter 参数与 LDAPFilter

-Filter 参数使用 PowerShell 自身的可读语法;-LDAPFilter 接受原始 LDAP 过滤器,更适合复杂条件。它们等效:

# PowerShell -Filter syntax
Get-ADUser -Filter "Manager -eq '$($manager.DistinguishedName)'"
# Equivalent -LDAPFilter syntax
Get-ADUser -LDAPFilter "(manager=$($manager.DistinguishedName))"

当条件采用 PowerShell 语法时,使用 -LDAPFilter,例如查找所有未设置经理的用户时使用 (!(manager=*))。

将带有经理详细信息的 AD 用户导出为 CSV

最常见的任务是生成包含所有用户及其经理的报告。此脚本解析每个经理的显示名称,处理空经理,添加电子邮件和部门列,并写入 CSV:

Get-ADUser -Filter * -Properties Manager, EmailAddress, Department | ForEach-Object {
$managerName = ""
if ($_.Manager) {
$managerName = (Get-ADUser -Identity $_.Manager -Properties DisplayName).DisplayName
}
[PSCustomObject]@{
Name = $_.Name
SamAccountName = $_.SamAccountName
Email = $_.EmailAddress
Department = $_.Department
Manager = $managerName
}
} | Export-Csv -Path "C:\Reports\UsersAndManagers.csv" -NoTypeInformation -Encoding UTF8

$managerName = "" 默认值确保无经理的用户也会出现在文件中,且该列为空。-NoTypeInformation 去除不需要的类型头,-Encoding UTF8 保留带重音符号的名称。在大型目录中,此脚本为每个用户执行单独查找,可能较慢。ADManager Plus 选项卡展示了更快且直观的替代方案。

使用递归获取完整管理链

要追踪用户的汇报链直到顶层,使用递归函数沿 manager 属性向上查找,直到遇到无经理的用户,作为递归终止条件:

function Get-ManagementChain {
param([string]$Identity)
$user = Get-ADUser -Identity $Identity -Properties Manager, DisplayName
Write-Output $user.DisplayName
if ($user.Manager) {
Get-ManagementChain -Identity $user.Manager
}
}
Get-ManagementChain -Identity "jdoe"

if ($user.Manager) 保护防止无限循环,在顶层停止。大型目录中每一级都是单独查询,建议在对多个用户执行此操作时,将解析的经理缓存到哈希表中。

使用 Set-ADUser 设置或更新 manager 属性

要分配或更改经理,使用 Set-ADUser 并加上 -Manager:

Set-ADUser -Identity "jdoe" -Manager "jsmith"

要清空该字段,设置为 $null:

Set-ADUser -Identity "jdoe" -Manager $null

对于批量更改,可使用包含 User 和 Manager 列的 CSV 驱动更新:

Import-Csv -Path "C:\Reports\ManagerUpdates.csv" | ForEach-Object {
Set-ADUser -Identity $_.User -Manager $_.Manager
}

使用 PowerShell 获取 AD 用户经理的限制

PowerShell 功能强大,但在用户及其经理的报告,尤其是大规模时,相较于 ADManager Plus 这类报告工具存在局限。

  • 复杂语法: 获取经理名称需要多条命令和手动处理 DN。
  • 错误处理: 脚本需要额外逻辑来处理无经理或不存在的用户。
  • 性能:处理成千上万的用户并进行重复的嵌套查找可能会很慢。

在 Active Directory Users and Computers 中查看用户的经理

Active Directory Users and Computers (ADUC) 在用户属性的组织选项卡上显示经理属性。这是检查单个用户经理的最快方法,无需编写任何脚本,并且它会将可分辨名称 (DN) 解析为可读名称。

在 ADUC 中查看用户经理的步骤

  1. 按下 Windows+R,输入 dsa.msc,然后按 Enter
  2. 在左侧窗格中,浏览到包含该用户的 OU,或使用 操作 > 查找 按名称或登录名搜索域。
  3. 右键单击用户对象,选择 属性
  4. 切换到 组织 选项卡。
  5. 用户的经理显示在 经理 字段中,显示为可读名称而非 DN。

在 ADUC 中查找直接下属

组织选项卡在经理字段下列出用户的直接下属,让您一目了然地看到反向关系。选择一条记录并点击 属性 打开该下属对象,或点击 添加/删除 调整向该用户汇报的人。

使用 ADUC 获取用户经理的限制

虽然 ADUC 适合单个用户的修改,但不适合报表生成:

  • ADUC 每个属性窗口仅显示单个用户的经理,无法同时查看多个用户。
  • 组织选项卡无法将用户与经理的列表导出为 CSV 或任何其他格式。
  • 没有内置方法可以跨整个 OU 或域报告经理或直接下属。
  • ADUC 仅显示直接经理和直接下属,不显示完整的汇报层级。

对于多用户查找和导出,请使用 PowerShell 或 ADManager Plus。

使用 ADManager Plus 获取 AD 用户的经理

ADManager Plus 提供无脚本、基于 GUI 的替代方案,用于检索经理、列出直接下属,并导出带有经理列的报表,还支持计划导出并自动通过电子邮件发送结果给相关人员。

获取 AD 用户经理的步骤

  1. 登录 ADManager Plus。
  2. 导航至 报表 > 用户报表 > 通用报表 > 所有用户
  3. 选择 OU,然后点击 生成
  4. 点击 添加/删除列,向结果中添加 经理 列。
  5. 使用 导出为 将报表导出为 CSV、PDF、XLSX、HTML 或 CSVDE。
使用 ADManager Plus 的预定义报告获取 AD 用户的经理。

团队选择 ADManager Plus 的原因

常见问题解答

经理属性不属于 Get-ADUser 返回的默认属性集。AD 为了性能限制默认输出,因此必须添加 -Properties Manager 才能检索该属性。

经理属性返回的是 DN。使用该 DN 作为身份运行第二个 Get-ADUser 调用,并请求 DisplayName,命令如下。

Get-ADUser -Identity $user.Manager -Properties DisplayName

打开 ADUC,右键单击用户,选择 属性,打开 组织 选项卡。经理 字段显示解析后的经理名称,直接下属 列表显示向该经理汇报的用户。

如果经理属性为空,使用 if ($user.Manager) 检查后再解析,以防止对 CEO 或服务账户等用户产生错误。

在 PowerShell 中,使用 Set-ADUser 配置用户的经理:

Set-ADUser -Identity "John" -Manager "Jacob"

在 ADUC 中,使用 Change 按钮,位于 Organization 选项卡下。

使用递归 PowerShell 函数,对每个经理调用 Get-ADUser,并沿着 manager 属性向上查找,直到找到没有分配经理的用户,从而结束递归。

只需几次点击即可获取用户的经理;无需编写脚本。

Active Directory管理与报告的一站式解决方案
电子邮件下载链接 Email the ADManager Plus download link