WebAdministrationを使用しているときのエラー80040154

私は時々PowerShellを書くことを楽しんでいます。 これらは主に管理および展開タスクです。 この記事では、 WebAdministrationモジュールの操作に関連する興味深い問題の解決についてお話したいと思います。 したがって、問題の本質:このモジュールからコマンドレットを実行すると、エラーが発生します。



Cannot retrieve the dynamic parameters for the cmdlet.

Retrieving the COM class factory for component with CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} failed due to the following error: 80040154.







スクリプトは64ビットWindows 7で実行されます。これが重要なポイントです。 しかし、ソリューションの説明を始める前に、PowerShellスクリプトが使用されるインフラストラクチャについて少し説明したいと思います。 最も一般的に使用されるスクリプト(ローカルサイトの作成とセットアップ、キューの作成など)は、モジュール関数として設計されています。 開発者はこのモジュールをPowerShellセッションにロードし、コンソールでエクスポートした関数を使用できます。 しかし、彼らはまた、クリックするだけで実行するバッチファイルの形式でラッパーを作成しました。 それらを使用すると、この問題が発見されました。 ただし、バッチファイルがTotal Commanderから起動される場合に限ります。



Get-WebSiteコマンドレットを呼び出してすべてのローカルサイトのリストを表示するコマンドの例:

powershell -noexit -command "& { Import-Module WebAdministration; Get-WebSite }"



* This source code was highlighted with Source Code Highlighter .




ファイルに保存して、エクスプローラーから実行してみましょう。 「-noexit」フラグを使用すると、コマンドの実行後にセッションが終了せず、 Process Explorerを使用して実行中のプロセスを分析する時間ができます。 ローカルサイトのリストを確認し、Process Explorerでプロセスのプロパティを確認しました。



画像



画像



まあそれはよさそうだ。 次に、Total Commanderで同じバッチファイルを実行してみます。



画像



画像



64ビットバージョンのWindowsがリリースされたとき、以前に存在していたライブラリの名前は変更されませんでした。 それらは、%windir%\ System32ディレクトリに適応、再コンパイル、およびライブで残されました。 また、32ビット版は%windir%\ SysWOW64ディレクトリに移動しました。 現在、32ビットプロセスが%windir%\ System32のファイルにアクセスしようとすると、 システムは自動的に呼び出しを%windir%\ SysWOW64にリダイレクトします。 32ビットプロセスが%windir%\ System32ディレクトリへのアクセスを必要とする場合、エイリアス%windir%\ Sysnativeを介してアクセスできます。 このような呼び出しは迂回されません。



Total Commanderからスクリプトを起動することにより、何らかの理由でWebAdministrationモジュールが正しく登録されていない32ビットバージョンのPowerShellを起動します。 または、1つのアーキテクチャのみに登録できますか? 残念ながら、正確な理由を見つけることができませんでした。



ただし、貴重な情報があります。 %windir%\ Sysnativeを使用すると、必要なPowerShellバージョンを実行し、WebAdministrationのすべての機能を使用できます。 ただし、%windir%\ Sysnativeは32ビットプロセスにのみ存在することに注意してください。 結果のバッチファイルは次の形式を取ります。

if not exist %windir%\Sysnative\nul goto 64bit

set ps= "%windir%\Sysnative\WindowsPowerShell\v1.0\powershell.exe"

goto start

:64bit

set ps= "%windir%\System32\WindowsPowerShell\v1.0\powershell.exe"

:start



%ps% -noexit -command "& { Import-Module WebAdministration; Get-WebSite }"



* This source code was highlighted with Source Code Highlighter .






このようなスクリプトは、TotalCommander、Far、およびExplorerの両方から64ビットのPowerShellを実行します(これは確認できました)。 32ビットOSでも問題はありません。



いくつかのメモ:

注1 WebAdministrationモジュールの代わりに、Microsoft.Web.Administration.dllアセンブリのServerManagerを使用できます。 この記事で使用方法について読むことができます。



注2 Total Commanderは、%windir%\ System32 \ cmd.exeを実行するように構成可能ですが、そのようなオプションは見つかりませんでした。



注3 これは、ローカルの問題とは異なります。 このエラーは、スクリプトを実行しようとしたすべてのネットワークマシンで発生しました。 ローカルエリアネットワークの管理には程遠いですが、ドメインの一部の設定が影響しているのでしょうか?



ご清聴ありがとうございました!



All Articles