2014-08-29 12 views
5

Sto cercando di capire se i Servizi di dominio Active Directory sono installati su un server Windows.Come determinare se il ruolo "Servizi di dominio Active Directory" è stato installato su un server

so si fanno vedere in Server Manager, ma posso programmazione ottenere se il ruolo è installato su un server utilizzando C# codice

+0

Quali ruoli stai chiedendo? Tutti loro o solo DC? –

+0

Il ruolo Servizi di dominio Active Directory – user3174075

+0

Grazie. Ho cambiato il titolo per chiarire che non è necessario un meccanismo generale per trovare tutti i ruoli sul server. –

risposta

3

Se si conosce il nome del server che si desidera verificare e possibile eseguire il programma con i privilegi di amministratore del dominio remoto, è possibile utilizzare WMI:

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

Se si sta eseguendo che localmente sul server, il percorso WMI cambia in:

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

Vedere la MSDN reference on Win32_ServerFeature per una lista completa dei ruoli e dei loro numeri ID.

2

Se la tua domanda è quello di vedere se un server è un controller di dominio, è possibile enumerare i controller di dominio nel dominio e controllare il nome host del server su cui ci si trova per vedere se corrisponde a uno di essi. Per ottenere l'elenco dei controller di dominio:

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

Assicurarsi di aggiungere requisito gestione degli errori (come se si esegue questo su un computer del gruppo di lavoro, morirà).

EDIT: modi alternativi di rilevazione DCPROMO (perché è possibile installare Servizi di dominio senza DCPROMO, e questa è una brutta cosa):

1) analizzare fuori (e verificare l'esistenza di) il registro di debug che viene creato quando DCPROMO fa la sua cosa. Dovrebbe essere situato in c: \ windows \ debug \ Dcpromo.log

2) Questo comando DSQUERY è VELOCE e vi darà tutti i server in cui è stato eseguito DCPROMO:

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

problema sta che dal comando output di linea se l'hai iniziato usando Process. Lavorare su un modo per farlo e verrà aggiornato una volta che l'ho testato, in quanto non ho fatto il filtro AD in una query per un po '.

+0

Questo può richiedere molto tempo se nel dominio è presente un gran numero di controller di dominio e se sono distribuiti in tutto il mondo. Hai bisogno di qualcosa che sia molto veloce ... e solo per il computer su cui è in esecuzione il programma. – user3174075

Problemi correlati