LDAP查询:查询到动态数据表

本文关键字:查询 数据表 动态 LDAP | 更新日期: 2023-09-27 18:19:06

我正在编写一个c#方法来查询Active Directory并将结果作为数据表返回。该方法需要接受一个LDAP目标和一个LDAP查询。

例子:

DataTable users = LDAPQuery("LDAP://mydomain.com", "(&(objectCategory=person)(objectClass=user))")
DataTable desktops = LDAPQuery("LDAP://mydomain.com", "(&(objectCategory=computer)(name=desktop*))")

我的尝试如下。我想我已经掌握了大部分,但是我想根据查询返回的属性动态地构建DataTable,而不是像下面这样硬编码列。有人能告诉我怎么做吗?或者是否有更好的方法,例如使用ADODB ?

    protected DataTable LDAPQuery(string domain, string query)
    {
        DirectoryEntry entry = new DirectoryEntry(domain);
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.Filter = query;
        ds.SearchScope = SearchScope.Subtree;
        SearchResultCollection src = ds.FindAll();
        DataTable dt = new DataTable();
        dt.Columns.Add("samaccountname");
        dt.Columns.Add("givenName");
        dt.Columns.Add("sn");
        dt.Columns.Add("mail");
        foreach (SearchResult sr in src)
        {
            DataRow dr = dt.NewRow();
            DirectoryEntry de = sr.GetDirectoryEntry();
            dr["samaccountname"] = de.Properties["samaccountname"].Value.ToString();
            dr["givenName"] = de.Properties["givenName"].Value.ToString();
            dr["sn"] = de.Properties["sn"].Value.ToString();
            dr["mail"] = de.Properties["mail"].Value.ToString();
            dt.Rows.Add(dr);
            de.Close();
        }
        return dt;
    }

谢谢

LDAP查询:查询到动态数据表

这可能不是一个好主意,因为您的数据库模式应该与数据表非常匹配。但是如果您坚持,DirectoryEntry.Properties.PropertyNames拥有您可以循环遍历的所有名称。http://msdn.microsoft.com/en-us/library/system.directoryservices.propertycollection.propertynames.aspx