TheBoubou
TheBoubou

Reputation: 19933

Get a full list of users from LDAP

I try to use the code below to get the full list of user. But I get the code "The server could not be contacted."

Any idea ?

Thanks,

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();
    }
}

Update : This code is working (from the same machine)

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: 

Upvotes: 1

Views: 11824

Answers (1)

T. Fabre
T. Fabre

Reputation: 1527

Your problem is that your arguments for PrincipalContext are not right : you're passing in an LDAP query in domainName, instead of the name and port of your domain controller. See MSDN for full documentation on that class.

Your second code post works because the class you're using is an LDAP client class, and it "understands" your ldap query.

Try the following and see if it works :

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();
    }
}

Hope that helps...

Upvotes: 3

Related Questions