Pregunta

Necesito consulta controlador de dominio actual, probablemente primaria a cambio de contraseña de usuario.

(P) denominación DC debe ser completo, es decir DC=pdc,DC=example,DC=com (cómo nombrar adecuadamente esa notación?)

¿Cómo se puede hacer usando C #?

¿Fue útil?

Solución 3

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

Otros consejos

Para recuperar la información cuando exista la DomainController en un dominio en el que su máquina no pertenecen, se 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();

Estamos utilizando algo como esto para nuestras aplicaciones internas.

debería devolver algo así 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;
}

Si usted está buscando para interactuar Active Directory, no deberías tener que saber dónde está el funciones FSMO son en su mayor parte. Si desea cambiar la topología de AD de su programa (que no lo haría), vistazo a la clase DomainController .

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

http: //www.rootsilver. com / 2007/08 / cómo-a-cambio-a-usuario-contraseña

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");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top