注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

微软MVP罗勇的博客

微软MVP罗勇,www.luoyong.me

 
 
 

日志

 
 

根据用户对实体权限隐藏实体,并将其从高级查找中隐藏  

2015-09-01 12:07:26|  分类: CRM探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复151或者20150901可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!
项目中有时候会碰到有些实体数据用户能读取,但是一般最好不要显示给用户看,最常见的是一些设置数据。比如我开发了一个自动编号的解决方案,这个 自动编号设置 实体及其 自动编号设置明细 实体需要授予用户如下权限,但是我不想让普通用户看到这两个实体,管理员当然要可以看到并设置。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
自动编号设置实体我设置其显示在设置区域,而自动编号明显实体则没有设置显示在任何区域。系统默认的是如果用户对实体有读取权限则可以在导航区域看到该实体,比如我通过 销售人员一 就可以看到这个实体,虽然不能新增,删除,但是能看到所有的现有数据。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
我不想让普通用户在导航面板中看到这个实体,这个是有受支持的开发方法可以做到的。为了简便,我使用工具来做,也是SDK提到的工具XrmToolBox,这里我上该工具的官方网站 http://www.xrmtoolbox.com/ 下载最新版本,https://github.com/MscrmTools/XrmToolBox/releases 这里我下载的是写作本博文时候的最新版 XrmToolBox v 1.2015.7.31 。
解压下载的压缩包,双击 XrmToolBox.exe ,点击 Connect to CRM > New connection ,输入连接信息,点击OK按钮就连接到CRM了。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
Home里面显示了很多工具,我这里使用其中的 SiteMap Editor工具,点击该工具的工具栏的Load SiteMap按钮,一会儿就会加载出来CRM的站点地图了。找到我要设置的 SubArea,右击,选择 Add Privilege 。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
我设置如下,意思是要对new_autonumber实体有删除权限才能在导航面板中看到这个实体。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
最后还需要点击 Update Sitemap 按钮来更新站点地图。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
最后我们去看看效果,销售人员一用户真的看不到这个实体了,当然系统管理员还是可以看到的。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
虽然用户通过导航面板看不到这两个实体了,但是还是可以通过高级查找来找到这两个实体,如下图:
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
能否也隐藏呢?因为创建实体的界面没有类似不在高级查找显示的属性供设置,所以没有办法在界面上设置。查看实体的元数据可以知道有个属性叫 IsValidForAdvancedFind 属性,该属性默认为true,是不是设置为False就不会显示呢?
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
我们知道通过代码是可以更新元数据的,MSDN上面有示例: Sample: Create and update entity metadata  我在想,那么我更新这个属性不就行了?于是我使用了如下的代码进行更新实体的元数据并发布:

var retrieveEntityRequest = new RetrieveEntityRequest()
            {
                EntityFilters = EntityFilters.Entity,
                LogicalName = "new_autonumber"
            };
            RetrieveEntityResponse retrieveEntityResponse = (RetrieveEntityResponse)orgService.Execute(retrieveEntityRequest);
            EntityMetadata autoNumbertMetaData = retrieveEntityResponse.EntityMetadata;
            autoNumbertMetaData.IsValidForAdvancedFind = true;
            UpdateEntityRequest updateBankAccountRequest = new UpdateEntityRequest
            {
                Entity = autoNumbertMetaData
            };
            orgService.Execute(updateBankAccountRequest);
            var publishRequest = new PublishXmlRequest();
            publishRequest.ParameterXml = "<importexportxml><entities><entity>new_autonumber</entity></entities></importexportxml>";
            orgService.Execute(publishRequest);

但是编译不通过,提示信息如下:无法对属性或索引器“Microsoft.Xrm.Sdk.Metadata.EntityMetadata.IsValidForAdvancedFind”赋值 -- 它是只读的 。MSDN上面的说法如下,这个 Get or Sets 有点误导人,其实是只能获取不能设置,Syntax部分就是只有个get,没有set。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
我也查了下SDK中的 Customize entity metadata 章节的Editable entity properties部分,列出来的可以编辑的实体属性并不包括我们要设置的,看来这种方法目前是走不通了。
Google一下,很容易找到方法,这篇博文 Hide Entity from Advanced Find in MS CRM 2011 就提供了方法。在CRM组织对应的数据库中执行如下SQL语句:

update MetadataSchema.Entity set IsValidForAdvancedFind = 0 where Name in ('new_autonumber','new_autonumberdetail');

 
然后在重启IIS。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
 
就会发现高级查找中找不到这两个实体了。
但是要警示各位,这是不受支持的开发方法,谨慎采用!
待到有受支持的开发方法,我会更新本博文的。
发现这个方法带来的一个问题就是在批量删除中选择不到这些在高级查找中隐藏的实体了,而且在表单界面插入子网格的时候也选择不到这些实体了。
素格格新疆特产店--做最好新疆特产的搬运工。 本店由博主的新疆老婆开设,搬运各种最好的新疆特产,是自用,送礼,年货,孝敬长辈特别是(岳)父母的首选!素格格新疆特产店淘宝网址是 http://sugege.taobao.com 欢迎自助购买。
根据用户对实体权限隐藏实体显示,并将其从高级查询查找中隐藏 - 罗勇 - 微软MVP-罗勇的博客
  评论这张
 
阅读(400)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017