2009-12-17 88 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