我正在以编程的方式在Windows2003x64/2008R2服务器上创建几个Message Queues
。创建队列时,Windows会自动对队列应用默认权限。
对于MSMQ 4,默认情况下添加以下用户
当我使用MessageQueue.SetPermissions()
为队列设置权限时,指定的AccessControlList
仅追加到默认安全权限。
是否有任何方式可以删除或覆盖默认权限?在底部的这篇MSDN文章中,它声明
但是,您不能自定义缺省值,因为它们是硬编码的。
我知道队列的设置保存在位于C:\Windows\System32\msmq\storage\lqs
中的文件中。在这个文件中,有一个表示队列权限的Security属性。编辑这个键是一种选择吗?然而,对我来说,这样做似乎有点奇怪。
我正在寻找一种适当的方法来指定我自己的AccessControlList
,它覆盖队列的默认安全权限。不管是在它被创建的时候,还是之后。
任何帮助都是感激的,
谢谢。
发布于 2012-05-03 07:12:29
如果无法移除或撤销对这些默认组的权限,则始终可以尝试拒绝它们的权限。拒绝优先于允许。此代码适用于:
MessageQueue queue = new MessageQueue(".\\Private$\\QueueName");
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage,
AccessControlEntryType.Deny);
不过,撤销权限(AccessControlEntryType.Revoke
)也应该有效。也许您的代码中有错误。在我的机器上工作。
文章说:
但是,您不能自定义缺省值,因为它们是硬编码的。
这意味着您不能更改在队列创建过程中授予的权限,但是可以在之后更改它们。
编辑:使“每个人”独立于OS-语言:如何获得“每个人”在本地化系统上创建IdentityReference的MutexAccessRule?
发布于 2012-09-28 21:11:32
我和ACL也有同样的问题。当我切换到SetPermissions()方法时,情况要好得多。
下面的代码适用于我:
queue.SetPermissions(
"Everyone",
MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
queue.SetPermissions(
"ANONYMOUS LOGON",
MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
发布于 2017-05-02 16:35:00
虽然Mike的答案是正确的,但它假设服务器以英语为语言。如果在使用不同语言(在本例中为荷兰语)的服务器上使用此代码.
queue.SetPermissions(
"Everyone",
MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
..。您将得到以下例外:
简德纳姆每个人都不满意(fout = 1332 )。( System.Messaging.AccessControlList.MakeAcl(IntPtr oldAcl) bij System.Messaging.MessageQueue.SetPermissions(AccessControlList dacl( bij System.Messaging.MessageQueue.SetPermissions(String user,MessageQueueAccessRights oldAcl,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);
https://stackoverflow.com/questions/10426407
复制相似问题