【问题标题】:How to programmatically determine installed IIS version如何以编程方式确定已安装的 IIS 版本
【发布时间】:2010-09-30 21:46:03
【问题描述】:

以编程方式确定当前安装的 Microsoft Internet Information Services (IIS) 版本的首选方法是什么?

我知道可以通过查看 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters 中的 MajorVersion 键找到它。

这是推荐的方法吗,还是有任何更安全或更美观的方法可供 .NET 开发人员使用?

【问题讨论】:

    标签: .net iis version-detection


    【解决方案1】:
    public int GetIISVersion()
    {
         RegistryKey parameters = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters");
         int MajorVersion = (int)parameters.GetValue("MajorVersion");
    
         return MajorVersion;
    }
    

    【讨论】:

    • 这是推荐的做法吗?即,它是否适用于所有现有版本,是否可能在未来版本中仍然有效?
    • 这个键是什么:HKLM:\SOFTWARE\Microsoft\InetStp\ and setupstring,versionstring values ?
    • @SteinNorheim 许多安装程序使用此密钥,WiX IIS 扩展坚持使用此密钥。今天所有受支持的 IIS 版本 (IIS 7-10) 都会正确生成此密钥。我认为微软没有理由在不久的将来打破这一点。
    【解决方案2】:

    要从 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
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以构建一个 WebRequest 并将其发送到环回 IP 地址上的端口 80 并获取服务器 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();
      

      不确定这是否是一种更好的方法,但它肯定是另一种选择。

      【讨论】:

      • 使用 WebRequest 或使用 Windows 注册表的性能如何?
      • 这当然假设默认网站在该机器上运行,但不一定是这种情况......
      【解决方案4】:

      我是这样做的(使用 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
      }
      }
      

      【讨论】:

      • 您能否使用 Microsoft.Web.Administration 区分 IIS 7.0 和 IIS 7.5?我认为最好使用 Windows 注册表,恕我直言
      • "Windows PowerShell 建立在 .NET Framework 之上,可帮助 IT 专业人员和高级用户控制和自动化管理 Windows 操作系统和在 Windows 上运行的应用程序。" technet.microsoft.com/en-us/library/bb978526.aspx
      • @Vaibhav 是这样吗? .NET 是用 C 或 C++ 编写的。
      • 我不明白你的意思@ShadowWizard。为什么您认为上面使用 .net 程序集 (GAC) 用 POwershell 编写的代码“不是 .NET”?
      • OP 是 .NET 开发人员,正在寻找 .NET 的方法。他没有提到 PowerShell、Java、Assembly 或 Python 等。
      【解决方案5】:

      无需编写代码。您可以在注册表编辑器中找到它

      转到运行 -> 输入 - regedit ->

      注册表的 LOCAL MACHINE 分支包含 Windows 7 的版本信息。

      起始分支位于 (HKLM) HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \InetStp\ VersionString

      注意:空格仅供阅读。

      【讨论】:

        【解决方案6】:

        以下命令帮助我在 IIS 8.5 (Windows 2012 R2) 和 7.5 Windows 7 SP1 上正确找到 IIS 版本。

        [System.Diagnostics.FileVersionInfo]::GetVersionInfo("$env:SystemRoot\system32\inetsrv\InetMgr.exe").ProductVersion

        参考:

        https://forums.iis.net/p/1171695/1984536.aspx : f00_beard 的回答

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 2011-10-28
          • 2011-07-02
          • 2015-11-12
          • 1970-01-01
          相关资源
          最近更新 更多