若是僅要對AD的組織單元,羣組和用戶進行查詢或者更改屬性,使用上述兩個類便可。下面給出的是查詢在AD中某個組織單元下的全部用戶部分代碼:html
DirectoryEntry objDE = new DirectoryEntry(strADRootPath, strADAccount, strADPassword); string strFilter = "(&(objectCategory=person)(objectClass=user))"; DirectorySearcher objSearcher = new DirectorySearcher(objDE, strFilter); //排序 objSearcher.Sort = new SortOption("name", SortDirection.Ascending); SearchResultCollection src = objSearcher.FindAll();
其中ADPath是要查詢組織單元的所在的LDAP,其格式爲:LDAP:\\ OU=XX部門,OU=XX公司,DC=域名,DC=COM,若是鏈接到的AD是在服務器上那麼格式寫成LDAP:\\XX.XX.XX.XX\ OU=XX部門,OU=XX公司,DC=域名,DC=COM(XX.XX.XX.XX爲服務器IP);ADAccount和ADPwd爲AD用戶的帳戶和密碼,若是是管理員則能夠進行任何操做,普通只能進行查詢操做。spring
執行上述代碼便可獲取到在某個指定組織單元的全部用戶,搜索結果存放在src中,要讀取用戶屬性值可以使用下面代碼:服務器
//獲取用戶的名稱和帳戶 foreach (SearchResult sr in src) { strUserName=sr.Properties["name"][0].ToString(); strUserName= sr.Properties["userPrincipalName"][0].ToString(); }
值得注意的是由於在建立AD用戶的時候填寫的用戶信息不一樣,每一個AD用戶所具備的屬性都不必定相同,建議使用以下方法進行取值:ui
if (sr.Properties.Contains("sn")) { strFirstName = sr.Properties["sn"][0].ToString();//姓 } if (sr.Properties.Contains("givenName")) { strLastName = sr.Properties["givenName"][0].ToString();//名 }
要知道一個用戶的全部屬性可以使用以下代碼:spa
foreach (string strPropNamein sr.Properties.PropertyNames) { Console.WriteLine(strPropName); }
還有一種讀取AD用戶屬性字段值的方法:.net
foreach (SearchResult sr in src) { DirectoryEntry myde = sr.GetDirectoryEntry(); strGuid = myde.Guid.ToString();//用戶Guid,建立用戶時由系統自動生成 strParentGuid = myde.Parent.Guid.ToString();//用戶所在組織單元的Guid myde.Properties["name"][0].ToString();//用戶名稱 }
一樣的,若是要獲得是AD組織單元或者羣組的話也是這麼作,對應於組織單元篩選字符串能夠這麼寫:code
//字符篩選器,篩選類型爲OU的對象 string strFilter = "(&(objectCategory=organizationalUnit)(objectClass=organizationalUnit))";
羣組的篩選字符串:htm
string strFilter = "(&(objectCategory=group)(objectClass=group))";
上面是對AD的查詢操做,若是查詢以後須要修改,僅須要作些許變更,下面是修改用戶屬性部分代碼:對象
foreach (SearchResult sr in src) { string strUserName = sr.Properties["name"][0].ToString(); //targetUserName:要修改用戶名稱 if (strUserName.Equals(targetUserName)) { DirectoryEntryde = sr.GetDirectoryEntry(); de.Properties["sn"].Value = m_User.FirstName;//姓 de.Properties["givenName"].Value = m_User.LastName;//名 de.Properties["mobile"].Value = m_User.Mobile;//移動電話 de.CommitChanges(); } }
修改AD組織單元或者羣組也是用相似的方法。值得注意的是,在AD中有些屬性是拒絕修改的,一旦修改了不容許修改的屬性,會被服務器拒絕或者出現服務器不肯意執行該操做異常。blog
若要向AD中添加用戶,組織單元或者羣組的話也是須要經過DirectoryEntry來添加,以下是向AD的指定路徑添加一個用戶:
public bool AddUser2AD(string strUserName, string strSAMAccountname, string strPassword, string strPath) { string strname = "CN=" + strUserName; try { // strADAccount ,strADPassword爲AD管理員帳戶和密碼 DirectoryEntry objDE = new DirectoryEntry(strPath, strADAccount, strADPassword); DirectoryEntries objDES = objDE.Children; DirectoryEntry myDE = objDES.Add(strname, "User"); myDE.Properties["userPrincipalName"].Value = strSAMAccountname; myDE.Properties["name"].Value = strUserName; myDE.Properties["sAMAccountName"].Value = strSAMAccountname; myDE.CommitChanges(); //設置密碼 IADsUser objUser = myDE.NativeObject as IADsUser; objUser.SetPassword(strPassword); //設置用戶狀態:密碼永不過時(65536)+用戶正常(512)= 66048 objUser.Put("userAccountControl", 66048); objUser.SetInfo(); } catch { return false; } return true; }
特別要注意最後幾行設置用戶密碼和帳戶狀態代碼。若是myDE.CommitChanges()後面的代碼沒有;,那麼在AD裏面建立的用戶是禁用狀態,而且密碼爲空。若是在AD中直接寫:
myDE.Password = strPassword; myDE.Properties["userAccountControl"].Value = 66048;
是會失敗的。這裏咱們能夠利用ActiveDs.dll。ActiveDs是一個AD服務相關應用程序COM接口,裏面提供了設置密碼,修改密碼,獲取屬性值的一些方法。按照如上寫法便可建立正常的AD用戶,切用戶密碼永不過時。
解釋一下userAccountControl,該屬性記錄了用戶的AD帳號信息,是一組16進制數,該屬性標誌是累積性的。若要禁用用戶的賬戶,將userAccountControl屬性設置爲 0x0202 (0x002 + 0x0200)。在十進制中,它是 514 (2 + 512);若要啓用帳戶且密碼永不過時,請將 userAccountControl屬性設置爲 0x10200 (0x10000 + 0x0200),十進制爲66048。
若想要修改用戶密碼的話也可使用ActiveDs提供的方法:
DirectoryEntry obj = sr.GetDirectoryEntry(); IADsUser objUser = obj.NativeObject as IADsUser; objUser.ChangePassword(strOldPassword, strNewPassword); objUser.SetInfo();
最後提供一個驗證AD用戶身份的方法以資參考:
/// <summary> ///驗證用戶登陸 ///</summary> ///<param name="strUserAccount">用戶帳戶</param> ///<param name="strPassword">用戶密碼</param> ///<returns>驗證經過則返回true,不然返回false</returns> public static bool VerifyUserLogin(string strUserAccount, stringstrPassword) { try { // strADRootPath爲該組織單元路徑 DirectoryEntry objDE = newDirectoryEntry(strADRootPath, strUserAccount, strPassword); DirectorySearcher objSerach = new DirectorySearcher(objDE); SearchResult sr = objSerach.FindOne(); return true; } catch { return false; } }
原文地址:http://blog.csdn.net/dl020840504/article/details/10200227
其餘文章推薦:http://www.cnblogs.com/springyangwc/archive/2012/02/07/2340987.html