2015-08-28 70 views
4

我有一個非常簡單的控制檯應用程序,它在查看遠程專用隊列中的消息時遇到麻煩。無法編程式地窺探到遠程(專用)msmq:訪問消息隊列系統被拒絕

var queues = MessageQueue.GetPrivateQueuesByMachine(machineName); 
var queue = queues.Where(x=>x.FormatName == queueName).Single(); 
Message message = queue.Peek(); 

Peek調用失敗,MessageQueueException爲「訪問消息隊列系統被拒絕」。

使用相同的客戶機和用戶我能夠使用隊列資源管理器和消息隊列管理單元查看隊列。

試驗一個本地隊列我只能通過刪除隊列上的Peek權限來重現錯誤,但也會在其他工具中停止它。

我看過很多信息,這些信息指向我列出的問題here

但是,看起來好像這些問題中的任何一個都是問題,我也無法使用其他工具來完成。

編輯 我已經能夠得到這個使用MSMQQueueInfo/MSMQQueue COM對象不改變任何憑據的工作。 這將是很好,如果我可以使用.NET庫的工作,但至少我有一個解決方法。

+0

你放什麼在計算機名和QUEUENAME?你是如何初始化它們的?你如何以及如何將消息放入MessageQueue? –

+0

這個例子有點簡化。我沒有任何麻煩列出隊列或選擇我感興趣的特定隊列。 對於這種特殊情況,我正在查看來自我們的一個生產應用程序的錯誤隊列。我知道隊列中有消息,因爲我可以使用其他工具看到它們。 – drs9222

+1

你配置了哪些權限? –

回答

3

我的問題是,當使用GetPrivateQueuesByMachine來獲得隊列時,它使用的訪問模式爲SendAndReceive,它需要更多的權限,然後我有。我不得不使用MessageQueue構造函數來指定AccessMode。 (在這種情況下PEEK)

最後,我能得到這個使用類似於下面的代碼工作:

var queue = new MessageQueue(@"FormatName:DIRECT=OS:machineName\private$\queueName", QueueAccessMode.Peek); 
Message message = queue.Peek(); 
2

我也有同樣的問題。在我的情況下,我在父線程中初始化Message Queue並在子線程中訪問Peek函數。

如果您使用多線程,請嘗試在同一線程中保持函數的初始化和訪問。

2

在各種實用程序中顯示的隊列並沒有告訴你那麼多。這樣的效用不太可能在消息中偷看。一般來說,默認訪問權限允許每個人看到隊列併發送消息給它。但不能檢索它們。

在擁有此隊列的計算機上,使用控制面板>管理工具>計算機管理>服務和應用程序>消息隊列>專用隊列。選擇隊列並右鍵單擊>屬性>安全選項卡。請注意,Everbody有一些權利,如「獲取屬性」和「發送消息」。但不是「Peek Message」。

要做的只是添加您在另一臺機器上使用的用戶帳戶並勾選完成工作所需的權限。如果這臺機器由管理員管理,那麼你需要讓他們爲你做。

+0

我無法訪問機器本身,也無法查看權限。 這不是事實,隊列顯示在其他公用事業,我要走了。這是我可以查看完整的信息,並做任何我想要的東西。例如,我經常複製錯誤隊列中的消息並重播它們。 我以窺視爲例,但無法讓我的應用程序執行任何與使用其他工具相同的操作。 我試圖自動化一些我經常使用其他工具做的任務,所以我知道即使看不到它們,我也必須擁有所需的權限。 – drs9222

+0

我很懷疑。這就是爲什麼我建議要求管理員處理它。 「我仍然可以做到這一點」仍然不是一團糟,看着錯誤隊列是不一樣的,「重放」肯定不會成爲問題,因爲每個人都可以發送消息。與管理員交談,以便知道*事實*。 –

+0

我確認與管理員,我確實有偷看訪問。 – drs9222