如何在PowerShell脚本中提取AD用户Manager字段的manager-id?
解决方法
有两种实用方式可以提取Manager的ID,推荐第二种更可靠的AD原生处理方法:
方法一:正则表达式提取
直接从LDAP路径字符串里匹配CN=后到第一个逗号前的内容:
修改代码里Manager的赋值部分即可:
Manager = if ($user.Manager) { [regex]::Match($user.Manager, 'CN=([^,]+)').Groups[1].Value } else { $null }
说明:正则CN=([^,]+)会精准捕获CN=开头后所有非逗号的字符,也就是我们要的manager-id。加if判断是为了处理用户未设置Manager的情况,避免报错。
方法二:通过AD对象获取(更可靠)
既然在AD环境中,直接通过$user.Manager的LDAP路径获取对应的AD用户对象,再取其登录ID或名称属性,这种方式更准确,尤其适合CN和登录ID不一致的场景:
修改代码中Manager的赋值部分:
Manager = if ($user.Manager) { (Get-ADUser -Identity $user.Manager).SamAccountName } else { $null }
说明:如果$user.Manager不为空,就用Get-ADUser获取该管理员的AD对象,取SamAccountName作为Manager的值;为空则赋值$null,避免CSV中出现无效内容。
完整修改后的代码
Class CustomAdInfo { $UserName $Group $Email $Manager } [char] 'y'..[char] 'z' | ForEach-Object { $getADUserSplat = @{ Filter = "Name -like '$_*'" Properties = 'SamAccountName', 'memberOf', 'EmailAddress', 'Manager' ResultPageSize = 256 SearchBase = 'CN=Users,DC=ab,DC=cd' } foreach ($user in Get-ADUser @getADUserSplat) { foreach ($group in $user.MemberOf | Get-ADGroup) { [CustomAdInfo]@{ UserName = $user.SamAccountName Group = $group.Name Email = $user.EmailAddress # 这里用的是方法二的写法,如需用正则替换成方法一的代码即可 Manager = if ($user.Manager) { (Get-ADUser -Identity $user.Manager).SamAccountName } else { $null } } } } } | Export-Csv 'C:\Users\Downloads\Members_and_Groups.csv' -NoTypeInformation
注意:最后加-NoTypeInformation参数可以避免CSV开头出现#TYPE CustomAdInfo的无用行,输出更规范。
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

