我已取消选择专用队列上的“发送消息”的权限,但是MessageQueue.CanWrite从未返回false。我可以切换“接收消息”权限,并且CanRead属性将按预期方式响应。为什么CanWrite属性的行为会有所不同?

我已经用几个不同的AD用户测试了此问题,结果是相同的。

有没有其他方法可以验证特定用户帐户是否可以将消息发送到特定远程专用队列?

public class SendBehavior : IMsmqRuleBehavior
{
    public bool Validate(string queuePath)
    {
        using (var queue = new MessageQueue(queuePath, QueueAccessMode.Send))
        {
            return queue.CanWrite;
        }
    }
}

public class ReceiveBehavior : IMsmqRuleBehavior
{
    public bool Validate(string queuePath)
    {
        using (var queue = new MessageQueue(queuePath, QueueAccessMode.Receive))
        {
            return queue.CanRead;
        }
    }
}

最佳答案

据我所知,这种行为是针对MessageQueue.CanWrite的。如果您深入研究MessageQueue类的内胆,您会发现它创建了一些辅助对象,这些对象以以下方式影响此属性的值:

  • 如果您传递QueueAccessMode.Send(或SendAndReceive),则将创建一个内部访问模式帮助器,如果true,则返回(this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0
  • 如果#1是true,则它将尝试使用访问模式和您所请求的共享来打开队列以将其存储到缓存中。此时,将调用本地方法 MQOpenQueue ,其备注中包含以下内容(强调我的意思):


  • 因此,给定具有有效队列名和共享模式的QueueAccessMode.Send(或SendAndReceive),据我了解,即使您实际上无权发送消息,CanWrite仍将返回true

    基本上看来,只有在以下情况下,您才会收到CanWrite == false:
  • 您传递的不是QueueAccessModeSendSendAndReceive
  • 关于c# - MessageQueue.CanWrite始终返回true,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18065746/

    10-11 07:28