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

当管理者为AD联系人而非用户账户时,如何获取AD用户的管理者信息?

解决AD管理者为联系人对象时的信息获取问题

这个场景确实很常见——当员工的管理者既有本地AD用户账户,又有外部办公室的联系人对象时,直接用Get-ADUser获取管理者信息会因为对象类型不匹配报错。我们可以通过先获取管理者的AD对象(兼容用户和联系人类型),再根据对象类别提取对应属性的方法来解决这个问题。

修改后的完整脚本

Get-ADUser -SearchBase "ou=accounts,ou=production,dc=int" -Filter * -Properties GivenName, Name, Surname, UserPrincipalName, employeeID, AccountExpirationDate, Department, Title, Manager | 
    ForEach-Object {
        # 先获取管理者对象(兼容user和contact类型)
        $managerObj = $null
        if ($_.Manager) {
            $managerObj = Get-ADObject -Identity $_.Manager -Properties employeeID, UserPrincipalName, mail -ErrorAction SilentlyContinue
        }

        # 构造输出对象
        [PSCustomObject]@{
            GivenName              = $_.GivenName
            Name                   = $_.Name
            Surname                = $_.Surname
            UserPrincipalName      = $_.UserPrincipalName
            employeeID             = $_.employeeID
            AccountExpirationDate  = if ($_.AccountExpirationDate) { $_.AccountExpirationDate.ToString("yyyy/MM/dd") } else { $null }
            Department             = $_.Department
            Title                  = $_.Title
            ManagerID              = $managerObj.employeeID
            ManagerEmail           = switch ($managerObj.ObjectClass) {
                                        'user' { $managerObj.UserPrincipalName }
                                        'contact' { $managerObj.mail }
                                        default { $null }
                                    }
        }
    } | 
    Export-CSV -Path C:\Users\ME\Desktop\ALL_AD_Accounts_HQ.csv -NoTypeInformation

关键逻辑解释

  1. 高效获取AD用户属性
    不再使用-Properties *(会返回所有冗余属性),而是明确指定需要的属性,提升脚本运行效率。

  2. 兼容管理者对象类型
    使用Get-ADObject替代Get-ADUser获取管理者信息,因为它能识别并返回user和contact两种类型的AD对象。

  3. 处理不同类型的管理者属性

    • 对于AD用户:提取UserPrincipalName作为邮箱,employeeID作为管理者ID
    • 对于联系人对象:提取mail属性(联系人没有UserPrincipalName)作为邮箱,同样提取employeeID作为管理者ID
    • 添加-ErrorAction SilentlyContinue避免因管理者DN无效(如已删除对象)导致脚本中断
  4. 优化性能
    通过ForEach-Object一次性获取管理者对象,避免在Select-Object的计算属性中重复调用Get-ADObject,减少AD查询次数。

额外提示

如果你的联系人对象没有employeeID属性,可以根据实际存储的标识字段(比如displayName或自定义属性)调整脚本中的ManagerID取值逻辑。

内容的提问来源于stack exchange,提问作者Sylvie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:47:30