设为首页 收藏本站
查看: 1763|回复: 0

[经验分享] 在SharePoint中无代码开发InfoPath应用: 获取当前用户信息

[复制链接]

尚未签到

发表于 2015-9-26 06:11:24 | 显示全部楼层 |阅读模式
  很多种不同的场景下,会需要得到当前的用户信息,例如需要根据当前用户判断组,进而控制权限。
  首先InfoPath提供了一个userName方法,来实现这个目的,不过这个方法的问题是只能获得不包含域名的用户名,例如,一个contoso\danj的用户,这个方法返回的是danj。
  对于只有一个域的场景,可以使用concat方法来拼凑出完整的用户名,例如:concat("contoso\", userName())。
DSC0000.png
  如果上面的方法不足以解决你的问题,那就要求助于SharePoint Web Service了。
  例如下面两篇文章都是说的这个问题。
  Thttp://jaliyaudagedara.blogspot.com/2011/05/getting-current-users-sharepoint-group.html
  http://info.akgroup.com/blog-0/bid/69277/InfoPath-Restrict-visibility-to-users-in-a-SharePoint-Group
  无一例外的,都是使用了UserProfileService.asmx Web Service中的GetUserProfileByName方法。
  这个方法很简单,也很好用,一般情况下这个方法就足够了。
  这个方法也有一个缺点就是挑环境,如果你google "GetUserProfileByName infopath error",你会发现有各种各样的错误讨论。基本上都是和Server配置环境相关的。
  例如,我朋友的这篇文章曾经也讨论过类似问题:http://www.cnblogs.com/fanwenxuan/archive/2011/03/14/1984159.html
  
  如果你不幸的无法使用上面方法,可以尝试使用UserGroup.asmx中的GetCurrentUserInfo方法。使用这个方法有些复杂,下面会做介绍:

  • InfoPath添加一个数据连接,选择Receive data.
DSC0001.png

  • 数据源选择来自于SOAP Web Service
DSC0002.png

  • 输入SOAP Web Service路径,http://yoursite/_vti_bin/usergroup.asmx
DSC0003.png

  • 在解析出来的方法列表中找到GetCurrentUserInfo方法。
DSC0004.png

  • 根据需要选择是否允许离线使用数据,一般情况下,不要选中。
DSC0005.png

  • 给这个数据链接命名,根据情况选择是否一旦表单打开就自动获取数据,由于这个方法一般是其他的使用的基础,一般都选中。
DSC0006.png

  • 这样,就添加好了GetCurrentUserInfo数据连接。
DSC0007.png

  • 添加好的数据连接在高级视图中如下所示,这个时候其实根本无法使用,因为默认InfoPath没有对这个数据进行解析。
DSC0008.png

  • 下面来手动增加这个数据解析。先将InfoPath模板导出为源文件。
DSC0009.png

  • 导出的文中,关于这个连接的大概会有如下类型的文件。
DSC00010.png

  • 打开GetCurrentUserInfo1.xsd文件(也可能是其他文件,也可以寻找文件包含<s:elementname="GetCurrentUserInfoResponse">的)。
  • 在文件的开始位置。紧接着<s:importnamespace="http://www.w3.org/2001/XMLSchema"></s:import>的后面。
  <s:schemaelementFormDefault="qualified"targetNamespace="http://schemas.microsoft.com/sharepoint/soap/directory/"xmlns:s="http://www.w3.org/2001/XMLSchema"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/directory/"xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"xmlns:http="http://schemas.xmlsoap.org/wsdl/http/">
      <s:importnamespace="http://www.w3.org/2001/XMLSchema"></s:import>
  <s:elementname="GetUserCollectionFromSite">
          <s:complexType></s:complexType>
      </s:element>

  • 插入如下的一段定义,如下所示。
  <s:schemaelementFormDefault="qualified"targetNamespace="http://schemas.microsoft.com/sharepoint/soap/directory/"xmlns:s="http://www.w3.org/2001/XMLSchema"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"xmlns:tns="http://schemas.microsoft.com/sharepoint/soap/directory/"xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"xmlns:http="http://schemas.xmlsoap.org/wsdl/http/">
  <s:importnamespace="http://www.w3.org/2001/XMLSchema"></s:import>
    <s:complexTypename="User">
      <s:attributename="Notes"type="s:string"></s:attribute>
      <s:attributename="Name"type="s:string"></s:attribute>
      <s:attributename="IsSiteAdmin"type="s:string"></s:attribute>
      <s:attributename="Sid"type="s:string"></s:attribute>
      <s:attributename="Flags"type="s:string"></s:attribute>
      <s:attributename="ID"type="s:string"></s:attribute>
      <s:attributename="LoginName"type="s:string"></s:attribute>
      <s:attributename="Email"type="s:string"></s:attribute>
      <s:attributename="IsDomainGroup"type="s:string"></s:attribute>
    </s:complexType>
    <s:elementname="GetUserCollectionFromSite">
          <s:complexType></s:complexType>
      </s:element>

  • 在这个文件中查找<s:elementname="GetUserInfo">,并插入一段定义,如下高亮所示。
      <s:elementname="GetUserInfo">
          <s:complexType>
              <s:sequence>
                  <s:elementminOccurs="0"maxOccurs="1"name="userLoginName"type="s:string"></s:element>
                    <s:elementname="User"type="tns:User" />
              </s:sequence>
          </s:complexType>
      </s:element>

  • 保存文件。在同样的文件夹下,右键单击manifest文件,选择Design打开。
DSC00011.png

  • 重新在高级视图中看这个数据源,你可以发现User对象已经可以解析出来了。
DSC00012.png


  • 添加控件,就可以看到结果了。 DSC00013.png
  最后,来说说这个方法的缺点。
  由于我们对数据连接做了修改,所以修改好后,不能再对这个数据连接再次修改了,要不一切都会丢失,你需要从头再来。
  
  后记:
  不知道有没有人感兴趣那一段定义是从哪里来的,为什么要添加到GetUserInfo里面。下面简单介绍下。
  那一段定义来自于GetCurrentUserInfoX.xsd的最后一个文件(X根据这个数据连接修改的次数会有不同,一般为2,5,8….)。
  还有一个出处是微软SharePoint协议文档:[MS-UGS]: UserGroup Web Service Protocol.
  
  在协议文档中,GetCurrentUserInfoResponse有一个GetCurrentUserInfo的说明,看起来应该是返回这个字段才对,为什么跑去修改GetUserInfo?
  在协议文档中,有一段附录的WSDL说明:
    <s:elementname="GetCurrentUserInfoResponse">
      <s:complexType>
        <s:sequence>
          <s:elementname="GetCurrentUserInfoResult">
            <s:complexType>
              <s:sequence>
  <s:elementname="GetUserInfo">
                  <s:complexType>
                    <s:sequence>
                      <s:elementname="User"type="tns:User" />
                    </s:sequence>
                  </s:complexType>
                </s:element>
              </s:sequence>
            </s:complexType>
          </s:element>
        </s:sequence>
      </s:complexType>
    </s:element>
  或者利用第一篇文章提到的工具,也可以看到类似的结果。
  至于微软为什么这么设计,我就不知道了。
DSC00014.png
  所以应该找GetUserInfo去修改。不过为什么不能直接把GetCurrentUserInfo1.xsd文件的<s:any></s:any>替换掉?我也不知道,替换掉会报错的。
      <s:elementname="GetCurrentUserInfoResponse">
          <s:complexType>
              <s:sequence>
                  <s:elementminOccurs="0"maxOccurs="1"name="GetCurrentUserInfoResult">
                      <s:complexType>
                          <s:sequence>
                                    <s:any></s:any>
                                  </s:sequence>
                      </s:complexType>
                  </s:element>
              </s:sequence>
          </s:complexType>
      </s:element>
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118819-1-1.html 上篇帖子: 初步尝试Teamplate Workflow Web Part for SharePoint Portal Server 下篇帖子: Moss/Sharepoint 2010 Form认证(FBA)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表