以编程方式添加了与手动创建不同的MSMQ队列

问题描述 投票:0回答:1

我们正在将应用程序从Server 2008服务器集迁移到Server 2016,并且由于此应用程序有大约75个私有MSMQ队列,我编写了一个非常基本的C#实用程序(只是一个控制台应用程序)来获取我们的列表。生产服务器并通过以下方式在新的2016服务器上重新创建它们:

//connect to the specified server to pull all existings queues
var queues = MessageQueue.GetPrivateQueuesByMachine("[production server name]");

var acl = new AccessControlList();

acl.Add(new AccessControlEntry
{
    EntryType = AccessControlEntryType.Allow,
    GenericAccessRights = GenericAccessRights.All,
    StandardAccessRights = StandardAccessRights.All,
    Trustee = new Trustee("Everyone")
});

acl.Add(new AccessControlEntry
{
    EntryType = AccessControlEntryType.Allow,
    GenericAccessRights = GenericAccessRights.All,
    StandardAccessRights = StandardAccessRights.All,
    Trustee = new Trustee("Network Service")
});

foreach (var queue in queues)
{
    var newQueue = MessageQueue.Create($".\\{queue.QueueName}", true);
    newQueue.SetPermissions(acl);
    newQueue.Label = queue.QueueName;
}

当我开始在新服务器上运行我们的Web应用程序并执行将消息放入队列的操作时,尽管System.Messaging.MessageQueueException: Access to Message Queuing system is denied ACL条目已确认已添加到队列,但它仍然使用Everyone失败。

我遇到的真正奇怪的部分是,如果我删除有问题的队列并在服务器上手动重新创建它具有相同的Everyone具有完全控制权限,代码可以成功运行。我已经将自动生成的队列的属性与手动创建的队列的属性进行了比较,并且所有内容都是100%相同,因此无法理解为什么会发生这种情况。

有什么建议?我很茫然,但是如果我可以避免它,就不要手动创建所有这些队列。

c# msmq windows-server-2016
1个回答
0
投票

经过大量的来回测试后,我联系了Microsoft支持部门,他们的一位工程师已经确认.Net方面存在某种创建队列的错误。我们确认一切都是相同的,但权限工作的唯一时间是队列是通过“计算机管理”管理单元手动创建的。无论权限如何,在代码中创建它都会导致它无法正常运行多个帐户。

希望这有助于其他人尝试这样做!

© www.soinside.com 2019 - 2024. All rights reserved.