[Exchange]在兩個不同的網域下交換 Exchange 信箱帳戶成為對方網域中的聯絡人

[Develop]在兩個不同的網域下交換 Exchange 信箱帳戶成為對方網域中的聯絡人

浩呆以前待在一家製造業公司的時候,在同一棟大樓裡的公司有一天切割成兩間公司。兩間公司的網域名稱完全不一樣(非父子網域架構),但是實體上辦公室內的位置並沒有更動。

所以本來坐在一起的同事可能就變成兩家不同公司的同事。但是以前在同一家公司的時候,當A要寄信給B,直接打開Outlook然後用通訊錄或是在收件者欄打上收件者姓名就可以找到收件者。

但是當被切割成兩個不同Domain時,本來坐在一起的兩個人實際上就變成隸屬於不同網域的人了。寄信無法像以前一樣的方式直接找到收件者。所以浩呆想到一個方法,就是將A公司的Exchange 帳號在B公司

建立聯絡人,這樣就可以解決這個問題。但是兩家公司都有幾百人在使用Exchange信箱,一筆一筆建立聯絡人就太累了。所以我寫了以下的程式來同步兩家公司的信箱帳號成對方的聯絡人。

 

這邊我們先假設A公司的網域FQDN為 : CompanyA.example。 B公司的FQDN為:CompanyB.example。

在這個研究中會有以下幾個檔案,這邊這些檔案會構成一個流程。

流程如下:

1. 我們會利用指令碼讀出Company A 的帳戶。

2. 我們會將Company A讀出來的帳戶資訊轉成csv檔案。

3. 最後我們將這個csv檔案匯入至Company B 成聯絡人。

 

※本文章浩呆是在兩個Windows Server 2003 網域上各自安裝Exchange 2003的獨立環境下測試的。

 

這些動作會需要下列的檔案,這邊我們再一一介紹它們的功用

  • SynMailList.bat -- 這是主要的批次檔,負責執行匯出CompanyA檔案、呼叫Tran.vbs檔案與匯入檔案到CompanyB。
  • source.csv-- 這個檔案會儲存從CompanyA讀出來的帳戶資訊。
  • Target.csv -- 這個檔案會儲存程式最後組出來的聯絡人資訊然後再被匯入到Company B 公司去。
  • Target_Base.csv--這個檔案是Template檔案。當程式讀出Company A的帳戶資訊後,Tran.vbs會複製一份Target_Base來建立一個新檔案(這邊我們會建立為 Target.csv 這個檔案 )。
  • Tran.vbs--這支VBS程式就是負責建立要儲存到Company B 的資料檔案

2

 

1. 我們先來看SynMailList.bat這隻程式檔案內容

REM A公司產出 通訊錄
csvde -f "E:\Data\Syn Exchange Mail list\CompanyA to CompanyB\source.csv" –s DC -d "OU=Example_user,dc=CompanyA,dc=COM" -r "(objectCategory=person)" -l  sAMAccountName,userPrincipalName

我們利用csvde指令把A 公司的帳號資訊讀出來並且存放在source.csv檔案中.

REM 執行資料轉換
Tran.vbs

呼叫Tran.vbs執行將A公司的帳號資訊轉成通訊錄.

REM 刪掉B公司放聯絡人目錄下所有聯絡人 以免重複(這部分只有第一次執行會需要,也可以不要執行這段)
dsrm -subtree -exclude -noprompt -u CompanyB\Administrator -p P@ssw0rd  -c ou=CompanyA,dc=CompanyB,dc=com

※這段要特別注意,倘若您整批匯入了一次帳號。根據我的測試您在下次匯入的時候若沒有刪掉原先的帳號的話,你就會看到兩個一模一樣的聯絡人。

如果你再匯入前先執行這段指令,會刪除上次的匯入資訊。但是這樣會發生一個狀況也就是你重新匯入帳號,雖然帳號不會出現兩個重複的資訊。但是因為通訊錄被你的Client快取了,所以如果你沒有重新下載通訊錄的話。

你在選收件人的時候看似沒有問題,但是實際上你在寄信的時候會出現錯誤,因為找不到這個收件人資訊。但是你更新後通訊錄,通常Exchange設定上會到那既定的時間才去更新通訊錄。所以Workaround浩呆我後面有再另外

撰寫一個同步單一帳號的程式。也就是說第一次同步兩家公司的通訊錄,之後有新人員如入時,我們只要對這一個單一新帳號做兩邊的同步即可。

REM 將目錄裝上 DC.CompanyB.com
csvde -i -f "E:\Data\Syn Exchange Mail list\CompanyA to CompanyB\Target.csv" -s DC.CompanyB.com -a Administrator P@ssw0rd ;

再利用csvde指令將通訊錄匯入至Company B 的DC主機中.

pause

 

2. csvde指令把A 公司的帳號資訊讀出來並且存放在source.csv檔案中,你會得到以下檔案。

3

 

3. Target_Base.csv 屬於檔目的地檔案的Template

我們利用底下的幾個屬性來組成聯絡人的必要資訊,因為這個程式之後還可以修改為一次傳遞一個人的資訊。所以我做了一個Csv的Template,這樣每次要用到這個檔案就用程式來複製這個Template就好。

1

 

3. 接著用Trans.vbs 來轉換檔案

set fso=CreateObject("Scripting.FileSystemObject")
Set f2 = fso.GetFile("E:\Data\Syn Exchange Mail list\Company A to Company B\Target_Base.csv")
f2.Copy ("E:\Data\Syn Exchange Mail list\Company A to Company B\Target.csv")

首先我們利用FileSustem物件來建立一個新檔案,這邊複製Target_Base.csv的格式給Target.csv。,。,。,。,。

'2. 建立 Connection 物件 連線到檔案
Set conn = CreateObject("ADODB.Connection")
conn.Open"Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=E:\Data\Syn Exchange Mail list\Company A to Company B;Extensions=asc,csv,tab,txt;Persist Security Info=False"
' 建立RS物件
Set rs = CreateObject("ADODB.Recordset")
Set rs2 = CreateObject("ADODB.Recordset")

建立Adodb物件準備來開啟檔案。

建立兩個RS物件。RS1用來儲存從來源DC讀出來然後儲存在source.csv的帳戶資訊檔案。

RS2用來開啟Target.csv檔案,準備將組合完成的檔案存進Target.csv。

'取得來源檔案 DN , sAMAccountName , userPrincipalName
rs.Open "Select * From source.csv", conn, 2, 2

'組出目的檔案 'objectClass , DN , displayName , mailNickname , targetAddress
rs2.Open "select * from Target.csv", conn, 2, 2

do while not rs.eof
    rs2.addnew
    rs2(0)="contact"   
    rs2(1)= mid(rs(0),1,instr(1,rs(0),",")-1) & ",OU=CompanyA,DC=CompanyB,DC=com"
    rs2(2)= mid(rs(0),4,instr(1,rs(0),",")-4)   
    rs2(3)= rs(1)   
    rs2(4)= "SMTP:" & rs(2)   
    rs.movenext
loop

rs2.update

set fso = nothing
set f2 = nothing
rs.close
rs2.close
set rs = nothing
set rs2 = nothing

 

4. Trans 組出了一份 Target.csv 檔案

最後便是利用csvde指令將聯絡人資訊匯入B公司的DC主機哩,這樣就可以在B公司裡面已聯絡人資訊的方式找到資料。反之,同樣的動作從B公司開始做一次,這樣相對在A公司裡面也會有B公司的聯絡人資訊。

這樣便可以交換兩家不同網域公司的聯絡人資訊了。

4

 

本篇參考文獻

如何使用 Csvde 將連絡人和使用者物件匯入到 Active Directory
http://support.microsoft.com/kb/327620/zh-tw