2009-08-28 272 views
0

我正在嘗試訪問隊列並收到訪問被拒絕的錯誤。令人困惑的部分是隊列被設置爲允許所有人完全控制以及匿名和機器名$(所有三個都是完全控制 - 這是一個測試系統,所以不是什麼大問題)。我能夠成功寫入隊列,但不能從中讀取/讀取/接收。我在這裏發現了一篇文章,建議使用FormatName方法,但不幸的是我已經這樣做了。MSMQ拒絕訪問

捕捉到這是我的系統是在一個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 

回答

2

要讓MSMQ跨域工作,有問題的域必須建立雙向信任關係。消息隊列必須是公共隊列。如果您將它設置爲事務性隊列,則客戶端和服務器必須使用MSMQ 4.0(Windows Server 2008及更高版本的一部分)

+0

啊,我們沒有信任,但這確實很有道理。所以即使我將其設置爲公共排隊,我是否仍需要信任? 我使用的Vista - >服務器2008年,所以我應該在MSMQ 4.0已經。 – RubyHaus 2009-08-29 15:47:46

+0

定義公用隊列的信息存儲在承載隊列的計算機對象下的Active Directory中。 MSMQ依靠kerberos來保證安全。 – 2009-08-30 05:38:50

+0

有沒有什麼辦法可以禁用安全或不安全?隊列只在內部,所以不存在任何未經授權的訪問的風險。 – RubyHaus 2009-08-30 15:39:54

0

它不應該是一個問題,即系統在不同的領域,除非你正在使用的身份驗證域。當你給「系統」完全控制時會發生什麼?請修改您的問題以包含您用於打開隊列的代碼以及如果這不能解決問題的確切錯誤。

+0

我編輯帖子以包含代碼。我也嘗試添加系統完全控制到有問題的隊列,沒有運氣。 – RubyHaus 2009-08-28 23:52:13

+0

你能否在你實際構造m_mq的地方包含代碼?在哪裏分配隊列路徑,然後告訴它打開它? – olle 2009-08-29 00:30:19

+0

呃...不是。以上操作的代碼如下所示: m_mq =新的MessageQueue(Me.ManagerConfiguration.RequestQueue) M_SIG =新Threading.AutoResetEvent(假) 的ManagerConfiguration.RequestQueue是一個字符串,這就是我與「FORMATNAME」項。如果我直接在服務器上運行代碼,代碼完美工作 - 只有當我遠程連接時它纔會死掉。 – RubyHaus 2009-08-29 01:15:51

1

僅供測試時使用匿名完全控制。

+0

我做過 - 匿名,每個人,系統和服務器$(其中服務器是計算機名稱)都具有完全控制權。沒有列出其他許可,但它仍然是相同的錯誤。 – RubyHaus 2009-08-29 15:44:04

1

檢查客戶端和服務器之間的時鐘:太大的時間跨度可能會導致「訪問被拒絕」。