2013-04-04 52 views
1

我有一个列表中的sharepoint字段可以是用户或组。使用服务器对象模型,我可以很容易地识别用户是否是一个组。如果用户是组使用客户端对象模型

但是,我找不到使用托管客户端对象模型实现此目的的一种方法。有没有办法知道。

我只是设法通过循环组的列表并检查是否存在具有名称的组。不管怎样,这不完全正确或有效。也许有一种方法可以找出使用用户的ListItem。但我没有看到任何显示用户是管理员的字段。我也尝试了EnsureUser。如果用户不是群组,则会崩溃。所以我可以使用try/catch来解决这个问题,但这会是一个非常糟糕的编程。

感谢,

约瑟夫

回答

1

要做到这一点从ClientContext.Current.Web.SiteUserInfoList获得用户的列表,然后检查是否返回来确定它是什么每个项目的ContentType

虽然检查内容类型并不是非常直接,因为您实际上从每个项目获取的所有内容都是ContentTypeID,您必须在ClientContext.Current.Web.SiteUserInfoList.ContentTypes上查找用户列表的内容类型。该查找将返回一个ContentType对象,并且您可以从该对象的Name属性中读取以查看该列表项目是什么。

所以代码过度简化程序块要做到这一点是:

using Microsoft.SharePoint.Client; 

...

ClientContext context = ClientContext.Current; 

var q = from i in context.Web.SiteUserInfoList.GetItems(new CamlQuery()) select i; 
IEnumerable<ListItem> Items = context.LoadQuery(q); 
context.ExecuteQueryAsync((s, e) => { 
    foreach (ListItem i in Items) { 
     //This is the important bit: 
     ContentType contenttype = context.Web.SiteUserInfoList.ContentTypes.GetById(i["ContentTypeId"].ToString()); 
     context.Load(contenttype); //It's another query so we have to load it too 
     switch (contenttype.Name) { 
      case "SharePointGroup": 
       //It's a SharePoint group 
       break; 
      case "Person": 
       //It's a user 
       break; 
      case "DomainGroup": 
       //It's an Active Directory Group or Membership Role 
       break; 
      default: 
       //It's a mystery; 
       break; 
     } 
    } 
}, 
    (s, e) => { /* Query failed */ } 
); 

你没有指定平台,但我做了这一切在Silverlight使用SharePoint客户端对象模型。理所当然,在JavaScript中也是如此。

+0

感谢您的详细解答。非常感激 – 2013-04-06 10:07:20

0

尝试Microsoft.SharePoint.Client.Utilities.Utility.SearchPrincipals(...)

var resultPrincipals = Utility.SearchPrincipals(clientContext, clientContext.Web, searchString, PrincipalType.All, PrincipalSource.All, null, maxResults); 

返回类型,PrincipalInfo,方便有PrincipalType属性,它可以检查组。

相关问题