Determinar controlador de dominio actual mediante programación
-
26-09-2019 - |
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 #?
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");
}