我在用ldap搜索在 Debian 9 Linux 机器上查询 MS Active Directory。我想查询/查找我的组“mygroupname”中的所有用户。命令
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" member
输出如下:
dn: CN=mygroupname,OU=user,DC=mydc,DC=com
member: CN=Paula Normal,OU=whatever,OU=...,OU=...,OU=...,DC=mydc,DC=com
member:: Q049QmV0dGluYSBUw7Zs...................9nbmUsT1U9RGV1dHNjwdGEsREM9Y29t
member: CN=Peter Testman,OU=whatever2,OU=...,OU=...,OU=...,DC=mydc,DC=com
...
我将输出与 AD-GUI 进行了比较。第二个条目应该是另一个有效用户,但输出却出乎意料且不可读。缺少 CN、OU、DC 信息。我发现奇怪的条目是有效的,但经过了 base64 编码。
问题出在哪里?AD 中是否存在损坏?我的查询命令是否错误?为什么有些条目是经过 base64 编码的。如何获得正确的输出?
答案1
你的命令行
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" member
明确限制搜索中请求的属性成员。
只需尝试将所需的属性名称添加为附加命令行参数:
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" cn ou o member
也可以看看:ldap搜索(1)
此外,您还应该了解 LDIF 语法(请参阅RFC 2849) 应该是 ASCII 干净的。属性类型名称后面的两个双冒号表示该值是基本编码的,例如,因为名称中有非 ASCII 字符。使用合适的 LDIF 模块进行解码ldap搜索输出或者更好地使用您最喜欢的脚本语言的 LDAP 模块。
答案2
输出结果意外的原因是 cn-name 中有一个非 ASCII 字符。以“member:: ”开头的行表示一个 base64 编码的值,可以对其进行解码(例如echo "$value" | base64 -d -
)
ldapsearch 的搜索结果使用 LDIF 的扩展版本显示。
LDIF 语法(参见RFC 2849) 被认为是 ASCII 干净的。
可以使用类似这样的包装器来快速获得可读的输出
myldapsearch() { ldapsearch $* | perl -MMIME::Base64 -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode_base64($1)/eg;print'; }
出现在这问题。