¿ Un bug estableciendo las seguridad en las colas MSMQ ?
Pues al menos tiene toda la pinta. Os cuento....
En un proyecto en el que estoy involucrado tengo un servicio WCF que está hosteado en un servicio Windows.El servicio windows corre con el usuario NetworkService ( con LocalSystem todo iba perfecto :-) ) y necesita acceder a unas colas MSMQ que previamente había creado.
Al instalar el servicio tenía un método para dar permisos al usuario NetworkService para acceder a las colas:
private void SetPermissionToQueue(string queuePath)
{
//Creamos la lista de acceso
AccessControlList accessControlList = new AccessControlList();
//Creamos una entrada para la lista
AccessControlEntry entry = new AccessControlEntry();
entry.Trustee = new Trustee(<nombre del usuario al que hay que dar permisos>);
entry.StandardAccessRights = StandardAccessRights.All;
entry.GenericAccessRights = GenericAccessRights.All;
entry.EntryType = AccessControlEntryType.Allow;
//Agregamos la entrada a la lista
accessControlList.Add(entry);
//Asignamos la lista de acceso a la cola
MessageQueue queue = new MessageQueue(queuePath);
queue.SetPermissions(accessControlList);
}
Parece sencillo, no ? Lanzado este código todo parecía que estaba bien. Reviso la seguridad de las colas en las herramientas administrativas y todo perfecto; el usuario NetworkService estaba incluido en la lista de usuarios con permisos y con todos los permisos que yo le había dado...
Pero no funciona. Arranco el servicio y éste no puede acceder a las colas; acceso denegado. Y Aquí empieza lo raro.
Si desde las herramientas administrativas de MSMQ accedo a la pestaña de seguridad y simplemente desmarco y marco cualquier opción, dejando todo igual...es decir, sin tocar nada, todo empieza a funcionar!!!!
Perfecto, ya tengo la solución. Cada vez que instale mi aplicacíón sólo tengo que ir ahí y desmarcar-marcar :-)
La solución? Pues usando otra sobrecarga de "SetPermissions" conseguí echarlo a funcionar.
private void SetPermissionToQueue(string queuePath)
{
MessageQueue queue = new MessageQueue(queuePath);
queue.SetPermissions(<nombre del usuario al que hay que dar permisos>, MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);
}
Con esto más sencillo y sobre todo, funciona :-)