Отказано в доступе к MSMQ

Я пытаюсь получить доступ к очереди и получаю сообщение об отказе в доступе. Запутанная часть заключается в том, что очередь настроена так, чтобы позволить всем иметь полный контроль, а также анониму и имя_машины$ (все три имеют полный контроль - это тестовая система, поэтому не имеет большого значения). Я могу успешно писать в очередь, но не могу просматривать/читать/получать из нее. Я нашел здесь одну статью, в которой предлагалось использовать метод FormatName, но, к сожалению, я уже это делаю.

Загвоздка в том, что моя система находится в одном домене AD, а тестовый сервер полностью работает с другим доменом (мой клиент). Пытаюсь ли я совершить невозможное с помощью этого?

Моя платформа — Vista x64, а сервер — 2008 (не R2).

Код выглядит следующим образом:

    Do While Not m_boolCancel

        '**Code dies on this line**
        l_ar = m_mq.BeginPeek

        'block thread till message arrived or shutdown is signalled
        If WaitHandle.WaitAny(New WaitHandle() {m_sig, l_ar.AsyncWaitHandle}) > 0 Then

            l_msg = m_mq.EndPeek(l_ar)

            If l_msg IsNot Nothing Then

                'doing stuff here

            End If

            Exit Do
        End If

person Scott Salyer    schedule 28.08.2009    source источник


Ответы (4)


Для работы MSMQ между доменами в рассматриваемых доменах должно быть установлено двустороннее доверие. Очередь сообщений должна быть общедоступной. Если вы установили его как транзакционную очередь, и клиент, и сервер должны использовать MSMQ 4.0 (часть Windows Server 2008 и более поздних версий).

person Joe Caffeine    schedule 29.08.2009
comment
Ах, у нас нет траста, но в этом есть смысл. Таким образом, даже если я настрою ее как общедоступную очередь, мне все равно придется иметь доверие? Я использую Vista -> Server 2008, поэтому я уже должен использовать MSMQ 4.0. - person Scott Salyer; 29.08.2009
comment
Информация, определяющая общую очередь, хранится в Active Directory под объектом-компьютером, на котором размещена очередь. MSMQ полагается на Kerberos для обеспечения безопасности. - person Joe Caffeine; 30.08.2009
comment
Есть ли способ отключить защиту или нет? Очереди являются только внутренними, поэтому в любом случае нет риска того, что к ним получит доступ кто-либо неавторизованный. - person Scott Salyer; 30.08.2009
comment
Однако я не знаю, что MSMQ можно настроить для связи через http, но я не пробовал. - person Joe Caffeine; 30.08.2009

Просто для теста дайте анониму полный контроль.

person Igal Serban    schedule 29.08.2009
comment
Я сделал - анонимно, все, система и сервер $ (где сервер - это имя компьютера) имеют полный контроль. Никаких других разрешений на нем не указано, но это все та же ошибка. - person Scott Salyer; 29.08.2009

Проверьте часы между клиентом и сервером: слишком большой временной интервал может привести к «отказу в доступе».

person Henrik Vittrup    schedule 09.12.2010

Не должно быть проблемой, что системы находятся в разных доменах, если вы не используете домен для аутентификации. Что происходит, когда вы даете «Системе» полный контроль? Пожалуйста, отредактируйте свой вопрос, указав код, который вы используете для открытия очереди, и точную ошибку, которую вы получите, если это не решит проблему.

person olle    schedule 28.08.2009
comment
Я отредактировал сообщение, чтобы включить код. Я также попытался добавить Систему с полным контролем в рассматриваемую очередь, но безуспешно. - person Scott Salyer; 29.08.2009
comment
можете ли вы включить код, в котором вы фактически создаете m_mq? где вы назначаете путь очереди, а затем говорите, чтобы открыть его? - person olle; 29.08.2009
comment
Ну не совсем. Код для этого выглядит следующим образом: m_mq = New MessageQueue(Me.ManagerConfiguration.RequestQueue) m_sig = New Threading.AutoResetEvent(False) ManagerConfiguration.RequestQueue — это строка, и именно здесь находится моя запись с FormatName. Код отлично работает, если я запускаю его прямо на сервере - только когда я подключаюсь удаленно, он умирает. - person Scott Salyer; 29.08.2009