我正在尝试从MS AD中检索一些信息:特定分支的成员,部门名称,职位etc。
我使用了很多示例,包括Apache Directory LDAP API和UnboundID,但我无法与AD建立联系。
的RDN:
C:\Users\Aleksey> whoami /fqdn
CN=my common name here,
OU=my organization unit here,
OU=organization unit 2 here,
OU=organization unit 1 here,
OU=main organization unit here,
DC=.my domain here,
DC=domain 2 here,
DC=main domain here
为了搜索,我使用以下过滤器:
public class LdapRetriever {
public static void main (String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://" +
"ip of domain controller here" + ":389");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
// Also I try to use the following SECURITY_PRINCIPAL:
// my login only, my domain\ my login
env.put(Context.SECURITY_PRINCIPAL, "my login here" + "@" +
"my domain here.domain 2 here.main domain here");
env.put(Context.SECURITY_CREDENTIALS, "my password here");
try {
DirContext ctx = new InitialLdapContext(env,null);
String returnedAtts[]={"sn","title","department","givenName"};
SearchControls searchCtls = new SearchControls();
searchCtls.setReturningAttributes(returnedAtts);
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String searchFilter = "(&(objectClass=user)(cn=*))";
String searchBase =
"DC=my domain here,DC=domain 2 here,DC=main domain here";
NamingEnumeration answer = ctx.search(searchBase,
searchFilter, searchCtls);
...
当我使用env
中的数据创建目录上下文时,我得到一个例外:
Exception in thread "main" javax.naming.AuthenticationException:
[LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment:
AcceptSecurityContext error, data 531, vece
如果未指定密码,我会收到以下异常:
Problem searching directory:
javax.naming.NamingException:[LDAP:error code 1 - 00000000:
LdapErr: DSID-0C090627, comment:
In order to perform this operation a successful bind must be completed
on the connection., data 0, vece]; remaining name
'DC=my domain here,DC=domain 2 here,DC=main domain here'
我已核实我的帐户未锁定。
根据the list of common active directory LDAP bind errors:
525 user not found 52e invalid credentials 530 not permitted to logon at this time 531 not permitted to logon at this workstation 532 password expired 533 account disabled 701 account expired 773 user must reset password 775 user account locked
在我的情况下,它意味着:“不允许在此工作站登录”,但使用相同的凭据我可以登录到域。
可能是什么原因?
我将非常感谢这些信息。谢谢大家。
答案 0 :(得分:3)
错误代码531很可能与AD的配置有关。
在某些情况下,用户只能从一个工作站登录,例如您的工作电脑。
这是在用户的 userWorkstations 字段中配置的。
当您无法使用RDP登录AD时,您需要AD管理员检查您的帐户以查找此字段,并且AD服务器已包含在 userWorkstations 中,或者该字段已完全删除
答案 1 :(得分:1)
我的项目使用ldap auth。 我把你的来源与我的impl进行了比较。除了SECURITY_PRINCIPAL参数外,它们是相同的。
它对我有用:
String login = "login";
String base = "ou=People,dc=example,dc=com";
String dn = "uid=" + login + "," + base;
env.put( Context.SECURITY_PRINCIPAL, dn );
答案 2 :(得分:1)
您可以通过发出以下内容从DC确定用户的FDN: { dsquery user -samid jim
“CN = Jim Willeke,CN = Users,DC = mad,DC = willeke,DC = com” }
我们有一些JNDI Samples适用于AD(假设您知道正确的参数)
您可能会发现使用LDAP浏览器并使用它进行身份验证更容易,然后您就知道哪些参数可以使用。我们喜欢Apache Studio。