我们的数据库应用程序的一个新要求是将用户表的内容与Active Directory中的用户同步。所以基本上我需要连接到Active Directory服务器并从plsql过程中检索用户名列表。
到目前为止,我所做的是使用自己的凭据连接到活动目录服务器,并查询一些属性。
示例:
ldap_password := '****';
ldap_user := 'cn=me,OU=Users,OU=mygroup,DC=mytown,DC=mycompany,DC=com';
ldap_base := 'OU=Users,OU=mygroup,DC=mytown,DC=mycompany,DC=com';
search_filter := '(&(objectClass=Person)!((sn=him)(cn=me)))';
res_attrs(1) := 'displayName';
res_attrs(2) := 'cn';
res_attrs(3) := 'telephoneNumber';
如果我已经知道其他人是谁,我似乎只能查询自己的属性或其他人的属性。
答案 0 :(得分:4)
我的脚本正常运行。范围设置使我无法查看所有数据。 DBMS_LDAP.SCOPE_SUBTREE
答案 1 :(得分:3)
勒内, 您可以通过Oracle的LDAP组件在Active目录中搜索所有已搜索过的内容。虽然我不是LDAP / AD的专家,但我相信您可能需要执行这些操作的权利,或者更好地获得具有权限的ID /密码(这样您可以将您的id / psw保留在系统之外并允许AD管理员支持的未启用的pswrd或pswrd。我知道我一直对AD有完全的查询访问权限,不确定这是我的设置方式还是开箱即用的功能。
但是看看@这个网站 http://www.oracle-base.com/articles/9i/LDAPFromPLSQL9i.php
正如文章所示,我建议我们将您的searchFilter减少(获得更多然后将其缩小直至满足您的需求)
l_attrs(1) := '*'; -- retrieve all attributes
l_retval :=
DBMS_LDAP.search_s(ld => l_session,
base => l_ldap_base,
scope => DBMS_LDAP.SCOPE_SUBTREE,
filter => 'objectclass=*',
attrs => l_attrs,
attronly => 0,
res => l_message);
答案 2 :(得分:1)
Active Directory有大约4个命名属性。
sAMAccountName
(又名Pre-Windows2000名称)是一个20个左右的字符短名称,在每个域中必须是唯一的。userPrinicipalName
,通常是sAMAccountName@domain.name,但事实证明AD几乎可以兑换任何字符串。 (我在实验上知道这一点,因为我们曾经在运行的AD域中意外地重置了6000个这样的值中的2000个。displayName
,显示在ADUC中(dsa.msc,Active Directory用户和计算机)CN=
部分。使用ADUC,CN通常是显示名称。但是,它也可以是LDAP名称中的任何合法内容。 那你要找哪个'名字'?基本上查询列表中的任何属性,看看你得到了什么。
至于查看其他对象,是的,您需要一个具有足够权限的帐户才能查看用户的这些属性。