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

Mar*_*ott 23 iis powershell

我有一个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安装为快照.

因此,包括脚本中的导入模块WebAdministration在IIS 7上爆炸,但在IIS 7.5上工作正常,并且包括add-pssnapin WebAdministration在IIS 7.5上爆炸,但在IIS 7上工作正常.

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

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

---答案(根据我的情况)----

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

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

Gle*_*nnS 32

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

$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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Gra*_*rdx 11

是否有可能从一个或另一个中捕获错误,并执行相反的操作.没有我的外壳方便,但有类似的东西:

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

其实更多地考虑这个......

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

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