我正在编写一个c#方法来查询Active Directory并将结果作为DataTable返回。该方法需要采用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;
}
由于
答案 0 :(得分:0)
这可能不是一个好主意,因为您的数据库架构应该相当匹配数据表。但是如果你坚持,DirectoryEntry.Properties.PropertyNames拥有你可以遍历的所有名称。 http://msdn.microsoft.com/en-us/library/system.directoryservices.propertycollection.propertynames.aspx