这是在 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 也会发生这种情况。
这可能与 messageId 看起来像“73493861-3988-4109-8356-206a1d7792da\25”有关,但我不确定为什么这不起作用,具体取决于消息的来源。尽管 \xx 在附加参数中,但 messageId 确实被拆分为 2 个参数。