1

鉴于下面的代码

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)
    {
    }
}

我预计计数是相同的,但是看起来使用自定义主体的搜索不会像第一次搜索那样只返回用户。结果包括其他活动目录对象类型,例如计算机。

这是设计使然,如果是这样,有没有办法可以限制自定义主体搜索只返回用户?

4

1 回答 1

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());
}
于 2011-10-12T02:23:35.357 回答