C#操作Active Directory(AD)詳解


.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后打開本工具。選擇一個用戶,右鍵單擊該用戶選擇屬性顯示如下圖所示的屬性頁。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM