6

我已取消选择在私有队列上发送消息的权限,但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;                
        }
    }
}
4

1 回答 1

3

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

  1. 如果您通过QueueAccessMode.Send(或SendAndReceive),将创建一个内部访问模式助手,它返回trueif (this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0

  2. 如果 #1 是true,它会尝试打开队列以将其存储到缓存中,使用您请求的访问模式和共享。此时调用了本机方法MQOpenQueue,它的注释中有以下内容(强调我的):

    如果调用应用程序不允许以请求的模式打开队列的访问权限,则可能发生以下两种情况:

    • 如果dwAccess设置为MQ_SEND_ACCESS,MQOpenQueue会成功,但是当应用程序尝试发送消息时会返回错误。
    • 如果dwAccess设置为MQ_PEEK_ACCESSor MQ_RECEIVE_ACCESSMQOpenQueue将失败并返回MQ_ERROR_ACCESS_DENIED(0xC00E0025)。在这种情况下,队列句柄不会返回给phQueue.

因此,给定具有有效队列名称和共享模式的QueueAccessMode.Send(or SendAndReceive),我的理解是即使您确实无权发送消息,CanWrite也会返回。true

基本上,您似乎只会收到CanWrite == false当且仅当:

  1. 你通过 a QueueAccessModewhich is not Sendor SendAndReceive
于 2013-08-05T19:42:22.957 回答