我需要能够通过LDAP服务器查询活动目录,从活动目录中查找已定义的ACTIVE用户列表。
我尝试通过成功连接到我的ldap服务器来完成此操作。在下面的java代码中,当使用accountExpires属性时,我只返回1条记录。我应该返回一个记录列表,每条记录显示ldap服务器上的DISPLAY NAME和MAIL属性。
这是我的代码:
public static void main(String[] args) {
ADUserAttributes adUserAttributes = new ADUserAttributes();
adUserAttributes.getLdapContext());
adUserAttributes.getActiveEmpRecordsList("0", adUserAttributes.getLdapContext());
}
public LdapContext getLdapContext(){
LdapContext ctx = null;
try{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "Simple");
env.put(Context.SECURITY_PRINCIPAL, "e~inventory");
env.put(Context.SECURITY_CREDENTIALS, "password");
env.put(Context.PROVIDER_URL, "ldap://xxxdc01.txh.org");
ctx = new InitialLdapContext(env, null);
System.out.println("Connection Successful.");
} catch(NamingException nex){
System.out.println("LDAP Connection: FAILED");
nex.printStackTrace();
}
return ctx;
}
private List<String> getActiveEmpRecordsList(String accountExpires, LdapContext ctx) {
List<String> activeEmpAttributes = new ArrayList<String>();
Attributes attrs = null;
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
String[] attrIDs = {"displayname", "mail"};
constraints.setReturningAttributes(attrIDs);
NamingEnumeration answer = ctx.search("DC=txh,DC=org", "accountExpires=" + accountExpires, constraints);
if (answer.hasMore()) {
attrs = ((SearchResult) answer.next()).getAttributes();
int empNameLen = attrs.get("displayname").toString().length();
int empEmailAddrLen = attrs.get("mail").toString().length();
activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
activeEmpAttributes.add(attrs.get("mail").toString().substring(6, empEmailAddrLen));
ctx.close();
}else{
throw new Exception("Invalid User");
}
System.out.println("activeEmpAttributes: " + activeEmpAttributes);
System.out.println("count: " + activeEmpAttributes.size());
} catch (Exception ex) {
ex.printStackTrace();
}
return activeEmpAttributes;
}
答案 0 :(得分:0)
您可以使用PrincipalSearcher
和“按示例查询”主体进行搜索:
// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// define a "query-by-example" principal - here, we search for active UserPrincipals
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.Enabled = true;
// create your principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
// find all matches
foreach(var found in srch.FindAll())
{
// do whatever here - "found" is of type "Principal" - it could be user, group, computer.....
}
如果您还没有 - 绝对阅读MSDN文章Managing Directory Security Principals in the .NET Framework 3.5,该文章很好地展示了如何充分利用System.DirectoryServices.AccountManagement
您可以在UserPrincipal
上指定任何属性,并将其用作PrincipalSearcher
的“按示例查询”。