5

The System.Messaging.MessageQueue class does not provide a way to set ownership of queue. How do I programmatically set the owner of a MSMQ message queue?

Ken Browning
  • 28,693
  • 6
  • 56
  • 68

1 Answers1

6

The short answer is to p/invoke a call to the windows api function MQSetQueueSecurity

void SetOwner(MessageQueue queue, byte[] sid, bool ownerDefaulted = false)
{
    var securityDescriptor = new Win32.SECURITY_DESCRIPTOR();
    if (!Win32.InitializeSecurityDescriptor(securityDescriptor, Win32.SECURITY_DESCRIPTOR_REVISION))
        throw new Win32Exception();

    if (!Win32.SetSecurityDescriptorOwner(securityDescriptor, sid, ownerDefaulted))
        throw new Win32Exception();

    if (Win32.MQSetQueueSecurity(queue.FormatName, Win32.OWNER_SECURITY_INFORMATION, securityDescriptor))
        throw new Win32Exception();
}

A complete class which defines a SetOwner extension method on System.Messaging.MessageQueue can be found on github

Ken Browning
  • 28,693
  • 6
  • 56
  • 68