【问题标题】:PowerShell: Load WebAdministration in ps1 script on both IIS 7 and IIS 7.5PowerShell:在 IIS 7 和 IIS 7.5 上的 ps1 脚本中加载 WebAdministration
【发布时间】:2010-12-27 19:25:15
【问题描述】:

我有一个 PowerShell 脚本,用于在 IIS 中配置网站和 Web 应用程序设置。所以我使用 WebAdministration 管理单元中的 cmdlet。但是这个脚本需要在 Windows 2008、Windows 7 和 Windows 2008 R2 上运行。而且我需要它在运行时不会让用户大惊小怪。

问题是 Windows 7 和 Windows 2008 R2 使用 IIS 7.5,它带有作为模块安装的 WebAdministration。在 Windows 2008 上,我们安装了 IIS 7 PowerShell 提供程序,它将 WebAdministration 作为管理单元安装。

因此,在脚本中包含 import-module WebAdministration 会在 IIS 7 上崩溃,但在 IIS 7.5 上可以正常工作,并且包含 add-pssnapin WebAdministration 在 IIS 7.5 上会崩溃但可以正常工作在 IIS 7 上很好。

所以我们的解决方法是让管理员在运行脚本之前使用适合环境的命令手动加载 WebAdministration。但这并不是最优的,因为很容易忘记哪个命令在哪个环境中起作用。我们可以创建两个不同的脚本,但这会给开发带来维护问题。

有人解决了这个问题吗?有谁知道如何检查环境,然后从 PS 脚本中调用适当的 cmdlet?

--- 答案(针对我的情况)----

解决方案是代码和预配置控制台的组合。 IIS 7 PoSH 提供程序包含一个桌面快捷方式,可启动加载了 WebAdministration 的 PoSH 控制台。结合以下功能使我的脚本在所有三个系统上都像魅力一样运行。

Function Load-WebAdmin {
  $webAdminModule = get-module -ListAvailable 
                                        | ? { $_.Name -eq "webadministration" }
  If ($webAdminModule -ne $null) {
    import-module WebAdministration
  }
}

【问题讨论】:

    标签: iis powershell


    【解决方案1】:

    是否有可能从一个或另一个捕获错误,然后做相反的事情。手边没有我的外壳,但类似:

    $succeeded = import-module WebAdministration
    if (($succeeded -ne $null) -and ($succeeded.GetType() -eq [System.Exception]) {
      #Could not import, trying to snapin
      add-pssnapin WebAdministration
    }
    

    其实想多了……

    $hasSnapin = get-pssnapin | Select { $_.Name.toLower().Trim() = "webadministration" }
    if ($hasSnapin -ne $null) {
      add-pssnapin WebAdministration
    } else {
      import-module WebAdministration
    }
    

    关于第一个,我知道错误类型检查可能需要修改。至于正在进行的工作,这实际上可以在 C# 中通过在注册表中查找已加载的管理单元或机器上安装的 IIS 版本然后使用适当的方法来完成。

    【讨论】:

    • 唯一的问题是虽然 import-module 可以运行多次而不会引发错误,即使模块已经加载,add-pssnapin 如果管理单元已加载,将引发错误。感谢您提供可行解决方案的灵感。
    • 这可以通过第二次调用 ps-snapin 来修复它是否已经在当前会话中加载
    • 1.为什么你的第二个区块使用Select 而不是Where? 2. $hasSnapin 似乎是一个选择不当的名字。要么应该有一些东西可以将列表转回布尔值,要么名称的开头应该有 has
    【解决方案2】:

    如果您想创建“预配置”PowerShell 会话,请查看 PowerShell 控制台文件,例如:

    man Export-Console -full
    

    您可以创建一个用于 Win7 和 Server 2008 R2,另一个用于 Server08。

    【讨论】:

    • 我认为控制台文件不支持模块。但是,您可以使用带有 -file 参数的 powershell 创建支持加载模块的自定义环境。
    • 糟糕。你是对的。他们不支持模块 - 太糟糕了。
    • 如果我无法弄清楚如何在脚本中干净利落地执行此操作,那么创建一个快捷方式来启动已加载 web 管理模块/快照的 powershell 可能是一个解决方案。
    【解决方案3】:

    这可能有点晚了,但我们是这样做的:

    $iisVersion = Get-ItemProperty "HKLM:\software\microsoft\InetStp";
    if ($iisVersion.MajorVersion -eq 7)
    {
        if ($iisVersion.MinorVersion -ge 5)
        {
            Import-Module WebAdministration;
        }           
        else
        {
            if (-not (Get-PSSnapIn | Where {$_.Name -eq "WebAdministration";})) {
                Add-PSSnapIn WebAdministration;
            }
        }
    }
    

    【讨论】:

    • 哦,美女。拯救了我的早晨。谢谢。
    【解决方案4】:

    使用Windows版本的另一种方式:

    if ([System.Version](Get-ItemProperty -path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").CurrentVersion -ge [System.Version] "6.1")
    { Import-Module WebAdministration }
    else
    { Add-PSSnapin WebAdministration }
    

    【讨论】:

    • 6.1版本呢?有所有版本的完整表格吗?
    【解决方案5】:

    这很棒。我所要做的就是添加一个 else,以便在 Windows 2008 上运行时添加管理单元。这适用于我的情况的脚本。

    Function Load-WebAdmin {
      $webAdminModule = get-module -ListAvailable | ? { $_.Name -eq "webadministration" }
      If ($webAdminModule -ne $null) {
        import-module WebAdministration
      }else{
        Add-pssnapin WebAdministration
       }
    }
    

    【讨论】:

    • 这种方法的问题是我无法控制 powershell 的启动方式。如果用户从 IIS powershell 提供程序安装的图标启动 powershell,则 WebAdministration 管理单元已加载到 powershell 中,并且 Add-pssnapin WebAdministration 调用将引发错误。 @GlennS 有最优雅的解决方案。
    【解决方案6】:

    我今天遇到了这个问题,这是我使用的解决方案

    添加-PSSnapin WebAdministration -ErrorAction SilentlyContinue

    Import-Module WebAdministration -ErrorAction SilentlyContinue

    这不起作用的唯一情况是根本没有安装 iis powershell 管理单元。

    【讨论】:

    • 有没有办法自动安装?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多