2013-08-05 25 views
6

Özel bir sırada İleti Gönderme izinlerinin seçimini kaldırdım ancak MessageQueue.CanWrite hiçbir zaman false değerini döndürmez. İleti Alma izinlerini değiştirebilir ve CanRead özelliği beklendiği gibi yanıt verebilir. Neden CanWrite özelliği farklı davranıyor?MessageQueue.CanWrite her zaman true değerini döndürür

Birkaç farklı AD kullanıcısıyla bu sorunu test ettim ve sonuçlar aynı.

Belirli bir kullanıcı hesabının belirli bir uzak özel kuyruğa bir ileti gönderip gönderemeyeceğini doğrulamak için farklı bir yaklaşım var mı? Söyleyebileceğim kadarıyla

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

Görünüşe göre 'CanWrite' muhtemelen 'true' olması gerektiği QueueAccessMode.Send.* (yan soru: Bu sıra için 'Authenticated' onay kutusunu açtınız mı) * – user7116

+0

Bunu kabul ettim ama varsayılan QueueAccessMode SendAndReceive ve CanRead testi, QueueAccessMode Receive için ayarlanmış olarak beklendiği gibi davranır. – chad

+0

'QueueAccessMode.Receive' öğesini ayarladığınızda CanWrite' 'false 'olur mu? Çünkü ILSpy'deki 'MessageQueue' sınıfını incelediğimden, yalnızca verdiğiniz modların bu özellik değerlerini yansıttığı görülüyor. – user7116

cevap

3

, bu davranış MessageQueue.CanWrite için amaçlandığı gibi olduğunu. , Sen QueueAccessMode.Send (veya SendAndReceive) geçerseniz

  1. : Eğer MessageQueue sınıfının bağırsaklar içine yeterince derin defterleri, bunu şu şekilde bu özelliğin değerini etkileyen bazı yardımcı nesneleri oluşturur bulacaksınız (this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0 ise true döndüren bir iç erişim modu yardımcı oluşturulacaktır.

  2. # 1, true ise, daha sonra istediğiniz modu ve paylaşım modunu kullanarak önbelleğe depolamak için kuyruğu açmaya çalışır. İstenen modda kuyruğunu açma için erişim hakları çağıran uygulama için izniniz yoksa

    : (vurgu mayın) kendi sözlerinde aşağıdaki sahiptir yerli yönteme MQOpenQueue yapılan bir çağrı yapıldığında Bu noktada aşağıdaki iki şey olabilir: dwAccessMQ_SEND_ACCESS olarak ayarlanır

    • ise MQOpenQueue başarılı olur, ancak hatalar uygulama bir mesaj göndermek çalıştığında iade edilecektir.
    • dwAccessMQ_PEEK_ACCESS veya MQ_RECEIVE_ACCESS ayarlanırsa, MQOpenQueue başarısız ve MQ_ERROR_ACCESS_DENIED (0xC00E0025) dönecektir. Bu durumda, bir sıra tanıtıcısı phQueue'a iade edilmez. Verilen nedenle

, bir QueueAccessMode.Send (veya SendAndReceive) geçerli kuyruk adı ve paylaşım modu ile, gerçek anlamda bir gönderme erişiminiz yoksa bile CanWrite, true dönecektir benim anlaşılmasıdır mesaj.

  1. Sen Send veya SendAndReceive olmayan bir QueueAccessMode pass:

    Temel olarak ve ancak eğer sadece CanWrite == false alacaksınız anlaşılmaktadır.

+0

Bunu kazmaya çalıştığınız için teşekkür ederiz. Alma İletisi izinlerinin sıradaki neden değiştirileceği, "CanRead" özelliğinin gerçek/yanlış geçişiyle sonuçlanır ve Gönderme devre dışı bırakıldığında, sıraya bir ileti gönderdiğimde ileti hiçbir zaman kuyruğa girmez. bir istisna almak da. Bu bana garip geliyor. CanRead ve CanWrite'ın aynı şekilde davranacağını düşünürdüm. – chad

+0

@ChadLazette: Keşke sizin için daha iyi bir cevabım olsaydı, ancak bu davranışı görebildiğimden, diğer uçtaki sıranın gerçek izinlerine dayanmaz. – user7116

+0

Yeterince adil. Bunu takdir ediyorum. Bir kullanıcının mesaj gönderip gönderemeyeceğini doğrulamak için başka bir yol bulmak zorundayım. – chad

İlgili konular