2013-08-05 28 views
6

プライベートキューでメッセージを送信するアクセス許可の選択を解除しましたが、MessageQueue.CanWriteは返信なしfalseです。受信メッセージのアクセス許可を切り替えることができ、CanReadプロパティが期待通りに応答します。 CanWriteプロパティの動作が異なるのはなぜですか?MessageQueue.CanWriteは常にtrueを返します

私はいくつかの異なるADユーザーでこの問題をテストしましたが、結果は同じです。

特定のユーザーアカウントが特定のリモートプライベートキューにメッセージを送信できるかどうかを検証する別の方法はありますか?私が言うことができるものから、

public class SendBehavior : IMsmqRuleBehavior 
{ 
    public bool Validate(string queuePath) 
    { 
     using (var queue = new MessageQueue(queuePath, QueueAccessMode.Send)) 
     { 
      return queue.CanWrite;           
     } 
    } 
} 

public class ReceiveBehavior : IMsmqRuleBehavior 
{ 
    public bool Validate(string queuePath) 
    { 
     using (var queue = new MessageQueue(queuePath, QueueAccessMode.Receive)) 
     { 
      return queue.CanRead;     
     } 
    } 
} 
+0

'QueueAccessMode.Send'に' CanWrite'が 'true'となるように要求されているようです。*(側の質問:あなたはこのキューのための」Authenticated'チェックボックスを切り替えた)* – user7116

+0

私はその考えられますが、デフォルトのQueueAccessModeはSendAndReceiveで、受信するように設定QueueAccessModeで期待通りCanReadテストが動作します。 – chad

+0

'QueueAccessMode.Receive'を設定すると' CanWrite'は 'false'になりますか? ILSpyの 'MessageQueue'クラスの私の見直しから、あなたのモードだけがそれらのプロパティ値を反映しているようです。 – user7116

答えて

3

、この動作はMessageQueue.CanWriteためを意図したとおりにです。あなたがメッセージキュークラスの根性に十分深く掘り下げる場合、あなたはそれが次のように、このプロパティの値に影響を与えるいくつかのヘルパーオブジェクトを作成し、見つけることができます:

  1. あなたがQueueAccessMode.Send(またはSendAndReceive)を渡すと、 (this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0の場合、trueを返す内部アクセスモードヘルパーが作成されます。

  2. #1がtrueの場合、アクセスモードと要求した共有を使用して、キューを開いてキャッシュに格納しようとします。要求されたモードでキューを開くためのアクセス権は、呼び出し元のアプリケーションのために許可されていない場合は

    :(強調鉱山)の備考欄に、以下の持っているネイティブメソッドMQOpenQueueへの呼び出しが行われた。この時点で、次の2つのことが起こることができます。

    • dwAccessMQ_SEND_ACCESSに設定されている場合は、MQOpenQueueを成功しますが、アプリケーションがメッセージを送信しようとするとエラーが返されます。
    • dwAccessMQ_PEEK_ACCESSまたはMQ_RECEIVE_ACCESSに設定されている場合は、MQOpenQueueは失敗とMQ_ERROR_ACCESS_DENIED(0xC00E0025)を返します。この場合、キューハンドルはphQueueに返されません。

したがって、有効なキュー名と共有モードでQueueAccessMode.Send(またはSendAndReceive)与えられ、それはあなたが本当に送信するためのアクセス権を持っていない場合でも、CanWritetrueを返すことを私の理解でありますメッセージ。

  1. あなたはSendSendAndReceiveないQueueAccessModeを渡す:

    は、基本的にはしている場合にのみ場合にのみCanWrite == falseを受けることが表示されます。

+0

これを掘り下げていただきありがとうございます。私はキューにメッセージを送信するときに、なぜ「CanRead」プロパティの真/偽のトグルでキュー結果に受信メッセージの権限を切り替えるとなり、送信無効にして、メッセージがキューにそれを作ることはありませんが、私はありませんよ例外も受け取ります。それは私には奇妙に思える。私はCanReadとCanWriteが同じように動作すると思います。 – chad

+0

@ChadLazette:私はあなたのためのより良い答えを持っていたいが、私は見ることができるものから、この動作は、もう一方の端上のキューの実際の権限に基づいていません。 – user7116

+0

十分に良い。それは有り難いです。ユーザーがメッセージを送信できるかどうかを確認する別の方法を考えなければなりません。 – chad

関連する問題