Determinare controller di dominio corrente a livello di codice
-
26-09-2019 - |
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 #?
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");
}