c# .net active-directory domaincontroller domainservices

c# - Determine el controlador de dominio actual mediante programación



.net active-directory (4)

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

Necesito consultar el controlador de dominio actual, probablemente el primario para cambiar la contraseña del usuario.

(P) El nombre de DC debe estar totalmente calificado, es decir, DC=pdc,DC=example,DC=com (¿cómo nombrar correctamente tal notación?)

¿Cómo se puede hacer usando C #?


Estamos usando algo como esto para nuestras aplicaciones internas.

Debería devolver algo como 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; }


Para recuperar la información cuando DomainController existe en un dominio en el que su máquina no pertenece, necesita algo más.

DirectoryContext domainContext = new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword"); var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext); var controller = domain.FindDomainController();


Si está buscando interactuar con Active Directory, no debería tener que saber dónde están los roles de FSMO en su mayor parte. Si desea cambiar la topología de AD de su programa (no lo haría), mire la clase DomainController .

Si desea cambiar una contraseña de usuario, puede invocar esas acciones en el objeto Usuario, y Active Directory se asegurará de que los cambios se repliquen correctamente.

copiado de 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"); }