EL PROBLEMA
Llevo un tiempo largo involucrado en un proyecto bastante grande,o muy grande, depende de cómo se mire que incorpora el uso de WCF sobre MSMQ, algo que por cierto me encanta y que arquitectónicamente resuelve multitud de problemas, aunque también tiene su chicha y de la que es posible que algún día hable en este blog. El caso es que claro está una de las partes del proyecto involucra el desplegado, y una de las fases de este desplegado es la asignación de permisos a las colas de MSMQ que serán usadas por los servicios de Windows Comnunication Foundation, para los que ya conozcáis System.Messaging diréis que no tiene mayor misterio y que basta con crear un Truste y una AccessControlEntry y asignárselo a la cola, vamos algo como lo que sigue
using System;
using System.Collections.Generic;
using System.Text;
using System.Messaging;
namespace ConsoleApplication1
{
class
Program
{
static
void Main(string[] args)
{
//Creamos la lista de acceso
AccessControlList accessControlList = new
AccessControlList();
//Creamos una entrada para la lista
AccessControlEntry entry = new
AccessControlEntry();
entry.Trustee = new
Trustee(«EL_USUARIO»);
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(«PATH_MSMQ_QUEUE»);
queue.SetPermissions(accessControlList);
}
}
}
El caso ‘extraño’ es que la asignación de permisos no se realiza realmente, ya que el servicio daba una excepción de seguridad confirmando que no se tenía acceso a la cola a la que intentaba acceder, sin embargo en la lista ACL de la misma los permisos estaban establecidos. ¿Qué pasa? Más extraño resulta el caso si dentro de la lista de ACL dónde puedes ver los permisos que se han asignado los deschequeas y los vuelves a chequear entonces todo funciona de forma correcta.
LA SOLUCIÓN
La solución hay que otorgársela a Ibon, una persona muy habitual a Geeks y que seguramente, si Rodrigo consigue de una vez crearle un blog, escribirá pronto esta y otras muchas anécdotas por estos lares, que consiguió encontrar por la red una persona a la que le ocurrió lo mismo y se dio cuenta de la solución, básicamente agregar unas líneas que resolvían el problema
MessageQueue m = new
MessageQueue(MSMQInstaller.Path);
m.SetPermissions(«SYSTEM», MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);
Curioso verdad???? Bueno… hay queda por si a otro le pasa lo mismo….
Saludos
Unai