以编程方式添加的 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 端创建队列时存在某种错误。我们确认一切都相同,但唯一有效的权限是队列是通过计算机管理管理单元手动创建的。在代码中创建它,无论权限如何,都会导致它无法为多个帐户正常工作。
希望这对其他尝试这样做的人有所帮助!
我们正在将一个应用程序从 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 端创建队列时存在某种错误。我们确认一切都相同,但唯一有效的权限是队列是通过计算机管理管理单元手动创建的。在代码中创建它,无论权限如何,都会导致它无法为多个帐户正常工作。
希望这对其他尝试这样做的人有所帮助!