在C#中创建新的消息队列(MSMQ)时设置默认权限

Dom*_*nik 6 c# permissions msmq

我试图以编程方式Message Queues在Windows 2003x64/2008R2服务器上创建几个.创建队列时,Windows会自动将默认权限应用于队列.

对于MSMQ 4,默认情况下会添加以下用户

  • 大家
  • 队列的创建者
  • 匿名登录

当我使用队列设置权限时MessageQueue.SetPermissions(),指定的AccessControlList内容仅附加到默认安全权限.

是否有任何方法可以删除或覆盖默认权限?在 这篇MSDN文章的底部,它说明了这一点

但是,您不能自定义默认值,因为它们是硬编码的.

我知道队列的设置保存在位于的文件中C:\Windows\System32\msmq\storage\lqs.在此文件中有一个Security属性,表示队列的权限.可以选择编辑此密钥吗?但是,这样做对我来说似乎很奇怪.

我正在寻找一种正确的方法来指定我自己的方法来AccessControlList覆盖队列的默认安全权限.无论是在创建时还是之后.

任何帮助表示赞赏,

谢谢.

Mac*_*iej 12

如果您无法删除或撤消对这些默认组的权限,则始终可以尝试拒绝对这些组的权限.拒绝优先于允许.此代码有效:

MessageQueue queue = new MessageQueue(".\\Private$\\QueueName");
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage,
        AccessControlEntryType.Deny);
Run Code Online (Sandbox Code Playgroud)

撤销权限(AccessControlEntryType.Revoke)也应该有效.也许您的代码中存在错误.适用于我的机器.

文章说:

但是,您不能自定义默认值,因为它们是硬编码的.

并且这意味着您无法更改队列创建期间给出的权限,但您可以在之后更改它们.

编辑:让"Everyone"独立于OS语言:如何让"Everyone"的IdentityReference在本地化系统上创建MutexAccessRule?


小智 6

我和ACL有同样的问题.当我切换到SetPermissions()方法时,事情运行得更好.

以下代码适用于我:

                queue.SetPermissions(
                    "Everyone",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
                queue.SetPermissions(
                    "ANONYMOUS LOGON",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
Run Code Online (Sandbox Code Playgroud)