2009-12-17 89 views
23

我有一个PowerShell脚本,用于配置IIS中的网站和Web应用程序设置。因此,我使用WebAdministration管理单元中的cmdlet。但是,此脚本需要在Windows 2008,Windows 7和Windows 2008 R2上运行。我需要它从用户那里以最小的麻烦运行。PowerShell:在IIS 7和IIS 7.5上的ps1脚本中加载Web管理

问题是,Windows 7和Windows 2008 R2使用随WebAdministration一起安装的IIS 7.5作为模块。在Windows 2008,我们已经安装了它安装WebAdministration作为一个单元的IIS 7 PowerShell提供。

所以包括进口模块WebAdministration脚本炸毁在IIS 7,但在IIS 7.5中工作正常,包括添加 - pssnapin Web管理在IIS 7.5上爆炸,但在IIS 7上正常工作。

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

有没有人解决过这个问题?有谁知道如何检查环境,然后从PS脚本中调用相应的cmdlet?

--- ANSWER(我的情况)----

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

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

回答

11

是否有可能从一方或另一方接收错误,并做相反的处理。不要有我的壳方便,但这样的:

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

放在了第一位,我所知道的错误类型检查可能会需要进行修改。就工作而言,这实际上可以通过在注册表中查看加载的管理单元或机器上安装的IIS版本,然后使用适当的方法在C#中完成。

+1

这样做的唯一问题是,尽管** import-module **可以多次运行,即使模块已经加载也不会引发错误,但是如果snapin是snap-in,** add-pssnapin **会引发错误已经加载。 感谢您寻求可行解决方案的灵感。 – 2009-12-21 15:06:34

+1

可以通过第二次调用ps-snapin来修复它是否已经在当前会话中加载 – GrayWizardx 2009-12-21 19:03:35

+0

1.为什么你的第二个块使用'Select'而不是'Where'? “$ hasSnapin”似乎是一个很差的名字。或者应该有一些将列表变回布尔值的名称,或者该名称的起始处应该有'has'。 – jpmc26 2016-11-21 21:35:12

0

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

man Export-Console -full 

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

+0

我没有想到控制台文件支持模块。但是,您可以使用带有-file参数的powershell来创建支持加载模块的自定义环境。 – 2009-12-18 13:16:19

+0

糟糕。你是对的。他们不支持模块 - 太糟糕了。 – 2009-12-18 15:13:26

+0

如果我无法弄清楚如何在脚本中干净地做到这一点,那么创建一个快速启动已经加载的web管理模块/管理单元的powershell可能是一个解决方案。 – 2009-12-18 19:09:36

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; 
     } 
    } 
} 
+0

那是一个很好的解决问题的方法 – 2010-12-02 20:21:33

+0

哦,你美丽。保存了我的早晨。谢谢。 – pdr 2012-01-13 11:17:56

+0

工作就像一个魅力!真棒! – avidenic 2014-07-01 09:46:24

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 } 
+0

什么6.1版本?任何全版本的所有表? – Kiquenet 2013-02-14 11:52:18

3

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

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 Web管理调用将引发错误。 @GlennS拥有最优雅的解决方案。 – 2011-04-05 15:29:30

2

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

添加-PSSnapin WebAdministration -ErrorAction SilentlyContinue

导入模块WebAdministration -ErrorAction SilentlyContinue

的只有这种情况不起作用,如果iis powershell snapin没有安装。

+0

有没有办法自动安装呢? – 2015-02-11 20:48:05