2013-04-16 29 views
5

Tôi đang làm việc trên plugin MS CRM và có thể xác định liệu người dùng hiện tại có quyền ghi vào thực thể hiện tại hay không. Tôi không biết cách tiếp cận nhiệm vụ này.Cách nhận đặc quyền người dùng hiện tại trong MS Dynamics CRM ở phía máy chủ

Dường như cách thân thiện với người dùng nhất thực hiện tác vụ này hiện là unsupported.

Có thay thế nào trong MS CRM 2011 SDK hay không, ngoại trừ soạn một truy vấn FetchXML và phân tích cú pháp đầu ra của nó?

Trả lời

9

Dưới đây là những gì tôi đã đưa ra - mã này sẽ kiểm tra, không dùng hiện hành đã cho đặc quyền trong lịch sử hiện tại:

// Requesting user's access rights to current record 
var principalAccessRequest = new RetrievePrincipalAccessRequest 
{ 
    Principal = new EntityReference("systemuser", localContext.PluginExecutionContext.UserId), 
    Target = new EntityReference(localContext.PluginExecutionContext.PrimaryEntityName, localContext.PluginExecutionContext.PrimaryEntityId) 
}; 

// Response will contain AccessRights mask, like AccessRights.WriteAccess | AccessRights.ReadAccess | ... 
var principalAccessResponse = (RetrievePrincipalAccessResponse)localContext.OrganizationService.Execute(principalAccessRequest); 

if ((principalAccessResponse.AccessRights & AccessRights.WriteAccess) != AccessRights.None) 
{ 
    ... 
    ... 
    ... 
} 

Các mã bên if tuyên bố sẽ được thực hiện nếu người dùng có WriteAccess đến kỷ lục hiện tại .

-1

Kiểm tra this.

Các ý chính của nó là:

//Check if user is connected for on-prem or hosted 

Guid userGuid; 
if(Request.LogonUserIdentity.IsAuthenticated == true) 
{ 
    WhoAmIRequest userRequest = new Microsoft.Crm.SdkTypeProxy.WhoAmIRequest(); 
    WhoAmIResponse user = (Microsoft.Crm.SdkTypeProxy.WhoAmIResponse)objCrmService.Execute (userRequest); 
    userGuid = user.UserId; 
} 
else //ifd 
{ 
    userGuid = new Guid(Context.User.Identity.Name); 
} 
+3

Điều này trả về thông tin người dùng cơ bản, không phải đặc quyền của họ – Daryl

+0

Điểm tốt @Daryl – Bvrce

1

Theo trả lời của Matt:

  1. Lấy trên đặc ân thực thể
  2. Tham gia vào tổ chức roleprivilege nơi privilege.privilegeid = roleprivilege.privilegeid
  3. Tham gia trên systemuserrole thực thể nơi systemuserrole.roleid = roleprivileges.roleid và systemuserrole.systemuserid = (GUID của người sử dụng trong câu hỏi)
  4. Sau đó một trong hai lặp qua các đặc quyền hoặc tìm kiếm đặc quyền nơi privilege.name = "prvReadMyEntityName"

Bạn vừa phải thực hiện việc tham gia và thêm mệnh đề where bạn quan tâm. Đây là SQL tương đương:

SELECT Privilege.* 
FROM Privilege 
INNER JOIN RolePrivilege ON Privilege.PrivilegeId = RolePrivilege.PrivilegeId 
INNER JOIN SystemUserRole ON SystemUserRole.RoleId = RolePrivileges.RoleId AND SystemUserRole.SystemUserId = (user's GUID) 
-- WHERE Add whatever constraints on the Privilege entity that you need 

Bạn có thể thực hiện việc này bằng cách tìm nạp XML hoặc LINQ to CRM hoặc biểu thức truy vấn hoặc thậm chí OData.

+0

Tôi đã tìm thấy cách thanh lịch hơn: http://stackoverflow.com/a/16042098/1047741 – shytikov

Các vấn đề liên quan