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

本文关键字:MSMQ 设置 权限 默认 队列 创建 消息 | 更新日期: 2023-09-27 18:32:55

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

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

  • 每个人 都
  • 队列的创建者
  • 匿名登录

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

有什么方法可以删除或覆盖默认权限吗?在底部的这篇 MSDN 文章中,它指出

但是,您无法自定义默认值,因为它们是硬编码的。

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

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

任何帮助不胜感激,

谢谢。

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

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

MessageQueue queue = new MessageQueue(".''Private$''QueueName");
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage,
        AccessControlEntryType.Deny);

撤销权限(AccessControlEntryType.Revoke(也应该有效。也许您的代码中有错误。在我的机器上工作。

文章说:

但是,您无法自定义默认值,因为它们是硬编码的。

这意味着您无法更改队列创建期间授予的权限,但可以在之后更改它们。

编辑:要让"每个人">

独立于操作系统语言:如何获取"每个人"的标识引用以在本地化系统上创建互斥访问规则?

我在ACL上遇到了同样的问题。 当我切换到 SetPermissions(( 方法时,情况运行得更好。

下面的代码对我有用:

                queue.SetPermissions(
                    "Everyone",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
                queue.SetPermissions(
                    "ANONYMOUS LOGON",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);

虽然Mike的答案是正确的,但它假设服务器以英语为语言。如果您在使用不同语言(在本例中为荷兰语(的服务器上使用此代码...

 queue.SetPermissions( 
                     "Everyone",
                     MessageQueueAccessRights.FullControl,
                      AccessControlEntryType.Allow);

。您会收到以下异常:

Kan de naam Everyone niet omzetten (fout = 1332 (. System.Messaging.AccessControlList.MakeAcl(IntPtr oldAcl( bij System.Messaging.MessageQueue.SetPermissions(AccessControlList dacl( bij System.Messaging.MessageQueue.SetPermissions(String user, MessageQueueAccessRights rights, AccessControlEntryType entryType(

大致翻译为"无法转换名称'每个人'。相反,如果您使用此代码,您将获得"每个人"的本地化版本:

using System.Security.Principal;
** code ommitted**
string everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount)).Value;
queue.SetPermissions( 
                   everyone,
                   MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);