【发布时间】:2019-03-26 19:27:06
【问题描述】:
我们正在将一个应用程序从一组 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 应用程序并执行将消息放入队列的操作时,尽管已确认已将 Everyone ACL 条目添加到队列,但它失败并显示 System.Messaging.MessageQueueException: Access to Message Queuing system is denied。
我遇到的真正奇怪的部分是,如果我删除有问题的队列并在服务器上手动重新创建它,并且具有相同的Everyone 具有完全控制权限,则代码可以成功运行。我已经将自动生成的队列的属性与手动创建的队列的属性进行了比较,一切都是 100% 相同的,所以为什么会发生这种情况是零意义的。
有什么建议吗?我很茫然,但如果我可以避免的话,尽量不必手动创建所有这些队列。
【问题讨论】:
-
在黑暗中拍摄,我知道我们的设置也需要“匿名登录”,并且在您手动创建队列时默认添加“发送”权限。也许这需要添加到您的程序化实施中?
-
为清楚起见,“所有人”仅包括 PC 可以看到的帐户(本地安全数据库、域成员等)。来自该区域之外的任何帐户,例如在外部域中的计算机上或处于工作组模式的帐户都需要“匿名登录”。
-
添加匿名登录不走运(它添加了,但没有改变任何东西),但是,我确实注意到手动创建的队列在 Server 2016 上实际上并没有(虽然我记得在Windows Server 的早期版本)。更奇怪的是,我注意到我们要从中移动的服务器上 IIS 中的应用程序池在本地管理员帐户(不是域管理员,只是与本地管理员关联的域帐户)的上下文中运行,所以我尝试设置到现在为止,仍然是拒绝访问错误。这真的没有意义。
标签: c# msmq windows-server-2016