2009-03-10 14 views
7

Específicamente, estoy trabajando con una aplicación que solo se ejecuta en Server 2008 si está instalada la función "Experiencia de escritorio", y me gustaría que el instalador de esa aplicación verifique que esté allí.¿Cómo puedo verificar mediante programación si hay una característica del servidor instalada en Windows Server 2008?

La única forma que conozco actualmente es ejecutar ServerManagerCmd -query y analizar la salida; Preferiría algo más liviano (como verificar una clave de registro).

Respuesta

8

Este es un fragmento de código de lo que uso para hacerlo en tiempo de ejecución.

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

Esto es muy bueno ... y me lleva a la mitad de mi problema (http://stackoverflow.com/questions/25573129/how-to-find-roles-on-a-server) ¿Cómo se puede saber si Sin embargo, la máquina ha sido promocionada a un controlador de dominio. – user3174075

+1

Probé tu código y recibo una excepción de "clase inválida" en este 'foreach (ManagementObject oReturn in oReturnCollection)' - ¿alguna idea? – user3174075

+0

Obtengo el mismo error que @ user3174075 –

0

En mi servidor std 2008 x64 pruebas de Windows que se ejecuta este comando (se suma el papel):

ServerManagerCmd.exe -install AS-AppServer-Foundation 

agrega esta clave del Registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppServer 

Este comando (quita el papel) :

ServerManagerCmd.exe -remove AS-AppServer-Foundation 

quita la llave Entonces, creo que es un buen indicador. Estos son solo los resultados de mi propia investigación/experimento y no son una forma oficial/compatible de detectar si la función de AppServer está configurada.

Cuestiones relacionadas