2009-03-10 4 views
7

Plus précisément, je travaille avec une application qui ne fonctionne que sur Server 2008 si la fonction "Expérience de bureau" est installée, et j'aimerais que le programme d'installation de cette application vérifie qu'il est présent.Comment puis-je vérifier par programme si une fonctionnalité de serveur est installée dans Windows Server 2008?

La seule façon dont je suis actuellement au courant est d'exécuter ServerManagerCmd -query et d'analyser la sortie; Je préférerais quelque chose de plus léger (comme vérifier une clé de registre).

Répondre

8

Ceci est un extrait de code de ce que j'utilise pour le faire à l'exécution.

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

Ceci est très agréable ... et obtient moi à mi-chemin sur mon problème (http://stackoverflow.com/questions/25573129/how-to-find-roles-on-a-server) Comment savez-vous si la machine a été promue à un contrôleur de domaine cependant? – user3174075

+1

J'ai essayé votre code et j'obtiens une exception "classe invalide" sur ce 'foreach (ManagementObject oReturn in oReturnCollection)' - des idées? – user3174075

+0

J'ai la même erreur que @ user3174075 –

0

Sur mes tests Windows 2008 serveur x64 std exécutant cette commande (ajoute le rôle):

ServerManagerCmd.exe -install AS-AppServer-Foundation 

ajoute cette clé de Registre:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppServer 

Cette commande (supprime le rôle) :

ServerManagerCmd.exe -remove AS-AppServer-Foundation 

supprime la clé. Donc je pense que c'est un assez bon indicateur. Ce sont simplement les résultats de ma propre recherche/expérience et ce n'est pas un moyen officiel/supporté de détecter si le rôle AppServer est configuré.

Questions connexes