无论您是需要查找用户的经理、解析经理的显示名称、列出经理的直接下属,还是将经理数据导出为 CSV,Get-ADUser PowerShell cmdlet 都是完成此任务的标准工具。本文将引导您完成从安装 Active Directory (AD) 模块到检索经理信息的每一步,并附有完整示例。我们还将展示如何使用 AD user reports 在 ADManager Plus —— 一个全面的 AD reporting tool 中,几次点击即可生成相同的报告。
manager 属性是一个 AD 用户属性,用于将一个用户对象链接到另一个。它不存储名称或电子邮件地址,而是存储经理的 DN 引用,即该经理对象在目录中的完整唯一路径。这使得 AD 能够模拟组织的汇报结构。每个用户最多只能指向一个经理,这条引用链是组织结构图、直接下属列表和管理链的基础。
由于 manager 属性不是默认属性集的一部分,Get-ADUser cmdlet 默认不会返回它,除非您明确请求。默认情况下,它只返回一小部分核心属性,如 name、sAMAccountName 和 distinguishedName。要获取用户的经理,必须添加 -Properties Manager 参数。AD 为了保持查询速度,会隐藏非默认属性,因此 cmdlet 只返回您明确请求的属性。
本页所有示例均依赖于 Windows PowerShell 的 AD 模块。开始之前,请确保该模块可用且您拥有相应权限。
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0"
Import-Module ActiveDirectory
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
检索带有 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 从不同对象中提取的值组装成一个干净的、具名属性的记录。每个键成为一列,使输出整洁且可直接传递给 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 参数使用 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=*))。
最常见的任务是生成包含所有用户及其经理的报告。此脚本解析每个经理的显示名称,处理空经理,添加电子邮件和部门列,并写入 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 -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 功能强大,但在用户及其经理的报告,尤其是大规模时,相较于 ADManager Plus 这类报告工具存在局限。
Active Directory Users and Computers (ADUC) 在用户属性的组织选项卡上显示经理属性。这是检查单个用户经理的最快方法,无需编写任何脚本,并且它会将可分辨名称 (DN) 解析为可读名称。
组织选项卡在经理字段下列出用户的直接下属,让您一目了然地看到反向关系。选择一条记录并点击 属性 打开该下属对象,或点击 添加/删除 调整向该用户汇报的人。
虽然 ADUC 适合单个用户的修改,但不适合报表生成:
对于多用户查找和导出,请使用 PowerShell 或 ADManager Plus。
ADManager Plus 提供无脚本、基于 GUI 的替代方案,用于检索经理、列出直接下属,并导出带有经理列的报表,还支持计划导出并自动通过电子邮件发送结果给相关人员。
经理属性不属于 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 属性向上查找,直到找到没有分配经理的用户,从而结束递归。