我正在尝试以编程方式在Windows 2003x64 / 2008R2服务器上创建多个Message Queues
。
创建队列时,Windows会自动将默认权限应用于队列。
对于MSMQ 4,默认情况下会添加以下用户
当我使用MessageQueue.SetPermissions()
设置队列的权限时,指定的AccessControlList
仅附加到默认安全权限。
是否可以删除或覆盖默认权限? 在底部的this MSDN Article中,它声明了
但是,您不能自定义默认值,因为它们是硬编码的。
我知道队列的设置会保存在C:\Windows\System32\msmq\storage\lqs
中的文件中。在此文件中有一个Security属性,表示队列的权限。可以选择编辑此密钥吗?但是,这样做对我来说似乎很奇怪。
我正在寻找一种正确的方法来指定我自己的AccessControlList
,它会覆盖队列的默认安全权限。无论是在创建时还是之后。
感谢任何帮助,
感谢。
答案 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);