これは Windows Server 2008 R2 Enterprise (64 ビット) 上にあります。
メッセージが特定のキューに到着したときに、powershell スクリプトを実行したいと考えています。サーバーにログオンし、ユーティリティを使用してメッセージをキューに移動/コピーすると、期待どおりに機能します。
ルールには条件がなく、「ピーク」ルールです。
メッセージは、実際には別のサーバーから送信されることを意図しています。これが発生すると、メッセージが届き、タスク マネージャーを見ると、powershell.exe が実行されていることがわかりますが、powershell スクリプトは実行されていないようです。
テストスクリプトをスクリプトと同じディレクトリにあるファイルに書き込むだけで、これを簡素化しようとしました。繰り返しますが、これはメッセージを手動でキューに移動する場合に機能しますが、メッセージが別のサーバーから到着した場合の結果は同じです。スクリプトが実行されていないようです。
トリガーは確実に起動します。別のサーバーから送信された後にメッセージが到着した場合、Windows タスク マネージャーで予想されるコマンド ラインを使用して powershell.exe を確認できます。
パラメータについては、スクリプトの完全なパスをテスト用の文字列パラメータとして持っています。
ネットワーク サービスに、キューとスクリプト ディレクトリに対する権限があることを確認しました。
イベント ログにエラーはありません。
次のことを試しましたが、異なる結果は得られませんでした。
- 32 ビットの powershell.exe に切り替えます。
- 常に真である条件を追加します。
- ネットワーク サービスからメッセージ キューおよびメッセージ キュー トリガー サービス用のドメイン アカウントに切り替え、アカウントのアクセス許可をキューおよびディレクトリに追加します。
それで、他の誰かが試してみることを考えることができますか?
ルールのパラメーターにプログラム スイッチを追加する方法はありますか? すべての文字列パラメーターを引用符で囲み、exe 選択ではスイッチを許可しません。
トリガーの実行時に stderr 出力をキャプチャする方法はありますか? おそらくどういうわけか失敗していますが、それを見る方法が見つかりません。
私の「テストスクリプト」の内容:
$fileName = "C:\Users\Public\Documents\Scribe\Test\MoveMessage.err";
("tested ok") | Out-File $fileName;
ありがとう!
編集:
write-eventlog の使用に切り替えたところ、メッセージが正しくログに記録されました。
write-eventlog -logname "Windows PowerShell" -source "PowerShell" -eventID 1 -message "TestScript.ps1 Script Started."
これを行うと、メッセージが別のコンピューターから送信された場合、パラメーターとして MessageId を持つスクリプトは実行されないことがわかりました。これは、スクリプトで messageId が使用されていない場合でも発生します。
これは、「73493861-3988-4109-8356-206a1d7792da\25」のように見える messageId に関係している可能性がありますが、メッセージのソースによってはこれが機能しない理由がわかりません。messageId は 2 つの引数に分割されますが、追加の引数に \xx が含まれています。