0

我正在访问 Active Directory。如果我这样称呼它

DirectorySearcher srch = new DirectorySearcher(de);

//Filter to return only users and deleted users and not system accounts
srch.Filter = "(|(&(objectCategory=person)(objectClass=user)(sn=*))(&(isDeleted=TRUE)(objectClass=user)))";
srch.SearchScope = SearchScope.OneLevel;
srch.ExtendedDN = ExtendedDN.Standard;
srch.FindAll();

然后它返回具有某些属性的用户列表...我想查看“whenChanged”属性但是当我尝试添加该行时

srch.PropertiesLoad.Add("whenChanged");

然后它不会返回任何用户。这可能是由于已删除的用户没有该属性,并且它不能统一应用所有属性,因此它返回 0 结果?如何查看所有用户,包括已删除和活动用户,并查看所有用户的“whenChanged”属性,即使它导致null

4

1 回答 1

1

几点:

  • 要获取已删除的对象,您需要设置srch.Tombstone = true;
  • 删除的对象存储在“CN=Deleted Objects,DC=domain,DC=com”下。
    因此,要搜索所有用户以及已删除的对象,最好使用域根作为搜索根并使用 SearchScope.Subtree 作为范围
  • 添加到的任何属性DirectorySearcher.PropertiesLoad都不应删除任何结果。
    这可能是由于其他原因srch.PropertiesLoad.Add("whenChanged");
  • 为什么要sn=*进行搜索?这会过滤掉未设置姓氏的用户。
    这是故意的吗?

测试以下代码,可以成功获取用户和删除用户,并获取“whenChanged”属性。请试一试。

DirectoryEntry de = new DirectoryEntry("LDAP://domain.com/dc=domain,dc=com", "user", "pwd");
DirectorySearcher srch = new DirectorySearcher(de);

//Filter to return only users and deleted users and not system accounts
srch.Filter = "(|(&(objectCategory=person)(objectClass=user)(sn=*))(&(isDeleted=TRUE)(objectClass=user)))";
srch.SearchScope = SearchScope.Subtree;
srch.ExtendedDN = ExtendedDN.Standard;
srch.Tombstone = true;
srch.PropertiesToLoad.Add("whenChanged");
srch.PropertiesToLoad.Add("distinguishedName");
using (SearchResultCollection results = srch.FindAll())
{
    foreach (SearchResult result in results)
    {
        string dn = result.Properties["distinguishedName"][0] as string;
        Console.WriteLine("- {0}", dn);

        ResultPropertyValueCollection prop = result.Properties["whenChanged"];
        if (prop != null)
        {
            Console.WriteLine("  {0}", (DateTime)prop[0]);
        }
    }
}
于 2014-12-25T15:31:31.220 回答