Una de las ultimas cosas que se realizan cuando uno esta finalizando una implementacion de CRM es generalmente el ajuste de los roles de seguridad.
Creamos y copiamos roles modificando los permisos sobre las entidades y sus acciones según nuestras necesidades.
Una de las cosas que se explican en los libros de CRM desde la versión 1.2 es el evitar borrar los roles de sistema, es decir, esos roles que se crean al instalar la aplicación.
Ahora bien, en contraposición a lo anterior el CRM nos permite borrar los roles de sistema!!!!.. Entonces por que no hacerlo???...y acá comienzan los problemas...
Un motivo ya se lo están imaginando por el título de esta entrada... y si, efectivamente, al borrar los roles de sistema CRM nos da un error al crear una nueva entidad.
Como siempre el error que vamos a obtener es:
Se ha producido un error, consulte con el administrador.
Pero si hacemos un trace:
>Crm Exception: Message: roleId, ErrorCode: -2147220989, InnerException: System.ArgumentException: roleId
[2008-03-12 15:35:39.6] Process: w3wp |Organization:c21461e1-7398-4eef-893a-1dc10cfd626a |Thread: 9 |Category: Platform.Metadata |User: 00000000-0000-0000-0000-000000000000 |Level: Error | EntityService.Create
>EntityService.Create caught exception: Microsoft.Crm.CrmArgumentException: roleId ---> System.ArgumentException: roleId
--- End of inner exception stack trace ---
at Microsoft.Crm.Exceptions.ThrowIfGuidEmpty(Guid parameter, String name)
at Microsoft.Crm.ObjectModel.RoleServiceInternal`1.AddPrivileges(Guid roleId, RolePrivilege[] privileges, ExecutionContext context)
at Microsoft.Crm.Metadata.SecurityHelper.AddPrivilegesToUserRole(RolePrivilege[] privileges, Guid[] roleTemplates, ExecutionContext context)
at Microsoft.Crm.Metadata.SecurityHelper.CreateEntityHelper(IEntityDescription entityDescription, OwnershipTypes ownershipTypeMask, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.CreateInternal(EntityCreateInfo entityInfo, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo, ExecutionContext context)
[2008-03-12 15:35:39.6] Process: w3wp |Organization:c21461e1-7398-4eef-893a-1dc10cfd626a |Thread: 9 |Category: Application |User: 00000000-0000-0000-0000-000000000000 |Level: Error | ErrorInformation.LogError
>MSCRM Error Report:
--------------------------------------------------------------------------------------------------------
Error: roleId
Error Number: 0x80040203
Error Message: roleId
Error Details: roleId
Source File: Not available
Line Number: Not available
Request URL: http://crmserver:5555/COR/AppWebServices/SystemCustomization.asmx
Stack Trace Info: [ArgumentException: roleId]
[CrmArgumentException: roleId]
at Microsoft.Crm.Exceptions.ThrowIfGuidEmpty(Guid parameter, String name)
at Microsoft.Crm.ObjectModel.RoleServiceInternal`1.AddPrivileges(Guid roleId, RolePrivilege[] privileges, ExecutionContext context)
at Microsoft.Crm.Metadata.SecurityHelper.AddPrivilegesToUserRole(RolePrivilege[] privileges, Guid[] roleTemplates, ExecutionContext context)
at Microsoft.Crm.Metadata.SecurityHelper.CreateEntityHelper(IEntityDescription entityDescription, OwnershipTypes ownershipTypeMask, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.CreateInternal(EntityCreateInfo entityInfo, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo, ExecutionContext context)
at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo)
at Microsoft.Crm.Application.WebServices.SystemCustomization.EntityCreate.Execute(IUser user, ParameterBag paramBag)
at Microsoft.Crm.Application.WebServices.SystemCustomization.SystemCustomization.CreateEntity(XmlNode data)
Si prestamos atención al trace, (donde esta en azul), vamos a ver que el problema esta efectivamente en los roles de seguridad.
Este problema se da por que CRM al crear una nueva entidad, automáticamente le intenta dar permisos al rol de personalización (System Customizer) sobre la nueva entidad a crear. Si llegado el caso se nos ocurrió borrar ese rol de seguridad vamos a recibir el error arriba mencionado.
En Microsoft CRM 3.0 eso ya esta solucionado con el Rollup 3. (Paquete acumulativo de actualizaciones 3 para Microsoft Dynamics CRM 3.0 (KB 935364))
En Dynamics CRM 4.0 tenemos el mismo problema y hasta la fecha no hay un fix que lo solucione.
En la próxima entrada les voy a explicar como solucionar de forma manual este problema en la versión 4.0
Hasta la próxima!!