8

AD ドメインのすべての人を、鮮やかなASPTokenInputに基づいてオートコンプリート PeopleEditor のようなコントロールに入力する必要があります。PeopleEditor を反映すると、Active Directory 検索エンジンが本当に混乱しており、役立つ可能性のあるすべてのクラスが内部にあることがわかります。

私のテスト方法は正常に機能しますが、AD からすべてのユーザー (sharepoint サイトのものではない) を取得して、リストに入力する必要があります。 どのように見えるか

public string GetUsers(string filter)
    {
        var spWeb = SPContext.Current.Web;
        SPUserCollection allusers = spWeb.AllUsers;
        List<SPUser> users = allusers.Cast<SPUser>().ToList();
        var query = from spUser in users.Select(usr => new {id = usr.ID, name = usr.Name})
                        .Where(p => p.name.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) >= 0)
                    select new {id = spUser.id.ToString(), spUser.name};

        return new JavaScriptSerializer().Serialize(query);
    }

このように Active Directory を照会するにはどうすればよいですか? 共有ポイント自体からすべての AD 接続設定を取得することは可能ですか? ドロップダウン リストを埋めるには、ID とユーザー名だけが必要です。これを SPUserCollection に変換することは、もう 1 つの大きな問題です。

次のような組み込みの SP メソッドを使用すると便利です。

 [SubsetCallableExcludeMember(SubsetCallableExcludeMemberType.UnsupportedSPType)]
public static IList<SPPrincipalInfo> SearchWindowsPrincipals(SPWebApplication webApp, string input, SPPrincipalType scopes, int maxCount, out bool reachMaxCount)
4

2 に答える 2

1

解決策は簡単でした。必要なのは、SharePoint グループ検索の実装だけでした (フィールド エディター コントロールで指定されている場合)。SPには素敵な組み込みメソッドがあるので、それを使っています。

/// <summary>
/// Provides searching for AD or SharePoint group if specified in field setting
/// </summary>
public static class ActiveDirectorySearchProvider
{
    public static IList<SPPrincipalInfo> Search(string filter, string selectionGroup, string principalType)
    {
        var site = SPContext.Current.Site.WebApplication;
        bool reachmaxcount;
        var scope = SPUtils.GetSpPrincipalType(principalType);

        if (!String.IsNullOrEmpty(selectionGroup)) //search for users in SPGroup if present
        {
            var rawSPGroupList = SPUtility.GetPrincipalsInGroup(SPContext.Current.Web, selectionGroup, 100,
                                                           out reachmaxcount).ToList();

            string lowerFilter = filter.ToLowerInvariant();

            var filteredGroupList =
                rawSPGroupList.Where(
                    pInfo =>
                    pInfo.LoginName.Substring(pInfo.LoginName.IndexOf('\\') + 1).StartsWith(lowerFilter) ||
                    pInfo.DisplayName.ToLowerInvariant().StartsWith(lowerFilter) ||
                    pInfo.DisplayName.ToLowerInvariant().Substring(pInfo.DisplayName.IndexOf(' ') + 1).StartsWith(
                        lowerFilter)).ToList();

            return filteredGroupList;
        }

       return SPUtility.SearchWindowsPrincipals(site, filter, scope, 100, out reachmaxcount); //Search in AD instead

    }
于 2011-11-01T05:16:55.197 に答える
0

ここで 2 つのオプションを考えることができます。

  1. System.DirectoryServicesを使用して、C# コードで Active Directory からすべてのユーザーにクエリを実行できます。

  2. SharePoint ユーザー DB が最新になるようにUser Profile Syncをセットアップできます。

于 2011-10-25T19:21:01.113 に答える