Modo migliore per installare IIS7 a livello di codice

Ho un installer webapp che installa tutti i suoi prerequisiti, incluso anche IIS 7.

Dal momento che IIS non viene fornito come prerequisito in un progetto di installazione di Visual Studio, ho trovato il seguente codice per installare IIS dal codice (con targeting per Windows Vista e 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; } 

Questo codice ha funzionato perfettamente finora. La mia unica preoccupazione è che la parte di installazione richiede molto tempo.

Ora, ho l’opportunità di riscrivere alcuni dei codici e modificare l’interfaccia utente dell’installatore. Sono appena arrivato a questa parte e mi chiedevo se questa era l’unica soluzione per installare IIS dal codice, o ci potrebbe essere un modo migliore che non ho trovato?

Sono solo curioso di sapere quali sono gli altri modi per installare IIS. Anche le risposte mirate per Windows 8 sono apprezzate.

L’opzione migliore in futuro è l’utilizzo di DISM (Deployment Image Servicing and Management). Funziona su Windows 7 / Windows server 2008 R2 e versioni successive. Tutte le altre opzioni sono deprecate.

Ecco un esempio di codice con le funzionalità minime necessarie (puoi aggiungerne altre se ne hai bisogno di più):

 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(); } } 

Ciò comporterà il seguente comando:

 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 

Hai un paio di opzioni qui. Pkgmgr funziona. È ansible utilizzare ServerManagerCmd.exe (Windows Server), Dism.exe (sistemi operativi più recenti) e sfruttare i flag dal sito MS http://technet.microsoft.com/en-us/library/cc722041.aspx .

Suggerirei di eseguire il threading di questo componente e, se ansible, aggiornare l’interfaccia utente con una notifica / barra di avanzamento. In questo modo il tuo utente saprà che le cose stanno progredendo.

Dism.exe dovrebbe funzionare con Windows 7, 8, 2008, ecc. Eseguirò alcuni test su una VM vergine con questi SO installati, fare uno snapshot e quindi eseguire il programma di installazione. Puoi riapplicare l’istantanea a tuo piacimento e sarai in grado di testare tutte le flag necessarie per far funzionare il software.

Ho avuto un po ‘di problemi con la soluzione proposta, poiché stavo cercando di installare MOLTE caratteristiche. L’applicazione verrebbe eseguita e sarebbe completata, ma la mia applicazione si sarebbe bloccata in attesa del process.WaitForExit() . Chiamata process.WaitForExit() .

Solo una FYI a tutti gli altri là fuori che cercano una risposta. Se l’output dei risultati è troppo grande, invece di process.WaitForExit() , dovresti eseguire qualcosa del genere:

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

Avevo bisogno di quell’uscita nel mio prossimo passo, così ho scritto il ReadLine() in una stringa che ho restituito.