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

Programatically Added MSMQ Queues Different From Manual Creation

我们正在将一个应用程序从 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,尽管有 Everyone ACL 条目已确认添加到队列中。

虽然我 运行 真正奇怪的部分是,如果我删除有问题的队列并在具有相同 Everyone 的服务器上手动重新创建它具有完全控制权限,代码工作成功。我将自动生成的队列的属性与手动创建的队列的属性进行了比较,一切都 100% 相同,因此为什么会发生这种情况毫无意义。

有什么建议吗?我不知所措,但如果可以避免的话,尽量不必手动创建所有这些队列。

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

希望这对其他尝试这样做的人有所帮助!