1

を返したいのでSamAccountName、オブジェクトを使用して特定の値をActive Directory で検索しています。その検索に 2 つのフィルターを適用する方法を考えていました。1 つはアカウント名の先頭が xx で始まり、もう 1 つはアカウント名が _c で終わっていないことです。 PrincipalSearcherUserPrincipal

現在、xx で始まるすべての結果を使用して検索できxx*ますが、別の検索語を追加する方法や、等しくない検索語を適用する方法さえわかりません。これは私が現在取り組んでいるものです。

protected override void RunTests()
{
    using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "NAME", "OU=OUName",OU=name,DC=name,DC=net"))
    {
        UserPrincipal searchTemplate = new UserPrincipal(context);
        searchTemplate.Enabled = true;
        searchTemplate.SamAccountName = "xx*";

        PrincipalSearcher search = new PrincipalSearcher(searchTemplate);

        var principals = search.FindAll();
        int total = principals.Count();            

        int numInvalidUsers = RunChecks(principals, new Check[]{ 
            Check1    
            , Check2
            , Check3
        });

        Score = numInvalidUsers == 0 ? 1 : 0;
    }
}

私が考えているのは、に別のパラメーターを追加する必要があるということsearchTemplate.SamAccountNameです。方法がわかりません。

更新: Redditで役に立つ提案をしてくれた 人と話していましたが、このユーザーは闇に落ちました。最も一般的な提案は、何らかの方法で LDAP フィルターを実装することです。そのため、プリンシパル オブジェクトを返しながらそれらを実装する方法を誰かが知っていれば、非常に役立ちます。

4

1 に答える 1

1

だから私はついにこの投稿からRedditユーザーの助けを借りてこの質問に答えました

プログラムを理想的にセットアップした方法のため、キャストまたは変換が利用可能でしたが、プリンシパル オブジェクトを返す必要がありました。プリンシパル オブジェクトを追加のフィルター処理で返すための解決策は、LINQ ステートメントを使用して、返された結果をさらにフィルター処理することでした。

search.FindAll();LINQ ステートメントを組み込むには、次のように実行する 1 行を変更するだけで済みました。

var principals = search.FindAll().Where(p => !p.SamAccountName.EndsWith("_c", StringComparison.OrdinalIgnoreCase)).ToList();

最初のフィルタリングはすべての xx* を検出するために行われるため、このステートメントで _c で終わるアカウントを削除するだけで済みましたが、LINQ には多くのフィルタリング オプションが用意されています。

Redditのユーザーは、返された結果をフィルタリングする必要がある場合、LINQが遅くなる可能性があるため、他の提案もいくつか提供してくれましたが、私はより迅速で簡単な答えを求めました. これらの提案を見たい場合は、Reddit の投稿へのリンクをたどってください。

于 2016-10-13T17:41:09.883 に答える