2013-04-18 6 views
13

Ich habe ein WebApp-Installationsprogramm installiert alle seine Voraussetzungen, die auch IIS 7 enthält.Bessere Möglichkeit, IIS7 programmgesteuert zu installieren

Da IIS in einem Visual Studio-Installationsprojekt nicht als Voraussetzung erforderlich ist, habe ich den folgenden Code entwickelt, um IIS aus Code zu installieren (für Windows Vista und 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; 
} 

Dieser Code hat bis jetzt perfekt funktioniert. Meine einzige Sorge ist, dass der Installationsteil viel Zeit benötigt.

Jetzt habe ich die Möglichkeit, einige der Codes neu zu schreiben und die Benutzeroberfläche des Installationsprogramms zu ändern. Ich kam gerade zu diesem Teil und fragte mich, ob dies die einzige Lösung für die Installation von IIS aus dem Code ist, oder gibt es vielleicht einen besseren Weg, den ich nicht gefunden habe?

Ich bin nur neugierig zu wissen, was die anderen Möglichkeiten sind, IIS zu installieren. Antworten für Windows 8 werden ebenfalls geschätzt.

Antwort

9

Die beste Option für die Zukunft ist DISM (Deployment Image Servicing and Management). Dies funktioniert auf Windows 7/Windows server 2008 R2 und höher. Alle anderen Optionen sind veraltet.

Hier ist ein Codebeispiel mit den minimalen Funktionen benötigt (Sie leicht mehr hinzufügen können, wenn Sie unterschiedliche benötigen):

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

Diese im folgenden Befehl führt:

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

Und was ist mit Int-Ausgabe?dism gibt die Textwand zurück – Mike

+0

@Mike Was ist damit? – i3arnon

+0

Nun, wenn das programmatisch ist, wäre es praktisch, wenn das Ergebnis von ProcessEx.Run() einen Code zurückgibt. Dism gibt String zurück? Wie kann ich die Ausgabe leicht analysieren, um zu wissen, dass die Installation Erfolg/Misserfolg hatte, und wenn Fehler, den richtigen Fehlercode zu erhalten? – Mike

4

Sie haben hier ein paar Optionen. Pkgmgr funktioniert. Sie können ServerManagerCmd.exe (Windows Server), Dism.exe (neuere Betriebssysteme) verwenden und die Flags von der MS-Site http://technet.microsoft.com/en-us/library/cc722041.aspx verwenden.

Ich würde vorschlagen, diese Komponente herauszufädeln und wenn möglich, aktualisieren Sie die Benutzeroberfläche mit einer Fortschrittsbenachrichtigung/bar. Auf diese Weise wird Ihr Benutzer wissen, dass die Dinge voranschreiten.

Dism.exe soll mit Windows 7, 8, 2008, etc. arbeiten. Ich würde einige Tests auf einer virginalen VM mit diesen Betriebssystemen ausführen, einen Schnappschuss machen und dann das Installationsprogramm ausführen. Sie können den Snapshot nach Belieben erneut anwenden und Sie können alle Flags testen, die Sie benötigen, damit die Software funktioniert.

+0

Haben Sie Code-Beispiele, um IIS mit dism.exe zu installieren? –

+0

Dism.exe/online/enable-feature/Feature-Name: IIS-WebServerRole und so weiter – John

+0

ServerManagerCmd.exe wird ab Windows Server 2012 veraltet – AlwaysAProgrammer

2

Ich hatte ein kleines Problem mit der vorgeschlagenen Lösung, da ich VIELE weitere Funktionen installieren wollte. Die Anwendung würde ausgeführt werden, und es würde vervollständigen, aber meine Anwendung würde warten auf den process.WaitForExit() Aufruf warten.

Nur ein Hinweis für alle anderen da draußen suchen eine Antwort. Wenn Ihre Ergebnisausgabe zu groß ist, statt process.WaitForExit(), sollten Sie etwas wie folgt ausführen:

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

return results; 

ich diese Ausgabe in meinem nächsten Schritt erforderlich, so schrieb ich die ReadLine() in eine Zeichenfolge, die ich zurückgegeben.