2009-03-10 2 views
7

В частности, я работаю с приложением, которое работает только на сервере Server 2008, если установлена ​​функция «Desktop Experience», и я хочу, чтобы установщик этого приложения подтвердил, что он есть.Как я могу программно проверить, установлена ​​ли функция сервера в Windows Server 2008?

Единственный способ, которым я знаю в настоящее время, - запустить ServerManagerCmd -query и проанализировать вывод; Я бы предпочел что-то более легкое (например, проверку раздела реестра).

ответ

8

Это фрагмент кода того, что я использую для его выполнения во время выполнения.

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

Это очень приятно ... и меня на полпути по моей проблеме (http://stackoverflow.com/questions/25573129/how-to-find-roles-on-a-server) Откуда вы знаете, если машина была повышена до контроллера домена? – user3174075

+1

Я пробовал свой код, и я получаю исключение «недопустимого класса» в этом «foreach (ManagementObject oReturn in oReturnCollection)» - любые идеи? – user3174075

+0

Я получаю ту же ошибку, что и @ user3174075 –

0

На моем 2008 x64 сервер станд тестирования Windows, под управлением этой команды (добавляет роли):

ServerManagerCmd.exe -install AS-AppServer-Foundation 

добавляет этот ключ реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppServer 

Эта команда (удаляет роль) :

ServerManagerCmd.exe -remove AS-AppServer-Foundation 

удаляет ключ. Поэтому я думаю, что это достаточно хороший показатель. Это только результаты моих собственных исследований/экспериментов и не являются официальным/поддерживаемым способом обнаружения, если настроена роль AppServer.