首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中创建新消息队列时设置默认权限

在C#中创建新消息队列时设置默认权限
EN

Stack Overflow用户
提问于 2012-05-03 06:45:05
回答 3查看 10K关注 0票数 6

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

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

  • 所有人
  • 队列创建者
  • 匿名登录

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

是否有任何方式可以删除或覆盖默认权限?在底部的这篇MSDN文章中,它声明

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

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

我正在寻找一种适当的方法来指定我自己的AccessControlList,它覆盖队列的默认安全权限。不管是在它被创建的时候,还是之后。

任何帮助都是感激的,

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-03 07:12:29

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

代码语言:javascript
运行
复制
MessageQueue queue = new MessageQueue(".\\Private$\\QueueName");
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage,
        AccessControlEntryType.Deny);

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

文章说:

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

这意味着您不能更改在队列创建过程中授予的权限,但是可以在之后更改它们。

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

票数 12
EN

Stack Overflow用户

发布于 2012-09-28 21:11:32

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

下面的代码适用于我:

代码语言:javascript
运行
复制
                queue.SetPermissions(
                    "Everyone",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
                queue.SetPermissions(
                    "ANONYMOUS LOGON",
                    MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
票数 6
EN

Stack Overflow用户

发布于 2017-05-02 16:35:00

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

代码语言:javascript
运行
复制
 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”的本地化版本:

代码语言:javascript
运行
复制
using System.Security.Principal;

** code ommitted**

string everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount)).Value;
queue.SetPermissions( 
                   everyone,
                   MessageQueueAccessRights.FullControl,
                    AccessControlEntryType.Allow);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10426407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档