无法从LDAP用户获取某些字段

时间:2014-09-03 00:56:58

标签: c# active-directory ldap directorysearcher

我无法从PasswordNeverExpires等用户对象获取某些字段。现在我在超过2000个用户返回的每个属性中循环,我的条件断点永​​远不会中断一次,所以我知道它没有返回。如果我无条件地断开,此代码返回的属性数总是1。 我们的服务器是Windows 2003 Server。我可以从NetEnum命令获得我想要的所有信息。 我已经看到其他人声称他们可以做到这一点而且我不知道我的代码有什么不同。当我没有提供任何加载属性时,它会抓取大约30-37个属性。我需要和使用的几个属性。

    public void FetchUsers(string domainId, Sql sql)
    {
        var entry = new DirectoryEntry("LDAP://" + DomainControllerAddress, DomainPrefixedUsername, Password,
            AuthenticationType);

        var dSearch = new DirectorySearcher(entry)
        {
            Filter = "(&(objectClass=user)(!(objectclass=computer)))",
            SearchScope = SearchScope.Subtree,
            PageSize = 1000,

        };

        dSearch.PropertiesToLoad.Add("passwordneverexpires");

        var users = dSearch.FindAll();

        foreach (SearchResult ldapUser in users)
        {
            SaveUser(ldapUser, sql, domainId);
        }
    }

    private void SaveUser(SearchResult ldapUser, Sql sql, string domainId)
    {
        if (ldapUser.Properties.PropertyNames == null) return;

        foreach (string propertyName in ldapUser.Properties.PropertyNames)
        {
//I'm breaking here on the condition that propertyName != 'adspath' and it never breaks
            var v = ldapUser.Properties[propertyName];
        }

        return;
}

2 个答案:

答案 0 :(得分:0)

少数事情:

  1. 您拥有的基础过滤器效率非常低。请改用(&(objectCategory=person)(objectClass=user))
  2. 没有名为passwordneverexpires的属性。您需要检查用户userAccountControl掩码中的第13位 - 请参阅http://msdn.microsoft.com/en-us/library/aa772300%28v=vs.85%29.aspx以获取值列表。
  3. 你永远不会闯入你的循环,因为你告诉客户只要求一个属性。

答案 1 :(得分:0)

您可以使用以下过滤条件:(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536)) to get All users with the account configuration DONT_EXPIRE_PASSWORD

-Jim