Программное включение ролей и функций IIS

Я пытаюсь включить функции IIS через консольное приложение С#. Он отлично работает на машинах с Windows 7 и Windows 8.1. но когда я запускаю один и тот же код на Windows Server 2008 R2 и Windows Server 2012 R2, он не работает. Что мне не хватает в этом коде?

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Management;
using System.Text.RegularExpressions;

namespace EnableIISComponents
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SetupIIS();
                Console.WriteLine("Done. Press any key to close.");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception occurred:" + ex.Message);
            }
            Console.ReadLine();
        }
    static string SetupIIS()
    {
        // In command prompt run this command to see all the features names which are equivalent to UI features.
        // c:\>dism /online /get-features /format:table 
        var featureNames = new List<string> 
                {
                    "IIS-ApplicationDevelopment",                        
                    "IIS-ISAPIExtensions",
                    "IIS-ISAPIFilter",
                    "IIS-CommonHttpFeatures",
                    "IIS-DefaultDocument",
                    "IIS-HttpErrors",
                    "IIS-StaticContent",
                    "IIS-HealthAndDiagnostics",
                    "IIS-HttpLogging",
                    "IIS-HttpTracing",
                    "IIS-WebServer",
                    "IIS-WebServerRole",
                    "IIS-ManagementConsole",
                };

        Console.WriteLine("Checking the Operating System...\n");

        ManagementObjectSearcher obj = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
        try
        {
            foreach (ManagementObject wmi in obj.Get())
            {
                string Name = wmi.GetPropertyValue("Caption").ToString();

                // Remove all non-alphanumeric characters so that only letters, numbers, and spaces are left.
                // Imp. for 32 bit window server 2008
                Name = Regex.Replace(Name.ToString(), "[^A-Za-z0-9 ]", "");

                if (Name.Contains("Server 2012 R2") || Name.Contains("Windows 81"))
                {
                    featureNames.Add("IIS-ASPNET45");
                    featureNames.Add("IIS-NetFxExtensibility45");
                }
                else if (Name.Contains("Server 2008 R2") || Name.Contains("Windows 7"))
                {
                    featureNames.Add("IIS-ASPNET");
                    featureNames.Add("IIS-NetFxExtensibility");
                }
                else
                {
                    featureNames.Clear();
                }

                string Version = (string)wmi["Version"];
                string Architecture = (string)wmi["OSArchitecture"];

                Console.WriteLine("Operating System details:");
                Console.WriteLine("OS Name: " + Name);
                Console.WriteLine("Version: " + Version);
                Console.WriteLine("Architecture: " + Architecture + "\n");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception occurred:" + ex.Message);
        }

        return 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)
    {
        Console.WriteLine("Enabling IIS features...");
        Console.WriteLine(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 с теми же именами функций через командную строку, функции IIS включаются. Почему не работает с программой?

Я запускаю свою программу от имени администратора, щелкнув правой кнопкой мыши и выбрав «Запуск от имени администратора».

Я создал этот образец с помощью этой ссылки. Лучший способ программной установки IIS7


person PSR    schedule 25.05.2015    source источник
comment
Я скомпилировал ваш код, и он отлично работает на свежем сервере 2012 R2. Проверьте свои журналы dism C:\Windows\Logs\DISM\dism.log на наличие сервера, на котором это не сработало.   -  person Peter Hahndorf    schedule 25.05.2015


Ответы (1)


Наконец я нашел причину. В свойствах проекта целевая платформа указана как «Любой процессор», но опция «Предпочитать 32-разрядную версию» была отмечена. Это вызывает проблему. На сервере 2012 R2 мое приложение пытается использовать 32-битную версию DISM. Это вызывает проблему.

Однажды я отключил эту опцию. Он работает нормально.

person PSR    schedule 26.05.2015