MSMQ 触发的 powershell - 触发但对转发的消息不执行任何操作

MSMQ triggered powershell - fires but does nothing for forwarded message

这是在 Windows Server 2008 R2 Enterprise(64 位)

我想在消息到达特定队列时执行 powershell 脚本。如果我登录到服务器并使用实用程序将消息 move/copy 放入队列,它会按预期工作。

规则没有条件,是 "peek" 规则。

该消息实际上是从另一台服务器发送的。发生这种情况时,消息到达,通过查看任务管理器,我可以看到 powershell.exe 运行s,但 powershell 脚本似乎没有执行。

我尝试通过将测试脚本写入与脚本位于同一目录中的文件来简化此操作。同样,如果我手动将消息移入队列,则此方法有效,但如果消息来自另一台服务器,结果是相同的;脚本似乎没有执行。

触发器肯定会触发,我可以在 windows 任务管理器中看到 powershell.exe 预期的命令行,如果消息是从另一台服务器发送后到达的,它什么也不做。

对于参数,我只是将脚本的完整路径作为字符串参数用于测试。

我确保网络服务对队列和脚本目录具有权限。

事件日志中没有错误。

我已经尝试了以下没有产生不同结果的方法:

  1. 切换到 32 位powershell.exe。
  2. 添加一个始终为真的条件。
  3. 为消息队列和消息队列触发器服务从网络服务切换到域帐户,并添加该帐户对队列和目录的权限。

那么其他人能想出点什么来尝试吗?

有什么方法可以在规则的参数中添加程序开关吗?它将所有字符串参数放在引号中并且 exe 选择不允许切换。

有什么方法可以捕获执行触发器时的 stderr 输出吗?它可能以某种方式失败了,但我找不到查看它的方法。

我的"test script"内容:

$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,也会发生这种情况。

这可能与 messageId 看起来像“73493861-3988-4109-8356-206a1d7792da”有关,但我不确定为什么这不起作用,具体取决于消息的来源。尽管 \xx 在附加参数中,但 messageId 确实被分成了 2 个参数。

显然,主要问题是在某些情况下,messageId 不能用作触发规则参数。我改用了 lookupId,一切都按预期工作。