2012-05-29 42 views
1

我尝试使用下面的代码获取用户的完整列表。但是我得到代码“服务器无法联系。”从LDAP获取用户的完整列表

有什么想法?

感谢,

static void Main(string[] args) 
{ 
    string groupName = "Domain Users"; 
    string domainName = "LDAP://ldap.mycompany.be:389/ou=users,o=mycompany,dc=mycompany,dc=be"; 

    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName); 
    GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupName); 

    if (grp != null) 
    { 
     foreach (Principal p in grp.GetMembers(false)) 
     { 
      Console.WriteLine(String.Format("{0} - {1}", p.SamAccountName, p.DisplayName)); 
     } 


     grp.Dispose(); 
     ctx.Dispose(); 
     Console.ReadLine(); 
    } 
    else 
    { 
     Console.WriteLine("\nWe did not find that group in that domain, perhaps the group resides in a different domain?"); 
     Console.ReadLine(); 
    } 
} 

更新:此代码工作(从同一台机器)

static void Main(string[] args) 
{ 
    string userUid = "myuser"; 


    DirectoryEntry Ldap = new DirectoryEntry("LDAP://ldap.mycompany.be:389/ou=users,o=mycompany,dc=mycompany,dc=be", "", "", AuthenticationTypes.Anonymous); 
    DirectorySearcher LdapSearcher = new DirectorySearcher(Ldap, String.Format("(&(objectClass=*)(uid={0}))", userUid)); 


    LdapSearcher.PropertiesToLoad.Add("cn"); 
    LdapSearcher.PropertiesToLoad.Add("uid"); 
    LdapSearcher.PropertiesToLoad.Add("mail"); 
    LdapSearcher.PropertiesToLoad.Add("employeeNumber"); 
    LdapSearcher.PropertiesToLoad.Add("facsimileTelephoneNumber"); 
    LdapSearcher.PropertiesToLoad.Add("foremfunction"); 
    LdapSearcher.PropertiesToLoad.Add("foremservice"); 
    LdapSearcher.PropertiesToLoad.Add("foremsite"); 
    LdapSearcher.PropertiesToLoad.Add("inetUserStatut"); 
    LdapSearcher.PropertiesToLoad.Add("telephoneNumber"); 
    LdapSearcher.PropertiesToLoad.Add("uid"); 
    LdapSearcher.PropertiesToLoad.Add("mail"); 
    SearchResultCollection LdapSearcherResults = LdapSearcher.FindAll(); 

    foreach (SearchResult resultLdap in LdapSearcherResults) 
    { 
     Console.WriteLine(resultLdap.Properties["cn"][ 0].ToString()); 
     Console.WriteLine(resultLdap.Properties["uid"][0].ToString()); 
     Console.WriteLine(resultLdap.Properties["mail"][0].ToString()); 
    } 
} 

UPDATE2

System.NullReferenceException was unhandled 
    Message=Object reference not set to an instance of an object. 
    Source=System.DirectoryServices.AccountManagement 
    StackTrace: 
     at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties) 
     at System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval() 
     at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password) 
     at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name) 
     at MoulinetteUser.Program.Main(String[] args) in C:\Users\.....\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

你尝试与您的开发机LDAP工具连接字符串? –

+0

请详细说明。你可以使用LDAP工具浏览吗?任何防火墙?等等...... – Reniuz

+0

查看我的更新1 –

回答

3

你的问题是,你的论点为PrincipalConte xt不正确:您传递的是domainName中的LDAP查询,而不是域控制器的名称和端口。请参阅该类别的MSDN for full documentation

您的第二个代码发布是有效的,因为您使用的类是LDAP客户端类,它“理解”了您的ldap查询。

请尝试以下,看看它的工作原理:

static void Main(string[] args) 
{ 
    string groupName = "Domain Users"; 
    string domainName = "ldap.mycompany.be"; // or whatever your domain controller's name is... 

    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName); 
    GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupName); 

    if (grp != null) 
    { 
     foreach (Principal p in grp.GetMembers(false)) 
     { 
      Console.WriteLine(String.Format("{0} - {1}", p.SamAccountName, p.DisplayName)); 
     } 


     grp.Dispose(); 
     ctx.Dispose(); 
     Console.ReadLine(); 
    } 
    else 
    { 
     Console.WriteLine("\nWe did not find that group in that domain, perhaps the group resides in a different domain?"); 
     Console.ReadLine(); 
    } 
} 

希望帮助...

+0

在“PrincipalContext ctx”行上,几秒钟后出现此错误“未将对象引用设置为对象的实例。”谢谢你的帮助。 –

+0

在此行上:PrincipalContext ctx = new PrincipalContext(ContextType.Domain,domainName); ?什么是异常跟踪? –

+0

是的,请参阅我的update2以获取异常跟踪。 –