2012-11-20 46 views
0

是否有任何方法可以搜索不匹配使用PrincipalSearcher的所有記錄。使用DirectorySearcher,您可以應用像(!sn="\*Jay\*")這樣的過濾器。換句話說,所有記錄的姓氏不包含序列「傑伊」在任何地方。我想知道是否有任何與UserPrincipal參數做到這一點。PrincipalSearcher篩選不匹配的所有記錄

回答

0

不幸的是,這不是一個選項。我花了相當多的時間試圖找到一種輕鬆/有效地進行更高級搜索的方法。最近你可以得到一個高級搜索是與一些日期選項,但沒有文字搜索。

我最終做的是使用LDAP查詢單獨運行DirectorySearcher。我從搜索中返回的唯一屬性(最小化結果集大小並提高速度)是DN和對象類型(如果對象類型尚未過濾)。然後,我使用DN創建適當類型的新Principal對象並將其添加到集合中。

整個AccountManagement庫設計時考慮了一小部分任務(很明顯),而且很難擴展。我已經放棄使用DirectoryServices來完成大部分任務,因爲它是應該使用的真正的庫。

0

我似乎總是回答舊的問題,但這一直在尋找,我相信我已經明白了這一點。如果它幫助找到它的人,這是我設法拼湊在一起的東西。

您想要做的是創建自定義AdvancedFilter併爲您的需要創建一些自定義搜索規則。默認的是相當有限的,但你可以創建任何你需要的東西。

你的問題的一個例子可以這樣

public class MyAdvancedFilter : AdvancedFilters 
{ 
    public MyAdvancedFilter(Principal principal) : base(principal) 
    { 

    } 

    public void WhereLastName(string lastName, MatchType match) 
    { 
     // The * is the normal wildcard for LDAP. 
     // Remove *'s for an exact match, or create a parameter to choose what to do. 
     this.AdvancedFilterSet("sn", "*" + lastName + "*", typeof(string), match); 
    } 
} 

辦理爲了使用這個,你還必須有一個自定義UserPrincipal對象實現這一點。

[DirectoryObjectClass("user")] 
[DirectoryRdnPrefix("CN")] 
public class MyUser : UserPrincipal 
{ 
    public MyUser(PrincipalContext context) : base(context) 
    { 

    } 

    private MyAdvancedFilter searchFilter; 
    // use custom search filters 
    public new MyAdvancedFilter AdvancedSearchFilter 
    { 
     get 
     { 
      if (searchFilter == null) 
       searchFilter = new MyAdvancedFilter(this); 

      return searchFilter; 
     } 
    } 
} 

現在您已準備好使用此代碼。

MyUser u = new MyUser(); 
// find users without the last name containing "Jay" 
u.AdvancedSearchFilter.WhereLastName("Jay", MatchType.NotEquals); 

PrincipalSearcher ps = new PrincipalSearcher(u); 
var res = ps.FindAll().Cast<MyUser>(); 

foreach (MyUser p in res) 
{ 
    // use the results here. 
} 

希望它可以幫助別人。

相關問題