locked
Generate a report on permissions RRS feed

  • Question

  • Hi,

    can anyone help?

    I am using Dynamics CRM 2011 and have a number of the contacts and accounts shared. 

    I want to produce a report for admin staff which will output a list of all users which have access to contacts (either through sharing or because they own the contact) and don't have access to the associated account.

    I can see how to do this programmatically (I think it's through the RetrieveSharedPrincipalsAndAccessResponse class), but I can't work out what the equivalent database views are to allow me to put this information into a report.

    Any help would be appreciated.

    Thanks

     

     

    Friday, July 15, 2011 4:40 PM

Answers

  • It is CRM 4.0, but the report in the attached should get you started (underlying table structures won't have changed a great deal).

    http://sharingsummary.codeplex.com/releases/view/33106#DownloadId=83838

    I ran the underlying query directly against a CRM 2011 DB and it returned results, but only after adding a few "top 1" statements:

    SELECT   PrincipalObjectAccess.PrincipalObjectAccessId, PrincipalObjectAccess.ObjectId, PrincipalObjectAccess.ObjectTypeCode,
                 (SELECT  top 1 PhysicalName
                  FROM     MetadataSchema.Entity
                  WHERE   (ObjectTypeCode = PrincipalObjectAccess.ObjectTypeCode)) AS ObjectTypeCodeName, CASE 
         WHEN PrincipalObjectAccess.ObjectTypeCode =  1 THEN (SELECT name FROM FilteredAccount WHERE objectid = accountid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  2 THEN (SELECT fullname FROM FilteredContact WHERE objectid = contactid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  3 THEN (SELECT name FROM FilteredOpportunity WHERE objectid = opportunityid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  4 THEN (SELECT fullname FROM FilteredLead WHERE objectid = leadid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  5 THEN (SELECT subject FROM FilteredAnnotation WHERE PrincipalObjectAccess.objectid = annotationid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 112 THEN (SELECT title FROM FilteredIncident WHERE objectid = incidentid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1084 THEN (SELECT name FROM FilteredQuote WHERE objectid = quoteid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1088 THEN (SELECT name FROM FilteredSalesorder WHERE objectid = salesorderid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1090 THEN (SELECT name FROM FilteredInvoice WHERE objectid = invoiceid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1010 THEN (SELECT title FROM FilteredContract WHERE objectid = contractid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1011 THEN (SELECT title FROM FilteredContractdetail WHERE objectid = contractdetailid)
         WHEN PrincipalObjectAccess.ObjectTypeCode > 4200 OR PrincipalObjectAccess.ObjectTypeCode <= 4215 THEN (SELECT top 1 subject FROM FilteredActivityPointer WHERE objectid = activityid)
         ELSE 'N/A' END AS ObjectIdName, CASE 
         WHEN PrincipalObjectAccess.ObjectTypeCode =  1 THEN (SELECT owneridname FROM FilteredAccount WHERE objectid = accountid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  2 THEN (SELECT owneridname FROM FilteredContact WHERE objectid = contactid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  3 THEN (SELECT owneridname FROM FilteredOpportunity WHERE objectid = opportunityid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  4 THEN (SELECT owneridname FROM FilteredLead WHERE objectid = leadid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  5 THEN (SELECT owneridname FROM FilteredAnnotation WHERE PrincipalObjectAccess.objectid = annotationid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 112 THEN (SELECT owneridname FROM FilteredIncident WHERE objectid = incidentid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1084 THEN (SELECT owneridname FROM FilteredQuote WHERE objectid = quoteid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1088 THEN (SELECT owneridname FROM FilteredSalesorder WHERE objectid = salesorderid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1090 THEN (SELECT owneridname FROM FilteredInvoice WHERE objectid = invoiceid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1010 THEN (SELECT owneridname FROM FilteredContract WHERE objectid = contractid)
         WHEN PrincipalObjectAccess.ObjectTypeCode > 4200 OR PrincipalObjectAccess.ObjectTypeCode <= 4215 THEN (SELECT top 1 owneridname FROM FilteredActivityPointer WHERE objectid = activityid)
         ELSE 'N/A' END AS ObjectIdOwnerName, CASE 
         WHEN PrincipalObjectAccess.ObjectTypeCode =  1 THEN (SELECT ownerid FROM FilteredAccount WHERE objectid = accountid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  2 THEN (SELECT ownerid FROM FilteredContact WHERE objectid = contactid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  3 THEN (SELECT ownerid FROM FilteredOpportunity WHERE objectid = opportunityid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  4 THEN (SELECT ownerid FROM FilteredLead WHERE objectid = leadid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  5 THEN (SELECT ownerid FROM FilteredAnnotation WHERE PrincipalObjectAccess.objectid = annotationid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 112 THEN (SELECT ownerid FROM FilteredIncident WHERE objectid = incidentid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1084 THEN (SELECT ownerid FROM FilteredQuote WHERE objectid = quoteid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1088 THEN (SELECT ownerid FROM FilteredSalesorder WHERE objectid = salesorderid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1090 THEN (SELECT ownerid FROM FilteredInvoice WHERE objectid = invoiceid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1010 THEN (SELECT ownerid FROM FilteredContract WHERE objectid = contractid)
         WHEN PrincipalObjectAccess.ObjectTypeCode > 4200 OR PrincipalObjectAccess.ObjectTypeCode <= 4215 THEN (SELECT top 1 ownerid FROM FilteredActivityPointer WHERE objectid = activityid)
         ELSE 'N/A' END AS ObjectIdOwnerId, PrincipalObjectAccess.PrincipalTypeCode, 
               PrincipalObjectAccess.AccessRightsMask, PrincipalObjectAccess.ChangedOn, PrincipalObjectAccess.VersionNumber, 
               PrincipalObjectAccess.InheritedAccessRightsMask, FilteredSystemUser.FullName, FilteredSystemUser.DomainName, FilteredSystemUser.SystemUserId
    FROM     PrincipalObjectAccess INNER JOIN
               FilteredSystemUser ON PrincipalObjectAccess.PrincipalId = FilteredSystemUser.SystemUserId
    



    --pogo (pat) @ pogo69.wordpress.com
    • Marked as answer by Ash 1 Monday, July 18, 2011 8:44 AM
    Friday, July 15, 2011 7:46 PM

All replies

  • It is CRM 4.0, but the report in the attached should get you started (underlying table structures won't have changed a great deal).

    http://sharingsummary.codeplex.com/releases/view/33106#DownloadId=83838

    I ran the underlying query directly against a CRM 2011 DB and it returned results, but only after adding a few "top 1" statements:

    SELECT   PrincipalObjectAccess.PrincipalObjectAccessId, PrincipalObjectAccess.ObjectId, PrincipalObjectAccess.ObjectTypeCode,
                 (SELECT  top 1 PhysicalName
                  FROM     MetadataSchema.Entity
                  WHERE   (ObjectTypeCode = PrincipalObjectAccess.ObjectTypeCode)) AS ObjectTypeCodeName, CASE 
         WHEN PrincipalObjectAccess.ObjectTypeCode =  1 THEN (SELECT name FROM FilteredAccount WHERE objectid = accountid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  2 THEN (SELECT fullname FROM FilteredContact WHERE objectid = contactid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  3 THEN (SELECT name FROM FilteredOpportunity WHERE objectid = opportunityid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  4 THEN (SELECT fullname FROM FilteredLead WHERE objectid = leadid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  5 THEN (SELECT subject FROM FilteredAnnotation WHERE PrincipalObjectAccess.objectid = annotationid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 112 THEN (SELECT title FROM FilteredIncident WHERE objectid = incidentid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1084 THEN (SELECT name FROM FilteredQuote WHERE objectid = quoteid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1088 THEN (SELECT name FROM FilteredSalesorder WHERE objectid = salesorderid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1090 THEN (SELECT name FROM FilteredInvoice WHERE objectid = invoiceid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1010 THEN (SELECT title FROM FilteredContract WHERE objectid = contractid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1011 THEN (SELECT title FROM FilteredContractdetail WHERE objectid = contractdetailid)
         WHEN PrincipalObjectAccess.ObjectTypeCode > 4200 OR PrincipalObjectAccess.ObjectTypeCode <= 4215 THEN (SELECT top 1 subject FROM FilteredActivityPointer WHERE objectid = activityid)
         ELSE 'N/A' END AS ObjectIdName, CASE 
         WHEN PrincipalObjectAccess.ObjectTypeCode =  1 THEN (SELECT owneridname FROM FilteredAccount WHERE objectid = accountid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  2 THEN (SELECT owneridname FROM FilteredContact WHERE objectid = contactid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  3 THEN (SELECT owneridname FROM FilteredOpportunity WHERE objectid = opportunityid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  4 THEN (SELECT owneridname FROM FilteredLead WHERE objectid = leadid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  5 THEN (SELECT owneridname FROM FilteredAnnotation WHERE PrincipalObjectAccess.objectid = annotationid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 112 THEN (SELECT owneridname FROM FilteredIncident WHERE objectid = incidentid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1084 THEN (SELECT owneridname FROM FilteredQuote WHERE objectid = quoteid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1088 THEN (SELECT owneridname FROM FilteredSalesorder WHERE objectid = salesorderid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1090 THEN (SELECT owneridname FROM FilteredInvoice WHERE objectid = invoiceid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1010 THEN (SELECT owneridname FROM FilteredContract WHERE objectid = contractid)
         WHEN PrincipalObjectAccess.ObjectTypeCode > 4200 OR PrincipalObjectAccess.ObjectTypeCode <= 4215 THEN (SELECT top 1 owneridname FROM FilteredActivityPointer WHERE objectid = activityid)
         ELSE 'N/A' END AS ObjectIdOwnerName, CASE 
         WHEN PrincipalObjectAccess.ObjectTypeCode =  1 THEN (SELECT ownerid FROM FilteredAccount WHERE objectid = accountid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  2 THEN (SELECT ownerid FROM FilteredContact WHERE objectid = contactid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  3 THEN (SELECT ownerid FROM FilteredOpportunity WHERE objectid = opportunityid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  4 THEN (SELECT ownerid FROM FilteredLead WHERE objectid = leadid)
         WHEN PrincipalObjectAccess.ObjectTypeCode =  5 THEN (SELECT ownerid FROM FilteredAnnotation WHERE PrincipalObjectAccess.objectid = annotationid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 112 THEN (SELECT ownerid FROM FilteredIncident WHERE objectid = incidentid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1084 THEN (SELECT ownerid FROM FilteredQuote WHERE objectid = quoteid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1088 THEN (SELECT ownerid FROM FilteredSalesorder WHERE objectid = salesorderid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1090 THEN (SELECT ownerid FROM FilteredInvoice WHERE objectid = invoiceid)
         WHEN PrincipalObjectAccess.ObjectTypeCode = 1010 THEN (SELECT ownerid FROM FilteredContract WHERE objectid = contractid)
         WHEN PrincipalObjectAccess.ObjectTypeCode > 4200 OR PrincipalObjectAccess.ObjectTypeCode <= 4215 THEN (SELECT top 1 ownerid FROM FilteredActivityPointer WHERE objectid = activityid)
         ELSE 'N/A' END AS ObjectIdOwnerId, PrincipalObjectAccess.PrincipalTypeCode, 
               PrincipalObjectAccess.AccessRightsMask, PrincipalObjectAccess.ChangedOn, PrincipalObjectAccess.VersionNumber, 
               PrincipalObjectAccess.InheritedAccessRightsMask, FilteredSystemUser.FullName, FilteredSystemUser.DomainName, FilteredSystemUser.SystemUserId
    FROM     PrincipalObjectAccess INNER JOIN
               FilteredSystemUser ON PrincipalObjectAccess.PrincipalId = FilteredSystemUser.SystemUserId
    



    --pogo (pat) @ pogo69.wordpress.com
    • Marked as answer by Ash 1 Monday, July 18, 2011 8:44 AM
    Friday, July 15, 2011 7:46 PM
  • Thanks, that's exactly what I needed.
    Monday, July 18, 2011 8:44 AM