2009-03-10 10 views
7

In particolare, sto lavorando con un'applicazione che viene eseguita solo su Server 2008 se è installata la funzione "Esperienza desktop" e mi piacerebbe che l'installer dell'applicazione verificasse che fosse lì.Come è possibile verificare a livello di programmazione se una funzionalità del server è installata in Windows Server 2008?

L'unico modo che conosco attualmente è eseguire ServerManagerCmd -query e analizzare l'output; Preferirei qualcosa di più leggero (come controllare una chiave di registro).

risposta

8

Questo è uno snippet di codice di ciò che uso per farlo in fase di esecuzione.

public static bool isServerFeatureInstalled(Win32_ServerFeature_ID id) 
{ 
    bool idFound = false; 
    ConnectionOptions connectionOptions = new ConnectionOptions(); 
    ManagementScope managementScope = 
     new ManagementScope(
      @"\\localhost\root\cimv2", connectionOptions); 

    ObjectQuery oQuery = 
     new ObjectQuery("SELECT Id FROM Win32_ServerFeature"); 
    ManagementObjectSearcher oSearcher = 
     new ManagementObjectSearcher(managementScope, oQuery); 
    ManagementObjectCollection oReturnCollection = oSearcher.Get(); 

    foreach (ManagementObject oReturn in oReturnCollection) 
    { 
     if ((uint) (oReturn["ID"]) == (uint) id) 
     { 
      return true; 
     } 
    } 
    return idFound; 
} 

// short list of names and values taken from MSDN. 
public enum Win32_ServerFeature_ID 
{ 
    Application_Server = 1, 
    Web_Server = 2, 
    Media_Server = 3, 
    Windows_Sharepoint_Services = 4, 
    Fax_Server = 5, 
    File_Services = 6, 
    Print_Services = 7, 
    Active_Directory_Federation_Services = 8, 
    Active_Directory_Lightweight_Directory_Services = 9, 
    Active_Directory_Domain_Services = 10, 
    UDDI_Services = 11, 
    DHCP_Server = 12, 
    DNS_Server = 13, 
    Network_Policy_and_Access_Services = 14, 
    Certificate_Server = 16, 
    Active_Directory_Rights_Management_Services = 17, 
    Terminal_Services = 18, 
    Windows_Deployment_Services = 19, 
    Failover_Clustering = 33, 
    Network_Load_Balancing = 34, 
    Desktop_Experience = 35, 
    DOTNET_Framework_30 = 36, 
} 
+0

Questo è molto bello ... e mi trova a metà strada sul mio problema (http://stackoverflow.com/questions/25573129/how-to-find-roles-on-a-server) Come fai a sapere se la macchina è stata promossa a un controller di dominio? – user3174075

+1

Ho provato il codice e ricevo un'eccezione di "classe non valida" su questo 'foreach (ManagementObject oReturn in oReturnCollection)' - qualche idea? – user3174075

+0

Ottengo lo stesso errore di @ user3174075 –

0

Sul mio assistente std 2008 x64 test di Windows in esecuzione di questo comando (aggiunge il ruolo):

ServerManagerCmd.exe -install AS-AppServer-Foundation 

aggiunge questa chiave di registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppServer 

Questo comando (rimuove il ruolo) :

ServerManagerCmd.exe -remove AS-AppServer-Foundation 

rimuove la chiave. Quindi penso che sia un indicatore abbastanza buono. Questi sono solo i risultati della mia ricerca/esperimento e non è un metodo ufficiale/supportato per rilevare se il ruolo di AppServer è configurato.

Problemi correlati