Domanda

Ho bisogno di query di controller di dominio corrente, probabilmente primaria per cambiare la password dell'utente.

(P) nome DC dovrebbe essere completo, vale a dire DC=pdc,DC=example,DC=com (come denominare correttamente tale notazione?)

Come può essere fatto utilizzando C #?

È stato utile?

Soluzione 3

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

Altri suggerimenti

Per recuperare le informazioni quando non esiste il DomainController in un dominio in cui la macchina non appartiene, avete bisogno di qualcosa di 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.

deve 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;
}

Se si sta cercando di interagire Active Directory, non si deve sapere dove il ruoli FSMO sono per la maggior parte. Se si desidera modificare la topologia dC dal programma (non sarebbe), sguardo al DomainController classe.

Se si desidera modificare una password utente, è possibile richiamare quelle azioni sull'oggetto utente, e Active Directory farà in modo che i cambiamenti siano correttamente replicate.

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

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");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top