Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get current LDAP Path dynamically

I'm developing a library with C# and .NET Framework 4.0.

I want to retrieve all active directory users and it works great. But my problem if I run my program on another domain I have to change this:

private static string ldapPath = "LDAP://DC=ic,DC=local";

And recompile it with the new data for the new domain.

Is there any way to get "LDAP://DC=ic,DC=local" dynamically?

like image 645
VansFannel Avatar asked Apr 30 '14 08:04

VansFannel


2 Answers

I've done the exact same thing few weeks ago. I used the System.DirectoryServices.ActiveDirectory library, and used the Domain and DomainController objects to find what you are looking for.

Here is the code I'm using:

public static class DomainManager
{
    static DomainManager()
    {
        Domain domain = null;
        DomainController domainController = null;
        try
        {
            domain = Domain.GetCurrentDomain();
            DomainName = domain.Name;
            domainController = domain.PdcRoleOwner;
            DomainControllerName = domainController.Name.Split('.')[0];
            ComputerName = Environment.MachineName;
        }
        finally
        {
            if (domain != null)
                domain.Dispose();
            if (domainController != null)
                domainController.Dispose();
        }
    }

    public static string DomainControllerName { get; private set; }

    public static string ComputerName { get; private set; }

    public static string DomainName { get; private set; }

    public static string DomainPath
    {
        get
        {
            bool bFirst = true;
            StringBuilder sbReturn = new StringBuilder(200);
            string[] strlstDc = DomainName.Split('.');
            foreach (string strDc in strlstDc)
            {
                if (bFirst)
                {
                    sbReturn.Append("DC=");
                    bFirst = false;
                }
                else
                    sbReturn.Append(",DC=");

                sbReturn.Append(strDc);
            }
            return sbReturn.ToString();
        }
    }

    public static string RootPath
    {
        get
        {
            return string.Format("LDAP://{0}/{1}", DomainName, DomainPath);
        }
    }
}

And then, You simply call DomainManager.DomainPath, everything is initialized once (it avoids resource leaks) or DomainName and so on. Or RootPath, which is very useful to initialize the root DirectoryEntry for DirectorySearcher.

I hope this answers your question and could help.

like image 53
Nate B. Avatar answered Oct 18 '22 21:10

Nate B.


Yes there is, what you are looking for is the default naming context, that information is held in the RootDSE context which is common to all domains:

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");

string defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value;
like image 32
Ashigore Avatar answered Oct 18 '22 21:10

Ashigore