2013-04-18 3 views
13

У меня есть установщик webapp, который устанавливает все его предпосылки, включая IIS 7.Лучший способ установить IIS7 программно

Поскольку IIS не является обязательным условием в проекте установки Visual Studio, я придумал следующий код для установки IIS из кода (для ориентации на Windows Vista и 7).

private string ConfigureIIS7() 
{ 
    string output = string.Empty; 
    if (Environment.OSVersion.ToString().Contains("Microsoft Windows NT 5")) // Its WindowsXP [with or without SP2] 
    { 
     MessageBox.Show("IIS 6.0 is not installed on this machine. Please install the same and proceed with the installation or contact your administrator","Installer",MessageBoxButtons .OK ,MessageBoxIcon .Warning); 
     throw new System.Exception("IIS 6.0 is not installed on this machine."); 
    } 
    else 
    { 
     string CmdToExecute; 
     CmdToExecute = "cmd /c start /w pkgmgr /l:log.etw /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-Security;IIS-BasicAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI"; 
     Process prRunIIS = new Process(); 
     prRunIIS.StartInfo = new ProcessStartInfo("cmd.exe", CmdToExecute); 
     prRunIIS.StartInfo.UseShellExecute = false; 
     prRunIIS.StartInfo.RedirectStandardOutput = true; 
     prRunIIS.StartInfo.CreateNoWindow = true; 
     prRunIIS.Start(); 
     prRunIIS.WaitForExit(); 
     output = prRunIIS.StandardOutput.ReadToEnd(); 
    } 
    return output; 
} 

Этот код отлично работает до сих пор. Меня беспокоит только то, что часть установки занимает значительное время.

Теперь у меня есть возможность переписать некоторые коды и изменить пользовательский интерфейс установщика. Я только что пришел к этой части и задался вопросом, было ли это единственным решением для установки IIS из кода или может быть какой-то лучший способ, которого я не нашел?

Мне просто интересно узнать, какие другие способы установить IIS. Также приветствуются ответы, предназначенные для Windows 8.

ответ

9

Лучшим вариантом в будущем является использование DISM (обслуживание и обслуживание изображений развертывания). Это работает на Windows 7/Windows server 2008 R2 и выше. Все остальные варианты устарели.

Вот пример кода с минимальными функциями, необходимыми (вы можете легко добавить больше, если вам требуется различных них):

string SetupIIS() 
{ 
    var featureNames = new [] 
    { 
     "IIS-ApplicationDevelopment", 
     "IIS-CommonHttpFeatures", 
     "IIS-DefaultDocument", 
     "IIS-ISAPIExtensions", 
     "IIS-ISAPIFilter", 
     "IIS-ManagementConsole", 
     "IIS-NetFxExtensibility", 
     "IIS-RequestFiltering", 
     "IIS-Security", 
     "IIS-StaticContent", 
     "IIS-WebServer", 
     "IIS-WebServerRole", 
    }; 

    return ProcessEx.Run(
     "dism", 
     string.Format(
      "/NoRestart /Online /Enable-Feature {0}", 
      string.Join(
       " ", 
       featureNames.Select(name => string.Format("/FeatureName:{0}",name))))); 
}   

static string Run(string fileName, string arguments) 
{ 
    using (var process = Process.Start(new ProcessStartInfo 
    { 
     FileName = fileName, 
     Arguments = arguments, 
     CreateNoWindow = true, 
     WindowStyle = ProcessWindowStyle.Hidden, 
     RedirectStandardOutput = true, 
     UseShellExecute = false, 
    })) 
    { 
     process.WaitForExit(); 
     return process.StandardOutput.ReadToEnd(); 
    } 
} 

Это приведет к следующей команде:

dism.exe /NoRestart /Online /Enable-Feature /FeatureName:IIS-ApplicationDevelopment /FeatureName:IIS-CommonHttpFeatures /FeatureName:IIS-DefaultDocument /FeatureName:IIS-ISAPIExtensions /FeatureName:IIS-ISAPIFilter /FeatureName:IIS-ManagementConsole /FeatureName:IIS-NetFxExtensibility /FeatureName:IIS-RequestFiltering /FeatureName:IIS-Security /FeatureName:IIS-StaticContent /FeatureName:IIS-WebServer /FeatureName:IIS-WebServerRole 
+0

А как получить вывод int?рама возвращает стену текста – Mike

+0

@Mike, что с этим? – i3arnon

+0

Ну, если это программный путь, это было бы convienent, если результат вашего ProcessEx.Run() возвращает код. Dism возвращает строку правильно? Как я могу легко разобрать вывод, чтобы знать, что установка была успешной/неудачной и если ошибка, чтобы получить правильный код ошибки? – Mike

4

У вас есть пара вариантов здесь. Pkgmgr работает. Вы можете использовать ServerManagerCmd.exe (Windows Server), Dism.exe (новые операционные системы) и использовать флаги с сайта MS http://technet.microsoft.com/en-us/library/cc722041.aspx.

Я предлагаю выполнить этот компонент и, если возможно, обновить пользовательский интерфейс с уведомлением о ходе выполнения. Таким образом ваш пользователь будет знать, что все идет вперед.

Dism.exe должен работать с Windows 7, 8, 2008 и т. Д. Я бы запустил несколько тестов на виртуальной VM с установленными этими ОС, сделав снимок, а затем запустил установщик. Вы можете повторно применить снимок по своему усмотрению, и вы сможете протестировать все флаги, необходимые для работы программного обеспечения.

+0

У вас есть образцы кода для установки IIS с помощью dism.exe? –

+0

Dism.exe/online/enable-feature/featurename: IIS-WebServerRole и т. Д. – John

+0

ServerManagerCmd.exe устарел от Windows Server 2012 и далее – AlwaysAProgrammer

2

У меня была проблема с предлагаемым решением, так как я искал установку МНОГИХ функций. Приложение запустится, и оно будет завершено, но мое приложение будет ждать в ожидании вызова process.WaitForExit().

Просто FYI для кого-то другого, ищущего ответ. Если выходной результат слишком велик, а process.WaitForExit(), вы должны запустить что-то вроде этого:

string results = ""; 
while (!process.StandardOutput.EndOfStream) 
{ 
    results += process.StandardOutput.ReadLine(); 
} 

return results; 

мне нужен этот вывод в моем следующем шаге, поэтому я написал ReadLine() в строку, что я вернулся.