2013-08-05 27 views
6

Mam odznaczone uprawnienia do wysyłania wiadomości w prywatnej kolejce, ale MessageQueue.CanWrite nigdy nie zwraca false. Mogę przełączać uprawnienia Odbierz wiadomość, a właściwość CanRead reaguje zgodnie z oczekiwaniami. Dlaczego własność CanWrite zachowuje się inaczej?MessageQueue.CanWrite zawsze zwraca true

Testowałem ten problem z kilkoma różnymi użytkownikami AD, a wyniki są takie same.

Czy istnieje inne podejście do sprawdzania, czy określone konto użytkownika może wysłać wiadomość do określonej zdalnej kolejki prywatnej?

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

Wygląda na to, że jeśli 'QueueAccessMode.Send' jest wymagane, to' CanWrite' będzie prawdopodobnie "prawdziwe".* (pytanie poboczne: czy przełączono pole wyboru "Uwierzytelnione" dla tej kolejki) * – user7116

+0

Rozważałem to, ale domyślną kolejką QueueAccessMode jest SendAndReceive, a test CanRead zachowuje się zgodnie z oczekiwaniami, gdy parametr QueueAccessMode jest ustawiony na Odbiór. – chad

+0

Czy "CanWrite' zmienia się w" false ", gdy ustawisz' QueueAccessMode.Receive'? Ponieważ z mojej recenzji klasy 'MessageQueue' w ILSpy wydaje się, że tylko twoje tryby, które podasz odzwierciedlają te wartości właściwości. – user7116

Odpowiedz

3

Z tego co mogę powiedzieć, to zachowanie jest jako przeznaczone dla MessageQueue.CanWrite. Jeśli zagłębić się na tyle głęboko w trzewiach klasy kolejka komunikatów, znajdziesz to stwarza pewne obiekty pomocnicze, które mają wpływ na wartość tej właściwości w następujący sposób:

  1. jeśli przechodzą QueueAccessMode.Send (lub SendAndReceive) zostanie utworzony pomocnik trybu dostępu wewnętrznego, który zwróci true, jeśli (this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0.

  2. Jeśli nr 1 to true, wówczas próbuje otworzyć kolejkę, aby zapisać ją w pamięci podręcznej, korzystając z trybu dostępu i udostępniania, o które prosiłeś. W tym momencie jest wykonany wezwanie do rodzimej metody MQOpenQueue, która ma następujący w swoich uwagach (kopalnia nacisk):

    Jeśli prawa dostępu do otwierania kolejkę w trybie wymaganym nie są dopuszczone do aplikacji wywołującej następujące dwie rzeczy mogą się zdarzyć:

    • Jeśli dwAccess jest ustawiony na MQ_SEND_ACCESS, MQOpenQueue uda, ale błędy będą zwracane, gdy aplikacja próbuje wysłać wiadomość.
    • Jeśli dwAccess jest ustawiony na MQ_PEEK_ACCESS lub MQ_RECEIVE_ACCESS, MQOpenQueue zawiedzie i powrócić MQ_ERROR_ACCESS_DENIED (0xC00E0025). W tym przypadku uchwyt kolejki nie jest zwracany do phQueue.

Dlatego też, biorąc pod uwagę QueueAccessMode.Send (lub SendAndReceive) z poprawną nazwą kolejki i trybu udostępniania, to jest moje zrozumienie, że CanWrite powróci true, nawet jeśli naprawdę nie ma dostępu, aby wysłać wiadomość.

Zasadniczo wydaje się, że otrzymasz tylko CanWrite == false wtedy i tylko wtedy, gdy:

  1. Zdasz QueueAccessMode który nie jest Send lub SendAndReceive.
+0

Dzięki za wkopanie się w to. Dlaczego przełączanie uprawnień Odbieranie wiadomości w kolejce skutkuje przełączaniem true/false właściwości "CanRead" i kiedy wysyłam komunikat do kolejki, przy opcji Wyślij wyłączone, komunikat nigdy nie przenosi go do kolejki, ale nie jestem otrzymujący wyjątek. Wydaje mi się to dziwne. Sądzę, że CanRead i CanWrite zachowują się w ten sam sposób. – chad

+0

@ChadLazette: Żałuję, że nie mam dla ciebie lepszej odpowiedzi, ale z tego, co widzę, to zachowanie nie jest oparte na prawdziwych uprawnieniach kolejki na drugim końcu. – user7116

+0

Wystarczająco fair. Doceniam to. Będę musiał wymyślić inny sposób sprawdzenia, czy użytkownik może wysłać wiadomość. – chad

Powiązane problemy