Determine current domain controller programmatically

前端 未结 4 1620
后悔当初
后悔当初 2020-12-18 02:20

I need to query current domain controller, probably primary to change user password.

(P)DC name should be fully qualified, i.e. DC=pdc,DC=example,DC=com

相关标签:
4条回答
  • 2020-12-18 02:51

    To retrieve the information when the DomainController exists in a Domain in which your machine doesn't belong, you need something more.

      DirectoryContext domainContext =  new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword");
    
      var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
      var controller = domain.FindDomainController();
    
    0 讨论(0)
  • 2020-12-18 02:57

    We are using something like this for our internal applications.

    Should return something like DC=d,DC=r,DC=ABC,DC=com

    public static string RetrieveRootDseDefaultNamingContext()
    {
        String RootDsePath = "LDAP://RootDSE";
        const string DefaultNamingContextPropertyName = "defaultNamingContext";
    
        DirectoryEntry rootDse = new DirectoryEntry(RootDsePath)
        {
            AuthenticationType = AuthenticationTypes.Secure;
        };
        object propertyValue = rootDse.Properties[DefaultNamingContextPropertyName].Value;
    
        return propertyValue != null ? propertyValue.ToString() : null;
    }
    
    0 讨论(0)
  • 2020-12-18 03:00

    If you are looking to interact the Active Directory, you shouldn't have to know where the FSMO roles are for the most part. If you want to change the AD topology from your program (I wouldn't), look at the DomainController class.

    If you want to change a user password, you can invoke those actions on the User object, and Active Directory will make sure that the changes are properly replicated.

    copied from http://www.rootsilver.com/2007/08/how-to-change-a-user-password

    public static void ChangePassword(string userName, string oldPassword, string newPassword)
    {
            string path = "LDAP://CN=" + userName + ",CN=Users,DC=demo,DC=domain,DC=com";
    
            //Instantiate a new DirectoryEntry using an administrator uid/pwd
            //In real life, you'd store the admin uid/pwd  elsewhere
            DirectoryEntry directoryEntry = new DirectoryEntry(path, "administrator", "password");
    
            try
            {
               directoryEntry.Invoke("ChangePassword", new object[]{oldPassword, newPassword});
            }
            catch (Exception ex)  //TODO: catch a specific exception ! :)
            {
               Console.WriteLine(ex.Message);
            }
    
            Console.WriteLine("success");
    }
    
    0 讨论(0)
  • 2020-12-18 03:10

    (requires System.DirectoryServices.AccountManagement.dll):

    using (var context = new System.DirectoryServices.AccountManagement.PrincipalContext(ContextType.Domain))
    {
        string server = context.ConnectedServer; // "pdc.examle.com"
        string[] splitted = server.Split('.'); // { "pdc", "example", "com" }
        IEnumerable<string> formatted = splitted.Select(s => String.Format("DC={0}", s));// { "DC=pdc", "DC=example", "DC=com" }
        string joined = String.Join(",", formatted); // "DC=pdc,DC=example,DC=com"
    
        // or just in one string
    
        string pdc = String.Join(",", context.ConnectedServer.Split('.').Select(s => String.Format("DC={0}", s)));
    }
    
    0 讨论(0)
提交回复
热议问题