PrincipalSearcher.FindAll在使用自定义UserPrincipal时返回不同的结果

时间:2011-10-12 01:29:24

标签: active-directory directoryservices account-management

鉴于以下代码

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 个答案:

答案 0 :(得分:3)

结果包括其他活动目录对象类型,如计算机,只是因为如果使用ADSIEDIT.MSC(W2K3支持工具)等工具查看对象,您将看到计算机的objectClass也是用户。这可以解释为,在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());
}