1

我在列表中有一个共享点字段,可以是用户或组。使用服务器对象模型,我可以轻松识别用户是否是一个组。

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

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

谢谢,

约瑟夫

4

2 回答 2

2

为此,请从中获取用户列表,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 中也是可能的。

于 2013-04-05T18:26:00.453 回答
0

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

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

返回类型PrincipalInfo具有方便的 PrincipalType 属性,您可以检查该属性是否为 Group。

于 2014-11-28T15:48:53.013 回答