2012-05-03 15 views
6

Estoy intentando crear programáticamente varios Message Queues en un servidor Windows 2003x64/2008R2. Cuando se crea una cola, Windows aplica automáticamente los permisos predeterminados a la cola.Establecer permisos predeterminados al crear un nuevo Message Queue (MSMQ) en C#

Para MSMQ 4, los siguientes usuarios se añaden de forma predeterminada

  • Todo el mundo
  • creador de la cola
  • Anónimo Login

Cuando establece los permisos para una cola utilizando MessageQueue.SetPermissions() , el AccessControlList especificado solo se agrega a los permisos de seguridad predeterminados.

¿Hay alguna manera de eliminar o sobreescribir los permisos predeterminados? En this MSDN Article en la parte inferior, se establece que

no se puede, sin embargo, personalizar los valores por defecto, ya que no son modificables.

Sé que la configuración de una cola se conserva en un archivo, ubicado en C:\Windows\System32\msmq\storage\lqs. En este archivo, hay una propiedad de seguridad que representa los permisos para la cola. ¿Podría ser una opción editar esta clave? Hacer esto, sin embargo, me parece algo extraño.

Estoy buscando una forma adecuada de especificar mi propio AccessControlList que sobrescribe los permisos de seguridad predeterminados de una cola. Ya sea cuando se está creando, o después.

Se agradece cualquier ayuda,

Thanks.

Respuesta

12

Si no puede eliminar o revocar permisos a esos grupos predeterminados, siempre puede intentar denegarles derechos. Denegar tiene prioridad sobre permitir. Este código funciona:

MessageQueue queue = new MessageQueue(".\\Private$\\QueueName"); 
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage, 
     AccessControlEntryType.Deny); 

permisos Revocación (AccessControlEntryType.Revoke) también deben trabajar sin embargo. Tal vez haya un error en tu código. Funciona en mi máquina.

El artículo dice:

no se puede, sin embargo, personalizar los valores por defecto, ya que no son modificables.

y significa que no puede cambiar los derechos otorgados durante la creación de la cola, pero puede cambiarlos después.

Editar: Para conseguir "Todo el mundo" independiente del OS-idioma: How to get the IdentityReference for "Everyone" to create MutexAccessRule on localized systems?

+1

Pero como 'Deny's tienen prioridad, y que está' Todo el mundo Deny'ing este derecho, ¿no significa eso que nadie puede usar la cola? ¿'Revocar' sería una mejor opción? –

+0

Revocar es mejor si funciona, pero usted escribió que no puede hacerlo. Funciona cuando lo intento. Inténtalo de nuevo con este código. –

+0

Sí 'Revocar' funciona. Sin embargo, ¿cómo puedo revocar los permisos para el propietario/creador? Este nombre de usuario no es siempre el mismo. – Dominik

6

que tenían el mismo problema exacto con la ACL. Cuando cambié al método SetPermissions() las cosas funcionaron mucho mejor.

El siguiente código funciona para mí:

   queue.SetPermissions(
        "Everyone", 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
       queue.SetPermissions(
        "ANONYMOUS LOGON", 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
0

Aunque la respuesta de Mike es correcta, se asume que el servidor tiene Inglés como idioma. Si utiliza este código en un servidor que utiliza un idioma diferente (en este caso holandés) ...

queue.SetPermissions( 
        "Everyone", 
        MessageQueueAccessRights.FullControl, 
         AccessControlEntryType.Allow); 

... se obtiene la siguiente excepción:

Kan de Naam Todo el mundo niet omzetten (fout = 1332). System.Messaging.AccessControlList.MakeAcl (IntPtr oldAcl) bij System.Messaging.MessageQueue.SetPermissions (AccessControlList DACL) bij System.Messaging.MessageQueue.SetPermissions (usuario String, derechos MessageQueueAccessRights, AccessControlEntryType EntryType)

que se traduce aproximadamente como 'No se puede convertir el nombre' Todos '. En cambio si se utiliza este código obtendrá una versión localizada de 'Todos':

using System.Security.Principal; 

** code ommitted** 

string everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount)).Value; 
queue.SetPermissions( 
        everyone, 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
Cuestiones relacionadas