Программно добавлены очереди MSMQ, отличные от ручного создания

#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, и один из их инженеров подтвердил, что в .Сетевая сторона с созданием очередей. Мы подтвердили, что все было идентично, но разрешения работали только в том случае, если очередь была создана вручную с помощью оснастки «Управление компьютером». Создание этого в коде, независимо от разрешений, привело к некорректной работе для нескольких учетных записей.

Надеюсь, это поможет всем, кто еще пытается это сделать!