MessageQueue.CanWrite始终返回true

cha*_*had 6 c# msmq c#-4.0

我取消了在私有队列上发送消息的权限,但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;                
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*116 3

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

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

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

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

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

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

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

  1. 你传递的QueueAccessMode不是Sendor SendAndReceive