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

时间:2012-05-03 06:45:06

标签: c# permissions msmq

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

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

  • 每个人
  • 队列的创建者
  • ANONYMOUS LOGIN

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

是否可以删除或覆盖默认权限? 在底部的this MSDN Article中,它声明了

  

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

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

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

感谢任何帮助,

感谢。

3 个答案:

答案 0 :(得分:12)

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

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

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

文章说:

  

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

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

编辑:让“所有人”独立于操作系统语言:How to get the IdentityReference for "Everyone" to create MutexAccessRule on localized systems?

答案 1 :(得分:6)

我与ACL有同样的问题。当我切换到SetPermissions()方法时,情况要好得多。

以下代码适用于我:

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

答案 2 :(得分:1)

虽然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)

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

using System.Security.Principal;

** code ommitted**

string everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount)).Value;
queue.SetPermissions( 
                   everyone,
                   MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);