公司是屬於集團公司採取多網域架構,近兩年不約而同的接連都導入 Exchange 的方案,同集團的通訊錄確是採取人工維護,常常發生各公司通訊錄不同步,不是新進同仁尚未出現在清單上,就是人已經離職了但是還掛著,非常浪費時間維護但又看不到效率。
在網路上搜尋到許多資料都顯示Active Directory 是可以透過呼叫微軟的 Object 來做查詢變更等動作,經過初期的實驗寫了幾個小功能確認可以正常的讀出或寫入動作,確認由程式來變更是可行的便開始進行規劃。
首 先當然是要請每個 domain 帳號的規格都要設定成一樣,否則各家有各家的規則光轉檔就寫掛,不然東缺西少欄位會花很多時間在補資料上;Active Directory 上面有許多不同的欄位,有些欄位有長度的限制,規劃前最好找個最長的資料來 Key Key 看,否則會遇到像我們匯入到其中一家公司才發現欄位不足,只好再補一隻小程式來搬移欄位。
等到欄位敲定了後,有些規則也是要事先定義好:
1. 所有的 email 帳號跟 Active Directory 綁定 (Exchange 的限制吧)
2. 非本公司同仁一律都建立聯絡人屬性帳號,並丟到 [集團通訊錄] 這個 OU 內
3. 由於先前人工維護 OU 建立的架構與對方建立的結構不同,所以同步時將不會跟著調整,而是採取新的同仁一律放置在[新進同仁]這個OU,離職人員搬移到[離職員工]OU上
4. 因有特殊狀況才有需要保留帳號的情況,只要發現對方 AD 帳號中標記成工號的欄位為空白,則該帳號略過不同步
比對的邏輯
1. 先讀取對方公司的所有 User 的帳號,然後比對本身 [集團通訊錄] 底下所有的聯絡人 (Contacts),比對方式可以採取 (A)工號, (B)email位置, (C)中文姓名這幾種方式,其中 (C) 有同名同姓或兩邊命名不同的危險。
2. 兩邊都存在的帳號則強制更新我方聯絡人資料,如果不存在則在 [新進同仁] 新增一筆聯絡人資料
3. 以 [集團通訊錄] 底下的聯絡人反查對方 AD 的使用者,如果不存在代表可能離職,就把該筆聯絡人移動到 [離職員工] OU 下
帳號新增完畢後需要人工移動到正確的OU架構下,並到 Exchange 介面去設定這個聯絡人的 email 帳號;當然這邊也可以再去開發利用指令的方式來執行,不過我們這邊都需要人為介入,就一起用人工處理掉了。
雖然也學過 C++,但仍然習慣使用的程式語言是 Visual Basic,最後選擇 VB 2010 Express 來做開發的平台;由於這些程式語言跟環境有極大的差別,所以就不方便把整個程式碼貼上來。
以下是其中一段的範例
Imports System.DirectoryServices
< 對方公司人員離職 >
撈取 AD 上指定OU(sFromLDAP參數)底下所有的聯絡人
Dim ADEntry As New DirectoryServices.DirectoryEntry(“LDAP://” + sFromLDAP)
Dim ADSearch As New System.DirectoryServices.DirectorySearcher(ADEntry)
指定只撈取聯絡人
ADSearch.Filter = “(objectCategory=contact)”
ADSearch.SearchScope = SearchScope.Subtree
每撈一筆出來
For Each ADSearchResult In ADSearch.FindAll()
讀出其重要屬性
sMail = ADSearchResult.GetDirectoryEntry().Properties.Item(“mail”).Value
sCn = ADSearchResult.GetDirectoryEntry().Properties.Item(“cn”).Value
檢查對方 AD 所建立的 AD 物件
Dim ADTeEntry As New DirectoryServices.DirectoryEntry(“LDAP://” + sCompareLDAP)
Dim ADTESearch As New System.DirectoryServices.DirectorySearcher(ADTeEntry)
利用email來查詢對方的帳號是否存在, 其中 UsserAccountControl 這一段是多過濾掉已經停用但還沒有刪除的帳號
ADTESearch.Filter = “(&(objectCategory=user)(mail=” + sMail + “)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))”
ADTESearchResult = ADTESearch.FindOne
If ADTESearchResult Is Nothing Then
移動該人員至 [離職人員]
End if
Next
感想:
- 這個軟體花的很多在 Study 及 Try & Error, 因為對 DirectoryServer 實在不熟,很多想法被限制住做法
- 因為每家公司都有不同的環境,實在很難寫一個萬用程式,只能慢慢去兜所需要的資訊
- 有任何想法歡迎留言討論喔