Windows Server 2012 / IIS8 で Powershell を使用して、IIS サーバーのビルドと構成を自動化しています。
スクリプトは、Web サイト、アプリケーション プール、設定権限、バインド証明書などを作成します。スクリプトは、すべての Web サイトの詳細を含む XML ファイルから実行されます。スクリプトは、関連するディレクトリにコピーされるコンテンツとは別に、Web サイトを実行するために必要なすべてを構成します。
ディレクトリにコンテンツがなくても、すべて正常に動作します (テスト用のデフォルトの HTML ページのみ)。
アプリケーションをディレクトリにコピーし、Powershell を使用してサイトをさらに構成しようとすると、.NET 2 および 3.5 を使用するアプリケーションは次のエラーをスローします。
エラー: 'system.web.extensions/scripting/scriptResourceHandler' セクションが重複して定義されています
+ CategoryInfo : NotSpecified: (:) [Set-WebConfiguration], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.IIs.PowerShell.Provider.SetConfigurationCommand
+ PSComputerName : xxxxxxxxxxx
このトピックを徹底的に調査したところ、System.Web.Extensions が .NET 4.0 アプリケーションの machine.config に移動されたことが問題のようです。つまり、web.config でセクションを再度定義すると重複します。エラーが発生するアプリケーションが、.NET 2.0 として設定されたアプリケーション プールを使用して実行されている .NET 2.0 または 3.5 アプリケーションであることを除いて、これは理にかなっています。
問題は、Powershell 自体 (Windows Server 2012 上) が CLR 4.0 を使用して実行されるため、IIS の構成を変更するときに、構成ファイルを階層的に (machine.config から web.config まで) 解析する必要があることだと思います。System.Web.Extensions は、実行時に複製されていなくても複製されていると考えられます (実行時はバージョン 2.0 になるため)。アプリケーション プールが実行される .NET のバージョンを変更しても、アプリケーションの実行時のみに関する問題であるため、この問題に違いはありません。
Powershell が CLR 2.0 のみを使用するように制限することで、これを回避する方法があるようですが、これは .NET 4.0 アプリケーションでは機能せず、セクション定義の欠落が報告されます。したがって、あるバージョンの問題を修正すると、他のバージョンで問題が発生します。
私の質問は、以前にこれを経験した人はいますか? アプリケーションが混合した .NET バージョンを使用している場合に Powershell が IIS を構成できるようにする回避策はありますか?
私はこの問題に何時間も費やしてきたので、助けていただければ幸いです。
更新: このエラーはまだ解決されていません。コメントがないため、簡単ではないと思います。
IIS 8 Powershell のドキュメントを調べたところ、Clr プロパティが Set-WebConfiguration コマンドに追加されていることがわかりましたが、変更しようとしている要素 (この場合は HTTP リダイレクト) が applicationhost で終了するため、これは効果がありません。 .config ファイルと Powershell は次の警告をスローします。
WARNING: Ignoring -Clr value when PSPath is not 'MACHINE/WEBROOT' or 'MACHINE'.
変更が machine.config またはルート web.config のいずれでもない場合。
これを回避する方法はないようです (バグだと思います) おそらく、更新の前にアプリケーション ディレクトリの web.config ファイルの名前を変更すると、Powershell が構成を解析しようとしなくなります。これについて誰かが考えていることは大歓迎です。