web-dev-qa-db-ja.com

PowerShell:両方のIIS 7とIIS 7.5

IISでWebサイトとWebアプリケーションの設定を構成するPowerShellスクリプトがあります。そのため、WebAdministrationスナップインのコマンドレットを使用します。ただし、このスクリプトは、Windows 2008、Windows 7、およびWindows 2008R2で実行する必要があります。そして、ユーザーからの煩わしさを最小限に抑えて実行する必要があります。

問題は、Windows7およびWindows2008R2がIIS 7.5を使用していることです。これは、モジュールとしてインストールされたWebAdministrationに付属しています。 Windows 2008には、WebAdministrationをスナップインとしてインストールするIIS 7PowerShellプロバイダーがインストールされています。

したがって、スクリプトにimport-module WebAdministrationを含めると、IIS 7で爆発しますが、IIS 7.5では正常に機能しますadd-pssnapin WebAdministrationはIIS 7.5で爆発しますが、IIS 7では正常に機能します。

したがって、回避策は、スクリプトを実行する前に、管理者が環境に適したコマンドを使用してWebAdministrationを手動でロードするようにすることです。ただし、どのコマンドがどの環境で機能するかを忘れがちなので、これは最適ではありません。 2つの異なるスクリプトを作成することもできますが、それは開発のメンテナンスの問題を引き起こします。

誰かがこの問題を解決しましたか?環境をチェックして、PSスクリプト内から適切なコマンドレットを呼び出す方法を知っている人はいますか?

---回答(私の状況では)----

解決策は、コードと事前構成されたコンソールの組み合わせです。 IIS 7 PoSHプロバイダーには、WebAdministrationがロードされた状態でPoSHコンソールを起動するデスクトップショートカットが含まれています。これを次の関数と組み合わせると、3つのシステムすべてでスクリプトが魅力的なように実行されます。

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

どちらか一方からエラーをキャッチし、反対のことを行うことは可能ですか?私のシェルを手元に置いてはいけませんが、次のようなものです。

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

最初のものでは、エラータイプチェックをおそらく変更する必要があることを私は知っています。進行中の作業に関しては、これは実際にC#で、ロードされたスナップインのレジストリを調べるか、マシンにインストールされているIISバージョンを調べて、適切な方法を使用することで実行できます。

11
GrayWizardx

これはおそらくあなたを助けるために少し遅れていますが、これが私たちがこれを行う方法です:

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

これは素晴らしい。私がしなければならなかったのは、Windows 2008で実行したときにスナップインを追加するように、elseを追加することだけでした。これは私の状況のスクリプトで機能します。

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

私は今日この問題に遭遇しました、そしてここに私が使用した解決策があります

Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue

Import-Module WebAdministration -ErrorAction SilentlyContinue

これが機能しない唯一の状況は、iis powershellsnapinがまったくインストールされていない場合でした。

2
Keith Lawrence

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 }
2
Matt D

「事前構成された」PowerShellセッションを作成する場合は、PowerShellコンソールファイルを調べてください。例:

man Export-Console -full

1つはWin7およびServer2008 R2で使用するために作成し、もう1つはServer08で使用するために作成できます。

0
Keith Hill