我的一个 Mac 启动脚本需要从 AD 中获取一个属性,而这个属性不是我使用内置工具 dscl 可以看到的属性之一,该工具几乎仅限于用户、组和计算机搜索。通常我只会执行原始 ldap 查询,但我需要在用户登录提供凭据之前执行此操作。内置 dscl 显然可以在没有用户身份验证的情况下从 AD 中获取数据,因此我认为在计算机帐户上下文或其他情况下一定有一种方法可以做到这一点。不幸的是,到目前为止,我的 googlefu 完全让我失望了。
答案1
我想我会自己回答这个问题。我的需求是使用 perl,但如何在直接的 shell 脚本中执行相同操作应该非常明显。我只需要从 ActiveDirectory.plist 中获取机器凭据
sub get_LDAPEntries
{
my ($LDAPServer, $LDAPPort, $LDAPsearchbase, $LDAPfilter) = @_;
my $kerbID = `/usr/libexec/PlistBuddy /Library/Preferences/DirectoryService/ActiveDirectory.plist -c "print :'AD Computer Kerberos ID'"`;
chomp $kerbID;
my $password = `/usr/libexec/PlistBuddy /Library/Preferences/DirectoryService/ActiveDirectory.plist -c "print :'AD Computer Password'"`;
chomp $password;
my $LDAPSession = Net::LDAP->new($LDAPServer, port=>$LDAPPort);
$LDAPSession->bind($kerbID, password => $password) or die("Could not connect to LDAP server.");
my $results = $LDAPSession->search(base=>$LDAPsearchbase,filter=>$LDAPfilter);
$results->code && die "There was an error in the LDAP search: " . $results->error;
$LDAPSession->unbind;
my @LDAPEntries = $results->entries;
return @LDAPEntries;
}
更新:这仅适用于 Snow Leopard (10.6)。Lion (10.7) 将 AD 密码存储在钥匙串中,您需要使用“安全”命令行实用程序来获取它……坦率地说,这有点麻烦,因为密码被输出到 stderr,而查询的其余部分被发送到 stdout。我将宣布 Lion 支持超出范围 :-P