#c# #msmq #windows-server-2016
#c# #msmq #windows-server-2016
Вопрос:
Мы находимся в процессе переноса приложения с набора серверов 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;
}
Когда я запускаю наше веб-приложение на новом сервере и выполняю действие, которое помещает сообщение в очередь, оно завершается ошибкой с System.Messaging.MessageQueueException: Access to Message Queuing system is denied
, несмотря на Everyone
запись ACL, которая подтверждена добавлением в очередь.
Действительно странная часть, с которой я сталкиваюсь, заключается в том, что если я удаляю рассматриваемую очередь и воссоздаю ее вручную на сервере с теми же Everyone
правами полного контроля, код работает успешно. Я сравнил свойства автоматически сгенерированной очереди с созданной вручную, и все на 100% идентично, поэтому не имеет никакого смысла, почему это могло произойти.
Есть предложения? Я в растерянности, но стараюсь не создавать все эти очереди вручную, если смогу этого избежать.
Комментарии:
1. Я знаю, что для нашей настройки также требуется «АНОНИМНЫЙ ВХОД», который добавляется по умолчанию с разрешением «отправить» при создании очереди вручную. Может быть, это нужно добавить в вашу программную реализацию?
2. Для ясности, «Все» включают только учетные записи, которые может видеть компьютер (локальная база данных безопасности, участники домена и т.д.). Для любых учетных записей за пределами этой области, например, на компьютерах в иностранных доменах или в режиме рабочей группы, требуется «анонимный вход».
3. Не повезло с добавлением АНОНИМНОГО ВХОДА в СИСТЕМУ (это добавило, но ничего не изменило), однако я заметил, что созданные вручную очереди на самом деле не имеют этого на сервере 2016 (хотя я помню, что видел это в предыдущих версиях Windows Server). Еще более странно, я заметил, что пул приложений в IIS на сервере, с которого мы переходим, запущен в контексте учетной записи локального администратора (не администратора домена, просто учетной записи домена, связанной с локальными администраторами), поэтому я попытался настроить это на данный момент, и все равно ошибка «Отказано в доступе». Это действительно не имеет смысла.
Ответ №1:
После долгого тестирования я обратился в службу поддержки Microsoft, и один из их инженеров подтвердил, что в .Сетевая сторона с созданием очередей. Мы подтвердили, что все было идентично, но разрешения работали только в том случае, если очередь была создана вручную с помощью оснастки «Управление компьютером». Создание этого в коде, независимо от разрешений, привело к некорректной работе для нескольких учетных записей.
Надеюсь, это поможет всем, кто еще пытается это сделать!