Лучший способ установить IIS7 программно
У меня есть установщик webapp, который устанавливает все его предпосылки, в том числе 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, также приветствуются.
Ответы
Ответ 1
Лучшим вариантом будет использование 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
Ответ 2
У вас есть пара вариантов. Pkgmgr работает. Вы можете использовать ServerManagerCmd.exe(Windows Server), Dism.exe(новые операционные системы) и использовать флаги с сайта MS http://technet.microsoft.com/en-us/library/cc722041.aspx.
Я хотел бы предложить выполнить эту задачу и, если возможно, обновить интерфейс пользователя с уведомлением о ходе выполнения. Таким образом ваш пользователь будет знать, что все идет вперед.
Dism.exe должен работать с Windows 7, 8, 2008 и т.д. Я бы запускал некоторые тесты на виртуальной VM с установленными этими ОС, делал снимок, а затем запускал установщик. Вы можете повторно применить снимок по своему усмотрению, и вы сможете протестировать все флаги, необходимые для работы программного обеспечения.
Ответ 3
У меня возникла проблема с предлагаемым решением, так как я искал установку МНОГИХ функций. Приложение запустится, и оно будет завершено, но мое приложение будет ждать ожидания вызова process.WaitForExit()
.
Просто FYI кому-то еще ищут ответа. Если вывод результатов слишком велик, вместо process.WaitForExit()
вы должны запустить что-то вроде этого:
string results = "";
while (!process.StandardOutput.EndOfStream)
{
results += process.StandardOutput.ReadLine();
}
return results;
Мне нужен этот вывод в следующем шаге, поэтому я написал ReadLine()
в строку, которую я вернул.