当管理者为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
关键逻辑解释
高效获取AD用户属性
不再使用-Properties *(会返回所有冗余属性),而是明确指定需要的属性,提升脚本运行效率。兼容管理者对象类型
使用Get-ADObject替代Get-ADUser获取管理者信息,因为它能识别并返回user和contact两种类型的AD对象。处理不同类型的管理者属性
- 对于AD用户:提取
UserPrincipalName作为邮箱,employeeID作为管理者ID - 对于联系人对象:提取
mail属性(联系人没有UserPrincipalName)作为邮箱,同样提取employeeID作为管理者ID - 添加
-ErrorAction SilentlyContinue避免因管理者DN无效(如已删除对象)导致脚本中断
- 对于AD用户:提取
优化性能
通过ForEach-Object一次性获取管理者对象,避免在Select-Object的计算属性中重复调用Get-ADObject,减少AD查询次数。
额外提示
如果你的联系人对象没有employeeID属性,可以根据实际存储的标识字段(比如displayName或自定义属性)调整脚本中的ManagerID取值逻辑。
内容的提问来源于stack exchange,提问作者Sylvie
相关产品推荐
相关产品推荐

