我有一个 Active Directory 运行在Samba 4.6.3
带有Debian Jessie
.在 Windows 7 PC(AD 客户端)上,我安装了卫星天线从那里我使用管理员帐户管理服务器,但现在我需要以可读格式导出完整的用户列表,最好是.csv
使用卫星天线(从 Windows 中的客户端)到目前为止,我只能一次导出一个OU
(组织单位)内的所有对象,OU
无论是OU
用户容器还是 PC 容器,也就是说,我可以做我想做的事情(通过对每个用户容器重复该过程来导出完整的用户列表OU
,但我有很多OU
用户容器。
问题:有什么方法可以OU
快速导出完整的用户列表(包括名字和姓氏及其对应项),而无需进行这种迭代工作?
PD:答案不必局限于带有 RSAT 的 Windows 客户端,也可以在 Samba 服务器中
答案1
Bash 解决方案..部分...
首先提取 AD 内容:
ldapsearch -s -h <ADHOST> -P <ADPORT> -D <USERDN WITH RIGHTS TO READ AD> -W -E pr-1000/noprompt -b <BASEDN FOR SEARCH> > ad_extract_tmp.ldif
“-W”强制交互式提示输入用户密码。你不希望它出现在命令历史记录中。如果您将其组合到脚本中,则可以使用“-w”并保护密码访问。
现在内容已提取到文本文件中,我们可以使用文本处理将其转换为 CSV 或任何其他我们想要的格式。
ldif 文件已包装,因此第一步是解开它
awk ' BEGIN (RS="\n\n"; FS="\n "} {for (i=1,i<=NF;i++) printf $i; printf "\n\n"}' ad_extract_tmp.ldif > ad_extract_tmp.ldif.unwrapped
在这里,我们将记录重新定义为由具有两个行结尾的文本块组成,并将字段重新定义为由仅一个行结尾和一个空格的文本块组成。接下来,我们将每一行作为一个字段进行处理,将 ldif 包裹的类似内容(“\n”)连接到单个字段中。现在我们有了一个未包装的 ldif,最后一步是将 ldif 转换为 csv。
awk ' Begin {
record = "false";
print "\x22uid\x22,\x22dn\x22";
}
{ if ( record = "true") {
if ( $0 ~ /~sAMAccountName./) {
uid = $0;
sub (/^.*: /,"",uid);
}
if ( $0 ~ /^\s*$/) {
print "\x22" uid "\x22,\x22" dn "\x22";
dn = ""; record = "false";
}
}
}
{
if ($0 ~ /^dn:./) {
record = "true";
dn = $0;
}
}' ad_extract_tmp.ldif.unwrapped > ad_extract.csv
这是一个显着简化的 awk 转换脚本,可将未包装的 ldif 转换为 csv。
可以将 dn 提取到用户 ou 并跟踪所需的其他字段。只需扩展最终的 awk 脚本即可。