How to programmatically determine installed IIS version
Каков предпочтительный способ программного определения, какая версия Microsoft Internet Information Services (IIS) установлена в настоящее время?
Я знаю, что это можно найти, посмотрев ключ MajorVersion в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters.
Будет ли это рекомендованным способом или есть какой-нибудь более безопасный или более красивый метод, доступный для разработчика.NET?
6 ответов
Вы можете создать WebRequest и отправить его на порт 80 по IP-адресу обратной связи и получить HTTP-заголовок сервера.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://127.0.0.1/");
HttpWebResponse myHttpWebResponse = null;
try
{
myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
}
catch (WebException ex)
{
myHttpWebResponse = (HttpWebResponse)ex.Response;
}
string WebServer = myHttpWebResponse.Headers["Server"];
myHttpWebResponse.Close();
Не уверен, что это лучший способ сделать это, но это, безусловно, другой вариант.
public int GetIISVersion()
{
RegistryKey parameters = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters");
int MajorVersion = (int)parameters.GetValue("MajorVersion");
return MajorVersion;
}
Чтобы определить версию извне процесса IIS, есть одна возможность, как показано ниже...
string w3wpPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.System),
@"inetsrv\w3wp.exe");
FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(w3wpPath);
Console.WriteLine(versionInfo.FileMajorPart);
Чтобы определить это из рабочего процесса во время выполнения...
using (Process process = Process.GetCurrentProcess())
{
using (ProcessModule mainModule = process.MainModule)
{
// main module would be w3wp
int version = mainModule.FileVersionInfo.FileMajorPart
}
}
Я сделал это так (используя Powershell):
function Validate-IISVersion([switch] $ContinueOnError = $false)
{
if ($ContinueOnError)
{ $ErrorActionPreference = "SilentlyContinue" }
else
{ $ErrorActionPreference = "Stop" }
# Using GAC to ensure the IIS (assembly) version
$IISAssembly = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")
$IISVersion = $IISAssembly.GetName().Version
$IISVersionString = [string]::Format("{0}.{1}.{2}.{3}", $IISVersion.Major, $IISVersion.Minor, $IISVersion.Build, $IISVersion.Revision)
if (!$IISVersionString.Equals("7.0.0.0"))
{
if ($ContinueOnError)
{
Write-Host "`nConflicting IIS version found! [Version: $IISVersionString]`t " -NoNewline -ForegroundColor Red
}
Write-Error "Conflicting IIS version found [$IISVersionString]! @ $(Split-Path $MyInvocation.ScriptName -leaf)"
return $false
}
else
{
return $true
}
}
Не нужно писать код. Вы можете найти его в редакторе реестра
Перейти к запуску -> Тип - Regedit ->
Ветвь реестра LOCAL MACHINE содержит информацию о версии для Windows 7.
Начальная ветвь находится в (HKLM) HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \InetStp\ VersionString
Примечание: пробелы предназначены для чтения.
Приведенная ниже команда помогла мне правильно найти версию IIS в IIS 8.5 (Windows 2012 R2) и 7.5 Windows 7 SP1.
[System.Diagnostics.FileVersionInfo]:: GetVersionInfo ("$ ENV:SystemRoot\system32\ Inetsrv\InetMgr.exe") ProductVersion.
Ссылка:
https://forums.iis.net/p/1171695/1984536.aspx: Ответ от f00_beard