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

23
我有一个PowerShell脚本,用于配置IIS中的网站和Web应用程序设置。因此,我使用WebAdministration快照中的cmdlet。但是,这个脚本需要在Windows 2008、Windows 7和Windows 2008 R2上运行。而且我需要它在用户最少的干扰下运行。
问题是,Windows 7和Windows 2008 R2使用随附WebAdministration模块的IIS 7.5。在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
  }
}
6个回答

34

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

$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;
        }
    }
}

哦,你真美。救了我的早晨。谢谢。 - pdr

12

能否捕获其中一个的错误,并执行另一个。没有我的Shell方便,但类似于:

$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
}

对于第一个问题,我知道错误类型检查可能需要进行修改。至于正在进行的工作,实际上可以通过在注册表中查找已加载的 SnapIns,或查找安装在计算机上的 IIS 版本,然后使用相应的方法来完成 C# 中的操作。


1
唯一的问题是,虽然 import-module 可以多次运行而不会引发错误,即使模块已经加载,但是 add-pssnapin 如果已经加载了 snapin,则会引发错误。感谢您为可行的解决方案提供灵感。 - Mark Arnott
1
这可以通过第二次调用ps-snapin来修复,以查看它是否已在当前会话中加载。 - GrayWizardx
  1. 为什么你的第二个代码块使用 Select 而不是 Where
  2. $hasSnapin 看起来命名不太合适。要么应该有一些东西将列表转换回布尔值,要么名称应该以 has 开头。
- jpmc26

3

这很棒。我只需要添加一个else语句,这样它就会在Windows 2008上运行时添加snap-in。在我的情况下,这适用于脚本。

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

1
这种方法的问题在于我无法控制PowerShell的启动方式。如果用户从IIS PowerShell提供程序安装的图标启动PowerShell,则WebAdministration快照已经加载到PowerShell中,而Add-pssnapin WebAdministration调用将引发错误。@GlennS提出了最优雅的解决方案。 - Mark Arnott

2

另一种使用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版本怎么样?有所有版本的完整表格吗? - Kiquenet

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

添加-PSSnapin WebAdministration -ErrorAction SilentlyContinue

导入-模块WebAdministration -ErrorAction SilentlyContinue

唯一不能正常运行的情况是iis powershell插件根本没有安装。

有没有办法也自动化安装它? - Ozgur Ozturk

0
如果您想创建“预配置”的PowerShell会话,请查看PowerShell控制台文件,例如:
man Export-Console -full

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


我原本认为控制台文件不支持模块。但是,你可以使用带有“-file”参数的PowerShell来创建一个自定义环境,以支持加载模块。 - Chad Miller
糟糕。是的,你说得对。他们不支持模块 - 真可惜。 - Keith Hill
如果我无法在脚本中找到干净的解决方法,创建一个启动已加载webadministration模块/快照的powershell快捷方式可能是一个解决方案。 - Mark Arnott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接