PrincipalSearcher.FindAll возвращает разные результаты при использовании пользовательского UserPrincipal - PullRequest
1 голос
/ 12 октября 2011

Учитывая код ниже

using (var context = new PrincipalContext(ContextType.Domain, SOME_DOMAIN))
using (UserPrincipal userPrincipal =  new UserPrincipal(context) { Enabled = true })
using (PrincipalSearchResult<Principal> results = new PrincipalSearcher(userPrincipal).FindAll())
{
    Console.WriteLine(results.Count());
}

using (var context = new PrincipalContext(ContextType.Domain, SOME_DOMAIN))
using (CustomUserPrinciple userPrincipal =  new CustomUserPrinciple(context) { Enabled = true })
using (PrincipalSearchResult<Principal> results = new PrincipalSearcher(userPrincipal).FindAll())
{
    Console.WriteLine(results.Count());
}

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

Я ожидал, что число будет одинаковым, однако похоже, что поиск с использованием пользовательского принципала не возвращает только пользователей, как при первом поиске. Результаты включают другие типы объектов активного каталога, такие как компьютеры.

Это сделано специально, и если да, то есть ли способ ограничить пользовательский основной поиск так, чтобы он возвращал только пользователей?

1 Ответ

3 голосов
/ 12 октября 2011

Результаты включают в себя другие типы объектов активного каталога, например компьютеры, просто потому, что если вы посмотрите на свои объекты с помощью инструмента, подобного ADSIEDIT.MSC (инструменты поддержки W2K3), вы увидите, что объектный класс компьютера также является пользователем.Это объясняется тем фактом, что в схеме Active-Directory класс computer является дочерним по отношению к классу user.Существует атрибут objectCategory, который позволяет изменить ситуацию.

Вы можете изменить свой класс следующим образом:

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

    [DirectoryProperty("objectCategory")]
    public string objectCategory
    {
      get
      {
        object[] result = this.ExtensionGet("objectCategory");
        if (result != null)
        {
          return (string)result[0];
        }
        else
        {
          return string.Empty;
        }
      }
      set { this.ExtensionSet("objectCategory", value); }
    }
}

И управлять своим запросом так:

using (UserPrincipal userPrincipal =  new UserPrincipal(context) { objectCategory="Person",Enabled = true })
using (PrincipalSearchResult<Principal> results = new PrincipalSearcher(userPrincipal).FindAll())
{
    Console.WriteLine(results.Count());
}
...