MessageQueue.CanWrite总是返回true
问题描述:
我已经取消选择私人队列发送消息的权限,但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;
}
}
}
答
从我可以告诉,这种行为是如预期为MessageQueue.CanWrite
。如果你深入研究不够深入MessageQueue类的胆量,你会发现它产生了影响以下方式将此属性的值一些辅助对象:
如果您传递
QueueAccessMode.Send
(或SendAndReceive
)将创建一个内部访问模式助手,如果(this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0
返回true
。-
如果#1是
true
,则它会尝试打开队列以使用您请求的访问模式和共享将其存储到缓存中。在这一点上的本地方法MQOpenQueue
进行呼叫时,该公司在其发言(重点煤矿)以下:如果在要求的模式打开队列的访问权限不允许调用应用程序,下面有两种情况:
-
如果
dwAccess
设置为MQ_SEND_ACCESS
,MQOpenQueue
会成功,但是当应用程序试图发送邮件错误将被退回。 - 如果
dwAccess
设置为MQ_PEEK_ACCESS
或MQ_RECEIVE_ACCESS
,MQOpenQueue
将失败并返回MQ_ERROR_ACCESS_DENIED
(0xC00E0025)。在这种情况下,队列句柄不会返回到phQueue
。
-
如果
因此,给定一个QueueAccessMode.Send
(或SendAndReceive
)与有效的队列名称和共享模式,这是我的理解是CanWrite
将返回true
,即使你真的用不上派信息。
基本上它看来,当且仅当您将只能收到CanWrite == false
:
- 你传递一个
QueueAccessMode
这是不Send
或SendAndReceive
。
看起来,如果'QueueAccessMode.Send'被请求'CanWrite'可能是'true'。*(旁边的问题:你是否切换此队列的'Authenticated'复选框)* – user7116
我认为,但默认的QueueAccessMode是SendAndReceive,并且CanRead测试按照预期的方式将QueueAccessMode设置为Receive。 – chad
设置QueueAccessMode.Receive时,CanWrite会变为false吗?因为从我查看ILSpy中的MessageQueue类看来,只有您提供的模式反映了这些属性值。 – user7116