gpt4 book ai didi

c# - MessageQueue.CanWrite 始终返回 true

转载 作者:太空狗 更新时间:2023-10-29 21:50:36 31 4
gpt4 key购买 nike

我已取消选择在专用队列上发送消息的权限,但 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 类的内部结构,您会发现它创建了一些辅助对象,这些辅助对象以下列方式影响此属性的值:

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

  2. 如果 #1 为 true,它会尝试打开队列以将其存储到缓存中,使用您请求的访问模式和共享。此时调用native方法MQOpenQueue已制定,在其评论中有以下内容(强调我的):

    If the access rights for opening the queue in the mode requested are not allowed for the calling application, the following two things can happen:

    • If dwAccess is set to MQ_SEND_ACCESS, MQOpenQueue will succeed, but errors will be returned when the application tries to send a message.
    • If dwAccess is set to MQ_PEEK_ACCESS or MQ_RECEIVE_ACCESS, MQOpenQueue will fail and return MQ_ERROR_ACCESS_DENIED (0xC00E0025). In this case a queue handle is not returned to phQueue.

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

基本上看起来您只会收到 CanWrite == false 当且仅当:

  1. 您传递的 QueueAccessMode 不是 SendSendAndReceive

关于c# - MessageQueue.CanWrite 始终返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065746/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com