6

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

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

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

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

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

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

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

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

任何帮助表示赞赏,

谢谢。

4

3 回答 3

12

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

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

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

文章说:

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

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

编辑:让“每个人”独立于操作系统语言:如何获得“每个人”的 IdentityReference 以在本地化系统上创建 MutexAccessRule?

于 2012-05-03T07:12:29.270 回答
6

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

下面的代码对我有用:

                queue.SetPermissions(
                    "Everyone",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
                queue.SetPermissions(
                    "ANONYMOUS LOGON",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
于 2012-09-28T21:11:32.953 回答
2

尽管 Mike 的回答是正确的,但它假定服务器使用英语作为语言。如果您在使用不同语言(在本例中为荷兰语)的服务器上使用此代码...

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

...你得到以下异常:

Kan de naam 每个人都 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);
于 2017-05-02T16:35:00.007 回答