2013-08-05 186 views
6

我已经取消选择私人队列发送消息的权限,但MessageQueue.CanWrite从不会返回false。我可以切换接收消息权限,并且CanRead属性按预期响应。为什么CanWrite属性的行为不同?MessageQueue.CanWrite总是返回true

我已经与几个不同的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;     
     } 
    } 
} 
+0

看起来,如果'QueueAccessMode.Send'被请求'CanWrite'可能是'true'。*(旁边的问题:你是否切换此队列的'Authenticated'复选框)* – user7116

+0

我认为,但默认的QueueAccessMode是SendAndReceive,并且CanRead测试按照预期的方式将QueueAccessMode设置为Receive。 – chad

+0

设置QueueAccessMode.Receive时,CanWrite会变为false吗?因为从我查看ILSpy中的MessageQueue类看来,只有您提供的模式反映了这些属性值。 – user7116

回答

3

从我可以告诉,这种行为是如预期MessageQueue.CanWrite。如果你深入研究不够深入MessageQueue类的胆量,你会发现它产生了影响以下方式将此属性的值一些辅助对象:

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

  2. 如果#1是true,则它会尝试打开队列以使用您请求的访问模式和共享将其存储到缓存中。在这一点上的本地方法MQOpenQueue进行呼叫时,该公司在其发言(重点煤矿)以下:

    如果在要求的模式打开队列的访问权限不允许调用应用程序,下面有两种情况:

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

因此,给定一个QueueAccessMode.Send(或SendAndReceive)与有效的队列名称和共享模式,这是我的理解是CanWrite将返回true,即使你真的用不上派信息。

基本上它看来,当且仅当您将只能收到CanWrite == false

  1. 你传递一个QueueAccessMode这是不SendSendAndReceive
+0

感谢您挖掘到这一点。为什么切换队列上的接收消息权限会导致“CanRead”属性的真/假切换,并且当我向队列发送消息时,禁用发送消息时,消息永远不会将其发送到队列,但我不会也收到一个例外。这对我来说似乎很奇怪。我认为CanRead和CanWrite会以相同的方式运行。 – chad

+0

@ChadLazette:我希望我对你有更好的答案,但从我所看到的情况来看,这种行为并不是基于另一端队列的真实权限。 – user7116

+0

够公平的。我很感激。我必须想出另一种方法来验证用户是否可以发送消息。 – chad