2013-06-20 10 views
0

我在寫一個c#方法來查詢Active Directory並將結果作爲DataTable返回。該方法需要採用LDAP目標和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

爲什麼在地球上使用'DataTable'?看起來很「過時」。難道你不能只是定義一個'MyAdType'類來容納你感興趣的屬性,並且返回一個'List '而不是一個笨拙的舊'DataTable',它有許多你不需要的關係開銷? –

+0

另外:如果您使用.NET 3.5或更高版本,請查看[System.DirectoryServices.AccountManagement](http://msdn.microsoft.com/zh-cn/library/system.directoryservices.accountmanagement.aspx) - 閱讀[這個優秀的MSDN文章首先!](http://msdn.microsoft.com/en-us/magazine/cc135979.aspx) –

+0

我想加載結果到數據庫,所以DataTable適合我。 – user2042552

回答