如何在Bash中通过用户sAMAccountName获取其经理的sAMAccountName
如何通过sAMAccountName查询用户经理的sAMAccountName
问题分析
你当前两步查询失败的核心原因是:从manager属性截取的CN值包含逗号、括号这类LDAP过滤器的特殊字符,未转义直接使用会导致过滤器语法错误,无法匹配到正确条目。此外,仅用CN查询还可能存在重名风险,不如直接使用经理的完整DN更可靠。
解决方案
方法1:修复特殊字符转义(适配你的两步查询逻辑)
先对截取的CN值中的特殊字符进行LDAP格式转义,再执行查询:
# 第一步:获取经理的CN值(保留原逻辑) mgr_cn=$(ldapsearch -H ldaps://vodaldaps-ala.voda.regn.net -x -w "$pass" -D "voda\amesh01" -b "OU=User Accounts,DC=voda,DC=regn,DC=net" "(&(objectclass=user)(samaccountname=john01))" manager | grep manager: | cut -d',' -f1,2 | cut -d'=' -f2 | tr -d '\') # 转义LDAP特殊字符:逗号(\2c)、左括号(\28)、右括号(\29) escaped_mgr_cn=$(echo "$mgr_cn" | sed -e 's/,/\\2c/g' -e 's/(/\\28/g' -e 's/)/\\29/g') # 第二步:使用转义后的CN查询 ldapsearch -v -x -LLL -H ldaps://vodaldaps-ala.voda.regn.net:636 -D 'voda\amesh01' -w "$pass" -b "dc=voda,dc=regn,dc=net" "(&(objectClass=user)(cn=$escaped_mgr_cn))" sAMAccountName
方法2:一步完成查询(更可靠高效)
直接提取经理的完整DN,然后用该DN作为查询条件,避免CN截取和转义的麻烦:
# 获取经理的完整DN mgr_dn=$(ldapsearch -H ldaps://vodaldaps-ala.voda.regn.net -x -w "$pass" -D "voda\amesh01" -b "OU=User Accounts,DC=voda,DC=regn,DC=net" "(&(objectclass=user)(samaccountname=john01))" manager | grep -Po '(?<=manager: ).*') # 通过DN查询经理的sAMAccountName ldapsearch -v -x -LLL -H ldaps://vodaldaps-ala.voda.regn.net:636 -D 'voda\amesh01' -w "$pass" -b "dc=voda,dc=regn,dc=net" "(&(objectClass=user)(distinguishedName=$mgr_dn))" sAMAccountName
方法3:使用LDAP扩展链式查询(一步到位)
如果你的LDAP服务器支持(Active Directory默认支持),可以用LDAP匹配扩展直接一步查询,无需分步:
# 直接查询目标用户的经理账号 ldapsearch -v -x -LLL -H ldaps://vodaldaps-ala.voda.regn.net:636 -D 'voda\amesh01' -w "$pass" -b "dc=voda,dc=regn,dc=net" "(&(objectClass=user)(distinguishedName:1.2.840.113556.1.4.1941:=(manager=*)(samaccountname=john01)))" sAMAccountName
关键提示
- LDAP过滤器中特殊字符必须转义,常见需要转义的字符:
* ( ) \ , = + < > # ;,转义格式为\加字符的十六进制ASCII码(比如逗号是\2c)。 - 使用DN查询比CN更可靠,因为DN是LDAP条目唯一标识,不会出现重名匹配错误。
内容的提问来源于stack exchange,提问作者Mayur Kadam
相关产品推荐
相关产品推荐

