Powershell、スナップイン、32ビットアプリ

今日のより技術的な記事。

Exchange Monitoringをさらに追加する際に、他の人に役立つ可能性のあるいくつかの問題と解決策に遭遇しました。 最近のExchangeバージョンの一部は、Powershellでのみ監視できます。 (Perfmon、WMI、Powershell、すべて異なるバージョンのExchangeに必要です…。彼らが決心してくれることを願っています…)

だから 最初の問題は、Powershell スクリプト、LogicMonitor エージェントから呼び出された場合、返されませんでした。 これはそれほど難しいことではありませんでした。パラメーター -inputformat に (文書化されていない) オプション「none」を渡すだけで、エージェントは Powershell コマンドを正常に実行できます。

powershell -inputformat なし dbstatus.ps1

(なぜですか?Microsoft.PowerShell.ConsoleHostクラスは、パラメーターのXNUMXつとしてSTDIN TextReaderを渡すM.PS.WrappedDeserializerを構築します。デフォルトでは、WrappedDeserializerはこのSTDIN TextReaderでReadLine()を呼び出し、無期限に待機し、PowerShellとプロセスを呼び出します。それが理由です。)

そのハードルを超えて、しかし次のハードル:
>> powershell -inputformat none dbstatus.ps1
Add-PSSnapin:WindowsPowerShellバージョン2にスナップインが登録されていません。

それでも、エージェントを実行しているホストのコマンドシェルからまったく同じコマンドを実行すると、期待した出力が得られました。 また、Powershellスクリプトによって呼び出されたExchangeスナップインが正しく登録され、実際に正常に機能していることがわかりました。

しかし..私たちのエージェントは32ビットのJVMで実行されており、Exchange 2010(少なくとも私たちのラボでは)は64ビットのWindowsにインストールされています。 Powershellスナップインは、Powershellが64ビットアプリから起動された場合にのみ表示されました。 でcmd.exeからPowerShellを起動したとき SysWOW64、エージェントが報告したのと同じスナップインの欠落に関するエラーが発生しました。

解決策–エージェントがプログラムファイル(x32)に86ビットアプリとしてインストールされているかどうかは関係ありません。 重要なのは、最終的にPowershellを起動したエージェントによって起動されたJava仮想マシンが、Java.comからインストールされたデフォルトの64ビットJVMではなく、32ビットJVMであるということでした。 (少なくとも、32ビットブラウザでJava.comを参照する場合、32ビットJVMがデフォルトです。)

したがって、LogicMonitorエージェントを64ビットJVMで実行し、Powershellを「-inputformatnone」で開始すると、Powershell出力とそのすべてのスナップインに完全にアクセスできるため、すぐにリリースされる一部のデータソースがそれを利用することを期待してください。