代码之家  ›  专栏  ›  技术社区  ›  Mark Arnott

PowerShell:在IIS 7和IIS 7.5上的PS1脚本中加载WebAdministration

  •  23
  • Mark Arnott  · 技术社区  · 15 年前

    我有一个PowerShell脚本,用于配置IIS中的网站和Web应用程序设置。所以我在WebAdministration管理单元中使用了Cmdlet。但此脚本需要在Windows 2008、Windows 7和Windows 2008 R2上运行。我需要它在运行时尽量减少用户的麻烦。

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

    所以包括 导入模块Web管理 在脚本中,该脚本在IIs7上爆炸,但在IIs7.5上运行良好,包括 添加PSSnapin WebAdministration 在IIs7.5上爆炸,但在IIs7上工作正常。

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

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

    ---回答(我的情况)--

    解决方案是代码和预配置控制台的组合。IIs7posh提供程序包含一个桌面快捷方式,该快捷方式在加载了WebAdministration的情况下启动posh控制台。再加上下面的函数,我的脚本在这三个系统中都能运行得很有魅力。

    Function Load-WebAdmin {
      $webAdminModule = get-module -ListAvailable 
                                            | ? { $_.Name -eq "webadministration" }
      If ($webAdminModule -ne $null) {
        import-module WebAdministration
      }
    }
    
    6 回复  |  直到 12 年前
        1
  •  11
  •   GrayWizardx    15 年前

    是否可能从一个或另一个错误中捕获错误,并执行相反的操作。别把我的壳放在手边,而是像:

    $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版本,然后使用适当的方法。

        2
  •  32
  •   GlennS    14 年前

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

    $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;
            }
        }
    }
    
        3
  •  3
  •   akjoshi HCP    12 年前

    这太好了。我所要做的就是添加一个其他的,这样它可以在Windows2008上运行时添加管理单元。这在脚本中适用于我的情况。

    Function Load-WebAdmin {
      $webAdminModule = get-module -ListAvailable | ? { $_.Name -eq "webadministration" }
      If ($webAdminModule -ne $null) {
        import-module WebAdministration
      }else{
        Add-pssnapin WebAdministration
       }
    }
    
        4
  •  2
  •   LPL user462990    13 年前

    使用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 }
    
        5
  •  2
  •   Keith Lawrence    12 年前

    我今天碰到这个问题,这里有我使用的解决方案

    添加pssnapin webadministration-erroraction silentlycontinue

    导入模块WebAdministration-错误操作silentlycontinue

    唯一不起作用的情况是没有安装IIS PowerShell管理单元。

        6
  •  0
  •   Keith Hill    15 年前

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

    man Export-Console -full
    

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