C# AD(Active Directory)域資訊同步,組織單位、使用者等資訊查詢

來源:互聯網
上載者:User

接上篇 Windows Server 2008 R2 配置AD(Active Directory)網域控制站

對AD域結合常見需求用C#進行一些讀取資訊的操作^_^!

 

目錄

 

  • 樣本準備
  • 知識瞭解
  • 讀取AD域資訊樣本
  • DirectorySearcher.Filter屬性擴充說明
  • 使用者屬性擴充說明(含圖文屬性對照)
    • 常規
    • 地址
    • 帳戶
    • 電話
    • 組織
  • 樣本下載

 

樣本準備
  • 開啟上一篇文章配置好的AD網域控制站
  • 開始菜單-->管理工具-->Active Directory 使用者和電腦
  • 新群組織單位和使用者

   

  • 建立層次關係如下:

  

 

知識瞭解

  我們要用C#訪問Active Directory非常容易,主要用到

  輕量目錄訪問協議 (LDAP)

  System.DirectoryServices命名空間下的兩個組件類

  DirectoryEntry和DirectorySeacher

 

讀取AD域資訊樣本

   樣本在Framework 3.5下用Winform程式編寫

   主要結合常見需求讀取組織單位(OU)及使用者(User)資訊,以及同步群組織單位和使用者的層次關係;

     比較著重的還是使用者的資訊,特別是帳號、郵箱、SID等資訊;

  

  • 下面我們開始串連域,並讀取出樣本準備中鍵好的組織單位和使用者  

  首先編寫代碼用LDAP嘗試對域進行訪問

  形式:LDAP://Domain

  #region## 是否串連到域  /// <summary>  /// 功能:是否串連到域  /// 作者:Wilson  /// 時間:2012-12-15  /// http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.path(v=vs.90).aspx  /// </summary>  /// <param name="domainName">網域名稱或IP</param>  /// <param name="userName">使用者名稱</param>  /// <param name="userPwd">密碼</param>  /// <param name="entry">域</param>  /// <returns></returns>  private bool IsConnected(string domainName, string userName, string userPwd, out DirectoryEntry domain)  {      domain = new DirectoryEntry();      try      {          domain.Path = string.Format("LDAP://{0}", domainName);          domain.Username = userName;          domain.Password = userPwd;          domain.AuthenticationType = AuthenticationTypes.Secure;          domain.RefreshCache();          return true;      }      catch(Exception ex)      {          LogRecord.WriteLog("[IsConnected方法]錯誤資訊:" + ex.Message);          return false;      }  }  #endregion

   傳用參數,調IsConnected方法,結果如下

  

  • 串連上AD域後,接著我們找到根OU
  #region## 域中是否存在組織單位  /// <summary>  /// 功能:域中是否存在組織單位  /// 作者:Wilson  /// 時間:2012-12-15  /// </summary>  /// <param name="entry"></param>  /// <param name="ou"></param>  /// <returns></returns>  private bool IsExistOU(DirectoryEntry entry, out DirectoryEntry ou)  {       ou = new DirectoryEntry();       try       {           ou = entry.Children.Find("OU=" + txtRootOU.Text.Trim());           return (ou != null);       }       catch(Exception ex)       {           LogRecord.WriteLog("[IsExistOU方法]錯誤資訊:" + ex.Message);           return false;       }   }   #endregion

  傳入以數,調用IsExistOU方法,結果如下

  

  • 下面來開始讀取組織單位及使用者的資訊。

   樣本為了看出層次關係及匯出資訊是類型區分,給OU和User建立了一個實體類和一個類型的枚舉 

    #region## 類型    /// <summary>    /// 類型    /// </summary>    public enum TypeEnum : int    {        /// <summary>        /// 組織單位        /// </summary>        OU = 1,        /// <summary>        /// 使用者        /// </summary>        USER = 2    }    #endregion    #region## Ad域資訊實體    /// <summary>    /// Ad域資訊實體    /// </summary>    public class AdModel    {        public AdModel(string id, string name, int typeId, string parentId)        {            Id = id;            Name = name;            TypeId = typeId;            ParentId = parentId;        }        public string Id { get; set; }        public string Name { get; set; }        public int TypeId { get; set; }        public string ParentId { get; set; }    }    #endregion

   下面讀取資訊

        private List<AdModel> list = new List<AdModel>();

     #region## 同步 /// <summary> /// 功能:同步 /// 建立人:Wilson /// 建立時間:2012-12-15 /// </summary> /// <param name="entryOU"></param> public void SyncAll(DirectoryEntry entryOU) { DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查詢組織單位 DirectoryEntry root = mySearcher.SearchRoot; //尋找根OU SyncRootOU(root); StringBuilder sb = new StringBuilder(); sb.Append("\r\nID\t帳號\t類型\t父ID\r\n"); foreach (var item in list) { sb.AppendFormat("{0}\t{1}\t{2}\t{3}\r\n", item.Id, item.Name, item.TypeId, item.ParentId); } LogRecord.WriteLog(sb.ToString()); MessageBox.Show("同步成功", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); Application.Exit(); } #endregion #region## 同步根組織單位 /// <summary> /// 功能: 同步根組織單位 /// 建立人:Wilson /// 建立時間:2012-12-15 /// </summary> /// <param name="entry"></param> private void SyncRootOU(DirectoryEntry entry) { if (entry.Properties.Contains("ou") && entry.Properties.Contains("objectGUID")) { string rootOuName = entry.Properties["ou"][0].ToString(); byte[] bGUID = entry.Properties["objectGUID"][0] as byte[]; string id = BitConverter.ToString(bGUID); list.Add(new AdModel(id, rootOuName, (int)TypeEnum.OU, "0")); SyncSubOU(entry, id); } } #endregion #region## 同步下屬組織單位及下屬使用者 /// <summary> /// 功能: 同步下屬組織單位及下屬使用者 /// 建立人:Wilson /// 建立時間:2012-12-15 /// </summary> /// <param name="entry"></param> /// <param name="parentId"></param> private void SyncSubOU(DirectoryEntry entry, string parentId) { foreach (DirectoryEntry subEntry in entry.Children) { string entrySchemaClsName = subEntry.SchemaClassName; string[] arr = subEntry.Name.Split('='); string categoryStr = arr[0]; string nameStr = arr[1]; string id = string.Empty; if (subEntry.Properties.Contains("objectGUID")) //SID { byte[] bGUID = subEntry.Properties["objectGUID"][0] as byte[]; id = BitConverter.ToString(bGUID); } bool isExist = list.Exists(d => d.Id == id); switch (entrySchemaClsName) { case "organizationalUnit": if (!isExist) { list.Add(new AdModel(id, nameStr, (int)TypeEnum.OU, parentId)); } SyncSubOU(subEntry, id); break; case "user": string accountName = string.Empty; if (subEntry.Properties.Contains("samaccountName")) { accountName = subEntry.Properties["samaccountName"][0].ToString(); } if (!isExist) { list.Add(new AdModel(id, accountName, (int)TypeEnum.USER, parentId)); } break; } } } #endregion

  調用SyncAll方法迴圈輸出list,結果如下,很清楚的可以看出層次關係

        //ID                                                 帳號             類型    父ID        //58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17    acompany        1       0        //FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B    department01    1       58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17        //47-9D-5B-91-60-22-D1-46-B0-CD-C7-B2-C7-D3-00-31    department03    1       FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B        //E3-AD-47-45-38-64-02-4D-B9-83-2C-50-67-50-4F-92    zw              2       47-9D-5B-91-60-22-D1-46-B0-CD-C7-B2-C7-D3-00-31        //8A-D4-23-18-F3-6F-E1-47-93-7A-CC-07-76-4B-E7-86    zhongw          2       FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B        //BC-D0-34-85-67-2F-05-4D-B5-77-E3-F4-AD-51-45-02    department02    1       58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17        //1C-13-FA-66-E4-51-65-49-8B-DC-22-60-32-34-8F-22    wilson          2       BC-D0-34-85-67-2F-05-4D-B5-77-E3-F4-AD-51-45-02        //84-E8-E5-9A-6B-56-E2-45-9A-87-54-D1-78-6B-D3-56    porschev        2       58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17

 

DirectorySearcher.Filter屬性擴充說明

     DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查詢組織單位  

  第二個參數是一個filter,也可以根據需求輸入其它篩選條件,下面列出幾個常用的

篩選條件
使用者 (&(objectCategory=person)(objectClass=user))
電腦 (objectCategory=computer)
(objectCategory=group)
連絡人 (objectCategory=contact)
共用資料夾 (objectCategory=volume)
印表機 (objectCategory=printQueue)

    更多進階篩選請查看:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directorysearcher.filter(v=vs.80).aspx

 

 

使用者屬性擴充說明(含圖文屬性對照)

   樣本中只對使用者進行了讀取了幾個屬性,用過AD域的應該都知道,使用者的屬性較多也比較常用。

  下面通過AD域的使用者詳細信來對照一下相應的屬性名稱

  • 常項選項卡

  

對應編號 選項卡對應項名 屬性名稱
姓(L) sn                                     
名(F) givenName                              
顯示名稱(S) displayName                            
描述(D) description                            
辦公室(C) physicalDeliveryOfficeName             
英文縮寫(I) initials                               
電話號碼(T) telephoneNumber                        
電子郵件(M) mail                                   
網頁(W) wWWHomePage                            
電話號碼-其它(O)... otherTelephone                         
網頁-其它(R)... url                                    

  

  • 地址選項卡

  

對應編號 選項卡對應項名 屬性名稱
省/地區(O) co                                      
省/自治區(V) st                                      
市/縣(C) l
街道(S) streetAddress
郵政信箱(B) postOfficeBox
郵遞區號(Z) postalCode

  

  • 帳戶選項卡

  

對應編號 選項卡對應項名 屬性名稱
使用者登入名稱(U) userPrincipalName
使用者登入名稱(Windows 2000 以前版本)(W) sAMAccountName

  

  • 電話選項卡

  

對應編號 選項卡對應項名 屬性名稱
 家庭電話(M) homePhone                               
呼叫器(P) pager
行動電話(B) mobile
傳真(F) facsimileTelephoneNumber
IP電話(I) ipPhone
注釋 info
家庭電話-其它(O)  otherHomePhone                          
呼叫器-其它(T) otherPager                              
行動電話-其它(B) otherMobile                             
傳真-其它(E) otherFacsimileTelephoneNumber           
IP電話-其它(R) otherIpPhone                            

 

  • 組織選項卡

  

對應編號 選項卡對應項名 屬性名稱
公司(C)                               company                                  
部門(D)    department            
職務(J)                         title
經理-姓名(N)        manager                   
直屬員工(E) directReports

  

  還有一些屬性沒有列出來,可以迴圈輸出DirectoryEntry.Properties.PropertyNames來找

  比如用objectsid這也是個使用者比較重要的屬性,在設定Windows共用時會用到!

 

樣本下載

 樣本下載:http://files.cnblogs.com/zhongweiv/SynchronousAD.zip

 範例程式碼,寫得比較簡陋,有需要就下載了將就著看一下吧^_^!

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.