Determina il controller di dominio corrente a livello di codice

Devo interrogare il controller di dominio corrente, probabilmente primario per cambiare la password dell’utente.

(P) Il nome DC deve essere completo, ovvero DC=pdc,DC=example,DC=com (come denominare correttamente tale notazione?)

Come può essere fatto usando C #?

Per recuperare le informazioni quando il DomainController esiste in un Dominio in cui la tua macchina non appartiene, hai bisogno di qualcosa in più.

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

Stiamo usando qualcosa di simile per le nostre applicazioni interne.

Dovrebbe restituire qualcosa come 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; } 

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

Se stai cercando di interagire con Active Directory, non dovresti sapere dove sono per la maggior parte i ruoli di FSMO . Se si desidera modificare la topologia AD dal proprio programma (non lo farei), osservare la class DomainController .

Se si desidera modificare una password utente, è ansible richiamare tali azioni sull’object Utente e Active Directory farà in modo che le modifiche vengano correttamente replicate.

copiato da 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"); }