locked
How do I find privileges assigned to a user for a given Entity? (client side) RRS feed

  • Question

  • I'm writing some custom UI for adding new contacts/new contact relationships.  In order to control whether that section shows in the form, I'd like to query the system to see if the current user has "Create" or "Edit" privileges on the CONTACT entity (or, really - any entity).  How do we do this programmatically?  I've been searching for a while, but can't find anything related to this.  Do I use the Xrm object, or do I need to call a web service?

    Thanks,

    Bill



    Wednesday, May 14, 2014 2:46 PM

All replies

  • Wednesday, May 14, 2014 2:55 PM
  • Hi Bill,

    Use the following piece of code to fetch all permissions of the current user (client side) :

    if (typeof (SDK) == "undefined")
       { SDK = { __namespace: true }; }
           //This will establish a more unique namespace for functions in this library. This will reduce the 
           // potential for functions to be overwritten due to a duplicate name when the library is loaded.
           SDK.SOAP = {
               _getServerUrl: function () {
                   ///<summary>
                   /// Returns the URL for the SOAP endpoint using the context information available in the form
                   /// or HTML Web resource.
                   ///</summary>
                   var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
                   var serverUrl = "";
                   if (typeof GetGlobalContext == "function") {
                       var context = GetGlobalContext();
                       serverUrl = context.getServerUrl();
                   }
                   else {
                       if (typeof Xrm.Page.context == "object") {
                             serverUrl = Xrm.Page.context.getServerUrl();
                       }
                       else
                       { throw new Error("Unable to access the server URL"); }
                       }
                      if (serverUrl.match(/\/$/)) {
                           serverUrl = serverUrl.substring(0, serverUrl.length - 1);
                       } 
                       return serverUrl + OrgServicePath;
                   }, 
               RetrieveUserPrivilegesRequest: function (userId, successCallback, errorCallback) {
    		   //debugger;
                   var requestMain = ""
                   requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
                   requestMain += "  <s:Body>";
                   requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
                   requestMain += "      <request i:type=\"b:RetrieveUserPrivilegesRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
                   requestMain += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
                   requestMain += "          <a:KeyValuePairOfstringanyType>";
                   requestMain += "            <c:key>UserId</c:key>";
                   requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + userId + "</c:value>";
                   requestMain += "          </a:KeyValuePairOfstringanyType>";
                   requestMain += "        </a:Parameters>";
                   requestMain += "        <a:RequestId i:nil=\"true\" />";
                   requestMain += "        <a:RequestName>RetrieveUserPrivileges</a:RequestName>";
                   requestMain += "      </request>";
                   requestMain += "    </Execute>";
                   requestMain += "  </s:Body>";
                   requestMain += "</s:Envelope>";
                   var req = new XMLHttpRequest();
                   req.open("POST", SDK.SOAP._getServerUrl(), true)
                   // Responses will return XML. It isn't possible to return JSON.
                   req.setRequestHeader("Accept", "application/xml, text/xml, */*");
                   req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
                   req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
                   //var successCallback = null;
                   //var errorCallback = null;
                   req.onreadystatechange = function () { SDK.SOAP.RetrieveUserPrivilegesResponse(req, successCallback, errorCallback); };
                   req.send(requestMain);
               },
           RetrieveUserPrivilegesResponse: function (req, successCallback, errorCallback) {
                   ///<summary>
                   /// Recieves the assign response
                   ///</summary>
                   ///<param name="req" Type="XMLHttpRequest">
                   /// The XMLHttpRequest response
                   ///</param>
                   ///<param name="successCallback" Type="Function">
                   /// The function to perform when an successfult response is returned.
                   /// For this message no data is returned so a success callback is not really necessary.
                   ///</param>
                   ///<param name="errorCallback" Type="Function">
                   /// The function to perform when an error is returned.
                   /// This function accepts a JScript error returned by the _getError function
                   ///</param>
                   if (req.readyState == 4) {
                   if (req.status == 200) {
    			   //debugger;
                   if (successCallback != null)
                   { successCallback(req.responseText); }
                   }
                   else {
                       errorCallback(SDK.SOAP._getError(req.responseXML));
                   }
               }
           },
           _getError: function (faultXml) {
               ///<summary>
               /// Parses the WCF fault returned in the event of an error.
               ///</summary>
               ///<param name="faultXml" Type="XML">
               /// The responseXML property of the XMLHttpRequest response.
               ///</param>
               var errorMessage = "Unknown Error (Unable to parse the fault)";
               if (typeof faultXml == "object") {
                   try {
                       var bodyNode = faultXml.firstChild.firstChild;
                       //Retrieve the fault node
                       for (var i = 0; i < bodyNode.childNodes.length; i++) {
                           var node = bodyNode.childNodes[i];
                           //NOTE: This comparison does not handle the case where the XML namespace changes
                           if ("s:Fault" == node.nodeName) {
                           for (var j = 0; j < node.childNodes.length; j++) {
                               var faultStringNode = node.childNodes[j];
                               if ("faultstring" == faultStringNode.nodeName) {
                                   errorMessage = faultStringNode.text;
                                   break;
                               }
                           }
                           break;
                       }
                   }
               }
               catch (e) { };
            }
            return new Error(errorMessage);
         },
     __namespace: true
    };

    Call the function using the following code:

    function extractValuesFromXml(resultXml, attributeName)
    {
    	var valueArray = new Array();
    	
    	xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    	xmlDoc.async = "false";
    	xmlDoc.loadXML(resultXml);
    	x = xmlDoc.getElementsByTagName(attributeName);
    	
    	for (i = 0; i < x.length; i++)
    	{
    		if (x[i].childNodes[0] != null && x[i].childNodes[0] != 'undefined' && x[i].childNodes[0].text != null && x[i].childNodes[0].text != 'undefined')
    		{
    			valueArray[i] = x[i].childNodes[0].text.toUpperCase();;
    		}
    	}
    
    	return valueArray;	
    }
    
    
    SDK.SOAP.RetrieveUserPrivilegesRequest(
    		userId,
    		function (results) 
    		{
    			if (results != null && results != 'undefined') 
    			{
    				userPrivileges = extractValuesFromXml(results, "b:PrivilegeId");
    				
    				if (userPrivileges != null && userPrivileges.length > 0)
    				{
    					//Check here if userPrivileges have the necessary permission by matching with the permission Guid
    				}
    			}
    		},
    		errorHandler
    	);

    In this link you'll get the Guids for the Privileges you want to check: http://msdn.microsoft.com/en-us/library/gg309366.aspx


    Admin QuikView Solution for CRM 2013


    Wednesday, May 14, 2014 5:22 PM