2014-08-29 3 views
5

Ich versuche herauszufinden, ob die Active Directory-Domänendienste auf einem Windows-Server installiert sind.So ermitteln Sie, ob die Rolle "Active Directory-Domänendienste" auf einem Server installiert wurde

Ich weiß, dass sie im Server-Manager angezeigt, aber kann ich programmatisch, wenn die Rolle auf einem Server unter Verwendung von C# -Code

+0

Nach welchen Rollen fragen Sie? Alle oder nur DC? –

+0

Die Active Directory-Domänendienste-Rolle – user3174075

+0

Danke. Ich habe Ihren Titel geändert, um klarzustellen, dass Sie keinen allgemeinen Mechanismus zum Auffinden von _all_ Rollen auf dem Server benötigen. –

Antwort

3

Wenn Sie den Namen des Servers kennen Sie testen möchten, und können das Programm mit Domänenadministratorrechten remote ausführen, können Sie WMI verwenden:

internal static bool IsDomainController(string ServerName) 
{ 
    StringBuilder Results = new StringBuilder(); 

    try 
    { 
     ManagementObjectSearcher searcher = 
      new ManagementObjectSearcher("\\\\" + ServerName + "\\root\\CIMV2", 
      "SELECT * FROM Win32_ServerFeature WHERE ID = 10"); 

     foreach (ManagementObject queryObj in searcher.Get()) 
     { 
      Results.AppendLine(queryObj.GetPropertyValue("ID").ToString()); 
     } 
    } 
    catch (ManagementException) 
    { 
     //handle exception 
    } 

    if (Results.Length > 0) 
     return true; 
    else 
     return false; 
} 

Falls Sie lokal auf dem Server laufen lassen, der WMI-Pfad wechselt zu:

 ManagementObjectSearcher searcher = 
      new ManagementObjectSearcher("root\\CIMV2", 
      "SELECT * FROM Win32_ServerFeature WHERE ID = 10"); 

die MSDN reference on Win32_ServerFeature für eine vollständige Liste der Rollen und deren ID-Nummern anzeigen.

2

Wenn Ihre Frage, ob ein Server zu sehen, installiert ist, ist ein Domänencontroller ist, können Sie Zählen Sie die Domänencontroller in der Domäne auf, und überprüfen Sie den Hostnamen des Servers, auf dem Sie sitzen, um festzustellen, ob er mit einem dieser Server übereinstimmt. Um die Liste der Domänencontroller zu erhalten:

 var domainControllers = new List<string>(); 
     var domain = Domain.GetCurrentDomain(); 
     foreach (var dc in domain.DomainControllers) 
     { 
      domainControllers.Add(dc.Name); 
     } 
     string whoami = Dns.GetHostname(); 

Stellen Sie sicher, erforderliche Fehler hinzufügen Handhabung (wie wenn Sie diese auf einem Arbeitsgruppe-Computer ausführen, wird es sterben).

EDIT: Alternative Wege der DCPROMO Erfassen (weil es möglich ist, Domänendienste ohne DCPROMO zu installieren, und das ist eine schlechte Sache):

1) Parse (und prüfen für die Existenz) der Debug-Log das wird erstellt, wenn DCPROMO seine Sache macht. Sollte bei C werden: \ windows \ debug \ dcpromo.log

2) Dieser DSQUERY Befehl ist schnell und geben Ihnen alle Server, auf denen DCPROMO ran war:

dsquery * "cn=Sites,cn=Configuration,dc=MyDomain,dc=com" -Filter "(cn=NTDS Settings)" -attr distinguishedName whenCreated 

Problem ist immer, dass von Befehl Zeilenausgabe, wenn Sie es mit Process gestartet haben. Ich arbeite an einer Möglichkeit, dies zu tun und werde es aktualisieren, sobald ich es getestet habe, da ich die AD-Filterung für eine Weile nicht in einer Abfrage durchgeführt habe.

+0

Das kann lange dauern, wenn Sie viele Domänencontroller in der Domäne haben und wenn sie auf der ganzen Welt verteilt sind. Brauche etwas, das sehr schnell ist ... und nur für den Computer, auf dem das Programm läuft. – user3174075