.Net提供了專用類操作AD,本文詳細介紹使用C#操作AD的方法。
一、系統環境
系統環境:Windows Server 2008 R2, VS2010, .Net Framework 4.0
AD Server:LDAP的server IP
基本DN:OU=user,DC=Company,DC=com
用來登錄的管理員:Peter
密碼:ab#CD%1234
二、程序
1. 引用
.Net操作AD的類在命名空間System.DirectoryServices下,需要將該類引用進來。
2. 連接
要操作AD需首先連接AD,就象要操作數據先要連接數據庫一樣。
/// <summary> /// 獲得DirectoryEntry對象實例,以管理員登陸AD /// </summary> /// <returns></returns> private static DirectoryEntry GetDirectoryObject() { DirectoryEntry entry = null; try { entry = new DirectoryEntry("LDAP://10.10.10.16", "Peter", " ab#CD%1234", AuthenticationTypes.Secure); } catch (Exception ex) { } return entry; }
3. 查詢
根據各種條件獲取具體的用戶。下例為根據公共名稱獲取對象。
/// <summary> /// 根據用戶公共名稱取得用戶的 對象 /// </summary> /// <param name="commonName">用戶公共名稱</param> /// <returns>如果找到該用戶則返回用戶的對象,否則返回 null</returns> public static DirectoryEntry GetDirectoryEntry(string commonName) { DirectoryEntry de = GetDirectoryObject(); DirectorySearcher deSearch = new DirectorySearcher(de); deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName.Replace("\\", "") + "))"; deSearch.SearchScope = SearchScope.Subtree; try { SearchResult result = deSearch.FindOne(); de = new DirectoryEntry(result.Path); return de; } catch (Exception ex) { return null; } }
4. 修改用戶
修改查詢到的Entity的值,修改后將修改記錄保存到AD。注意有兩種保存屬性的方式。具體使用哪種請參考幫助。
1) 直接修改屬性
2) 通過invoke來觸發AD的內置函數
/// <summary> /// 修改查詢到的用戶 /// </summary> /// <param name="CommonName">通用名(displayName,系統中顯示的中文字)</param> /// <param name="Account">帳戶名(如Peter)</param> /// <param name="organizeName">組織單元名(資訊中心)</param> /// <param name="password">密碼</param> public static string ChangeADAccount(string CommonName, string Account, string password) { //獲取對應AD實體 DirectoryEntry user = GetDirectoryEntry( commonName); try { ADHelper.SetProperty(user, " sAMAccountName ", Account); user.Invoke("SetPassword", new object[] { password }); user.CommitChanges(); } catch (Exception e) { throw e; } return user.Path; } /// <summary> /// 設置指定的屬性值 /// </summary> /// <param name="de"></param> /// <param name="propertyName">屬性名稱?</param> /// <param name="propertyValue">屬性值</param> public static void SetProperty(DirectoryEntry de, string propertyName, string propertyValue) { if (de.Properties.Contains(propertyName)) { if (String.IsNullOrEmpty(propertyValue)) { de.Properties[propertyName].RemoveAt(0); } else { de.Properties[propertyName][0] = propertyValue; } } else { if (!String.IsNullOrEmpty(propertyValue)) { de.Properties[propertyName].Add(propertyValue); } } }
5. 修改OU
1) 獲取OU
DirectoryEntry OUEntry = new DirectoryEntry(GetOrganizeNamePath(OUName), "Peter", " ab#CD%1234", AuthenticationTypes.Secure); /// <summary> /// 獲得OU的Path /// </summary> /// <param name="organizeUnit">OU名</param> /// <returns></returns> public static string GetOrganizeNamePath(string organizeUnit) { StringBuilder sb = new StringBuilder(); sb.Append(ADPath); sb.Append("/"); return sb.Append(SplitOrganizeNameToDN(organizeUnit)).ToString(); }
2) 修改OU項
OUEntry.Rename("OU=" + newOUName); OUEntry.CommitChanges();
3) 刪除OU
DirectoryEntry OUParent = OUEntry.Parent;
OUParent.Children.Remove(OUEntry);
OUParent.CommitChanges();
6. 修改組
1) 獲取組
/// <summary> /// 獲取AD組 /// </summary> /// <param name="groupName"></param> /// <param name="organizeUnit"></param> /// <returns></returns> public static DirectoryEntry GetADGroupInOU(string groupName, string organizeUnit) { if (!String.IsNullOrEmpty(groupName)) { DirectoryEntry de = new DirectoryEntry(GetOrganizeNamePath(organizeUnit) , "Peter", " ab#CD%1234", AuthenticationTypes.Secure); ; DirectorySearcher deSearch = new DirectorySearcher(de); deSearch.Filter = "(&(objectClass=group)(cn=" + groupName.Replace("\\", "") + "))"; deSearch.SearchScope = SearchScope.Subtree; try { SearchResult result = deSearch.FindOne(); if (result != null) { de = new DirectoryEntry(result.Path, adminName, adminPassword); } else { return null; } return de; } catch (Exception ex) { return null; } } else { return null; } }
2) 管理組成員
group.Properties["member"].Add(user.Properties["distinguishedName"].Value); group.Properties["member"].Remove(user.Properties["distinguishedName"].Value);
三、查看AD User屬性結果
在程序中修改了User屬性后我們要檢驗一下是否被修改了,有三種方式查看AD中User屬性:
1. Active Directory Users and Computers
打開Active Directory Users and Computers,選擇一個用戶,右鍵單擊該用戶選擇屬性顯示如下圖所示的屬性頁。在該屬性頁只能看到一些常用的屬性。
2. Exchange Management Console
打開Exchange Management Console,選擇一個用戶,右鍵單擊該用戶選擇屬性顯示如下圖所示的屬性頁。單擊Customer Attributes按鈕可以查看自定義的屬性。
3. adsiedit.msc
以上兩種方式所看到的屬性都不全,要看到所有屬性需使用adsiedit.msc工具。
在運行窗口中輸入adsiedit.msc后打開本工具。選擇一個用戶,右鍵單擊該用戶選擇屬性顯示如下圖所示的屬性頁。