为远程IIS应用程序池标识配置MSMQ专用队列权限

本文关键字:MSMQ 配置 专用 队列 权限 标识 程序池 IIS 应用 应用程序 | 更新日期: 2023-09-27 17:57:25

我的设置

  1. ServerA正在使用本地IIS应用程序在IIS 7上运行web应用程序池标识。

  2. ServerB正在运行MSMQ,承载一个专用队列我们将调用MyQueue

  3. 使用ServerB上的消息队列管理单元,我已将MyQueue配置为向ServerA的域帐户(ServerA$)以及ANONYMOUS登录用户授予完全控制权

我想发生什么

我希望ServerA上的web应用程序向ServerB 上的MyQueue发送消息

实际发生了什么

该消息从未显示在ServerB上,我也没有收到错误消息。我已经打开了负源日志,可以看到我在死信队列中收到了一个"拒绝访问"错误。

如果我授予每个人完全控制权,那么消息就会出现,但我不想这样做。

为什么我认为这会起作用

这篇关于IIS应用程序池标识的文章说

在域环境中使用网络服务帐户可以利益作为网络服务访问网络运行的工作进程作为机器帐户。当机器已加入域。它们看起来像这样:

域名''机器名$,

例如:

mydomain''machine1$它的好处是网络资源像文件共享或SQL Server数据库一样,可以进行ACL以允许机器帐户访问。

那么应用程序池标识呢?

好消息是应用程序池标识也使用该机器访问网络资源的帐户。无需更改。

根据这些信息,我假设在MyQueue上授予MY_DOMAIN''SERVERA$权限,那么一切都应该正常。但事实并非如此。

知道我做错了什么吗?

为远程IIS应用程序池标识配置MSMQ专用队列权限

这个问题现在已经过时了,但我已经设法使用ApplicationPoolIdentity用户从IIS应用程序查询MSMQ:

  1. 转到IIS管理控制台中的应用程序池列表,并记下所需应用程序的应用程序库名称
  2. 右键单击服务器管理器属性>Security中的MSMQ队列
  3. 单击"添加"
  4. 输入对象名称IIS APPPOOL'{application pool name from step 1}。这应该自动完成到应用程序池的名称
  5. 授予所需权限-通常是Peek Message和/或Receive Message

最好避免将权限授予Everyone

参考:https://serverfault.com/a/81246/24816

我刚刚偶然发现了这一点,并在我的案例中找到了解决方案,如果我将IIS设置为作为网络服务帐户运行,远程队列将接收到我结束的消息。

这占用了我今天的很多时间,现在我需要弄清楚将IIS作为网络服务运行是否真的可以,并且不会破坏其他任何东西。