2012-12-07 14 views
8

Bir mülkün ayarlanmadığı bir AD LDS (ADAM) örneğinde kullanıcılar için arama yapmaya çalışıyorum; örneğin, "şirket" özelliğinin ADAM deposunda bir değere ayarlanmadığı durumlarda (veya bu konuda AD).Bir mülkün bir PrincipalSearcher kullanılarak ayarlanmadığı bir UserPrincipal nasıl bulunur?

using System; 
using System.DirectoryServices.AccountManagement; 
using System.Security.Permissions; 
using System.Linq; 

namespace AdamDump 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PrincipalContext context = new PrincipalContext(ContextType.ApplicationDirectory, "MyAdamInstance:50000", "OU=Adam Users,dc=apps01,dc=mydomain", "queryaccount", "password");   

      // initialize a Query By Example 
      using (MyUserPrincipal myUserPrincipal = new MyUserPrincipal(context)) 
      { 
       myUserPrincipal.MyAdvancedFilters.WhereCompanyNotSet(); 

       PrincipalSearchResult<Principal> principals = null; 

       // do the search... 
       using (PrincipalSearcher principalSearcher = new PrincipalSearcher(myUserPrincipal)) 
       { 
        principals = principalSearcher.FindAll(); 
       } 

       var myUsers = principals.Select(principal => principal as MyUserPrincipal).ToList(); 

       foreach (var user in myUsers) 
        Console.WriteLine("Name: {0}, Account{1}", user.DisplayName, user.SamAccountName); 

       Console.WriteLine("Total found: {0}", myUsers.Count); 
      }     
     } 
    } 


    [DirectoryObjectClass("user")] 
    [DirectoryRdnPrefix("CN")] 
    [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)] 
    public class MyUserPrincipal : UserPrincipal 
    { 
     private MyAdvancedFilters _myAdvancedFilters; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="MyUserPrincipal"/> class. 
     /// </summary> 
     /// <param name="context">A <see cref="PrincipalContext"/> to associate this instance with.</param> 
     [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)] 
     public MyUserPrincipal(PrincipalContext context) 
      : base(context) { } 

     public MyAdvancedFilters MyAdvancedFilters 
     { 
      get 
      { 
       return this.AdvancedSearchFilter as MyAdvancedFilters; 
      } 
     } 

     public override AdvancedFilters AdvancedSearchFilter 
     { 
      get 
      { 
       if (_myAdvancedFilters == null) 
       { 
        _myAdvancedFilters = new MyAdvancedFilters(this);      
       } 

       return _myAdvancedFilters; 
      } 
     } 
    } 

    public class MyAdvancedFilters : AdvancedFilters 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="MyAdvancedFilters"/> class. 
     /// </summary> 
     /// <param name="principal">The source <see cref="Principal"/></param> 
     public MyAdvancedFilters(Principal principal) : base(principal) { } 

     public void WhereCompanyNotSet() 
     { 
      this.AdvancedFilterSet("company", "", typeof(string), MatchType.NotEquals); 
     } 
    } 
} 

cevap

8

AdvanceFilters sınıfımın aşağıdaki şekilde değiştirilmesi ihtiyacım olan sonuçları alır.

public class MyAdvancedFilters : AdvancedFilters 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="MyAdvancedFilters"/> class. 
    /// </summary> 
    /// <param name="principal">The source <see cref="Principal"/></param> 
    public MyAdvancedFilters(Principal principal) : base(principal) { } 

    public void WhereCompanyNotSet() 
    { 
     this.AdvancedFilterSet("company", "*", typeof(string), MatchType.NotEquals); 
    } 
} 

O "*" AdvancedFilterSet değer kısmı içinolduğunu.

AccountManagement nesneleri için uygun yanıtı bulmak için doğru yola yönlendiren Sean'a teşekkürler.

3

sorgu olarak bu kullanmayı deneyin: İşte

An unhandled exception of type 'System.ArgumentException' occurred in System.DirectoryServices.dll 

Additional information: The (&(objectClass=user)(!(company=))) search filter is invalid. 

benim örnek kod edilir: Özel bir AdvancedSearchFilters nesne ile PrincipalSearcher ve özel bir UserPrincipal kullandığınızda

, hatası alıyorum :

(&(objectClass=user)(!(company=*))) 

Docs: http://msdn.microsoft.com/en-gb/library/windows/desktop/aa746475(v=vs.85).aspx sayfanın yaklaşık yarısına kadar "Bu bir email özniteliği olmadan tüm girişleri alın:"

+0

DirectorySearcher'ı kullanarak bir yaklaşım için haklı olduğunuzu düşünüyorum, ancak bunu AccountManagement nesneleri aracılığıyla yapmam gerektiğinden, bu doğrudan uygulanamaz. Yine de beni doğru yolda bıraktığınız için – Jim

+0

+1. – Jim

+0

Bunu AccountManagement nesneleriyle deneyin PrincipalSearcher ps = new PrincipalSearcher (kullanıcı); ((DirectorySearcher) ps.GetUnderlyingSearcher()) Filter = "(& (objectClass = kullanıcı) (! (Şirket = *)))"; / – hidden

İlgili konular