PowerShell:在IIS 7和IIS 7.5上的ps1脚本中加载Web管理
我有一个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
}
}
是否有可能从一方或另一方接收错误,并做相反的处理。不要有我的壳方便,但这样的:
$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#中完成。
如果你想创建“预配置” PowerShell会话,看看PowerShell控制台文件例如为:
man Export-Console -full
您可以创建一个关于Win7的使用和Server 2008 R2和另一个用于在Server08使用。
我没有想到控制台文件支持模块。但是,您可以使用带有-file参数的powershell来创建支持加载模块的自定义环境。 – 2009-12-18 13:16:19
糟糕。你是对的。他们不支持模块 - 太糟糕了。 – 2009-12-18 15:13:26
如果我无法弄清楚如何在脚本中干净地做到这一点,那么创建一个快速启动已经加载的web管理模块/管理单元的powershell可能是一个解决方案。 – 2009-12-18 19:09:36
这可能是有点晚来帮助你,但这里是我们如何做到这一点:
$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;
}
}
}
使用的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 2013-02-14 11:52:18
这是伟大的。我所要做的只是添加一个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 Web管理调用将引发错误。 @GlennS拥有最优雅的解决方案。 – 2011-04-05 15:29:30
我今天就遇到了这个问题,这里是解决方案,我用
添加-PSSnapin WebAdministration -ErrorAction SilentlyContinue
导入模块WebAdministration -ErrorAction SilentlyContinue
的只有这种情况不起作用,如果iis powershell snapin没有安装。
有没有办法自动安装呢? – 2015-02-11 20:48:05
这样做的唯一问题是,尽管** import-module **可以多次运行,即使模块已经加载也不会引发错误,但是如果snapin是snap-in,** add-pssnapin **会引发错误已经加载。 感谢您寻求可行解决方案的灵感。 – 2009-12-21 15:06:34
可以通过第二次调用ps-snapin来修复它是否已经在当前会话中加载 – GrayWizardx 2009-12-21 19:03:35
1.为什么你的第二个块使用'Select'而不是'Where'? “$ hasSnapin”似乎是一个很差的名字。或者应该有一些将列表变回布尔值的名称,或者该名称的起始处应该有'has'。 – jpmc26 2016-11-21 21:35:12