2013-04-18 16 views
13

Ho un programma di installazione di webapp che installa tutti i suoi prerequisiti, incluso anche IIS 7.Il modo migliore per installare IIS7 a livello di programmazione

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 la possibilità di riscrivere alcuni 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.

risposta

9

L'opzione migliore in futuro è l'utilizzo di DISM (Distribuzione e gestione delle immagini di distribuzione). Funziona su Windows 7/Windows server 2008 R2 e oltre. Tutte le altre opzioni sono deprecate.

Ecco un esempio di codice con le caratteristiche minime necessarie (si può facilmente aggiungere più se si richiedono diversi):

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 
+0

E come ottenere l'output int?dism restituisce il muro di testo – Mike

+0

@ Mike cosa ne pensi? – i3arnon

+0

Bene se questo è un modo programmatico, sarebbe conveniente se il risultato del vostro ProcessEx.Run() restituisce un codice. Dism restituisce la stringa giusta? Come posso analizzare facilmente l'output per sapere che l'installazione è riuscita/fallita e, in caso di errore, per ottenere il codice di errore corretto? – Mike

4

Hai un paio di opzioni qui. Pkgmgr funziona. È possibile 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.

Si consiglia di eseguire il threading di questo componente e, se possibile, aggiornare l'interfaccia utente con una barra di 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.

+0

Avete qualche esempio di codice per installare IIS usando dism.exe? –

+0

Dism.exe/online/enable-feature/featurename: IIS-WebServerRole e così via – John

+0

ServerManagerCmd.exe è obsoleto da Windows Server 2012 in poi – AlwaysAProgrammer

2

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 sarebbe rimasta in attesa sulla chiamata process.WaitForExit().

Solo una FYI a tutti gli altri là fuori in cerca di una risposta. Se l'output risultati è troppo grande, invece di process.WaitForExit(), si dovrebbe eseguire qualcosa di simile:

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

return results; 

ho bisogno che la produzione nel mio prossimo passo, così ho scritto la ReadLine() in una stringa che sono tornato.

Problemi correlati