Лучший способ установить IIS7 программно

У меня есть установщик веб-приложения, который устанавливает все необходимые компоненты, включая IIS 7.

Поскольку 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, также приветствуются.

3 ответа

Решение

Наилучший вариант - использовать 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

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

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

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

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

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

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

return results;

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

Другие вопросы по тегам