使用 Exchange 伺服器的位址日光節約時間變更為 「 Exchange 行事曆更新工具

文章翻譯 文章翻譯
文章編號: 930879 - 檢視此文章適用的產品。
重要此 「 Microsoft 知識庫 」 文件中所描述的更新已經由 Microsoft 知識庫 」 文章 941018 所述的更新取代。若要確定該 Windows 會包含 「 Microsoft 知識庫 」 文件中 941018 安裝更新所描述之最新時區資料。 您沒有解除安裝中所描述此 「 Microsoft 知識庫 」 文件所描述的更新安裝 「 Microsoft 知識庫 」 文件中 941018 之前,先更新。

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
941018如何使用 Exchange 行事曆更新工具來解決日光節約時間
全部展開 | 全部摺疊

在此頁中

簡介

日光節約時間是預先設定時鐘的系統,以便日出和日落發生在稍後的小時。效果在夜晚中是額外的日光節約。 雖然大部分擁有自己的規則與它何時開始及結束的法規,許多國家觀察日光節約時間。日光節約時間 (否則稱為 DST) 的日期可能會變更到年年份,且使用者必須更新他們的 Microsoft Office Outlook 行事曆每次 DST 法律或規則變更。 先前的 DST 規則和目前的 DST 規則之間日期被指在本文中 」 延伸 DST 句點"。

本文的重點在於您可以採取位址日曆中的項目 Microsoft Outlook DST 段期間所發生的動作。

如之作法的相關資訊的日光節約時間變更準備 2007 (DST 2007) 中所有受影響的 Microsoft 產品,請造訪下列 Microsoft 網站]:
http://www.microsoft.com/DST2007
本文的重點在於更新,應採取的動作行事曆會根據新的 DST 規則來儲存在 Microsoft Exchange Server 中的項目。這份文件] 所示的解決方案涉及 Exchange 行事曆更新工具 (「 Exchange 工具 」)。[Exchange] 工具會依賴為 Microsoft Office Outlook (「 Outlook 工具 」) 的時區資料更新工具。
如 Outlook 工具的更多有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
931667如何藉由使用時區資料更新工具的 Microsoft Office Outlook 2007 中解決日光節約時間變更

有關 Exchange 工具

您為 Microsoft Windows 安裝 DST 更新之後 DST 變更期間發生的所有舊約會會不正確地顯示成發生一個小時之後。這是週期性和單一執行個體約會如此。使它們將會顯示正確在 Outlook 中、 Outlook Web Access 以及 CDO 為基礎的應用程式必須更新這些約會。

Outlook 提供的 Microsoft Office Outlook 稱為時區資料更新工具的工具。此工具可讓使用者更新自己的行事曆。

附註在 Microsoft Office Outlook 2007 中內建時區資料更新工具。 不過,我們建議您使用獨立版本的時區資料更新工具。
931667如何藉由使用時區資料更新工具的 Microsoft Office Outlook 2007 中解決日光節約時間變更
Exchange 行事曆更新工具 (「 Exchange 工具 」) 可讓您避免部署的相關 Outlook 工具廣泛給所有使用者的挑戰,並讓您確認每一位使用者正確地執行此工具。

Exchange 工具的高階描述

Exchange 工具是由兩個獨立的可執行檔案所組成。下表說明這些檔案。
摺疊此表格展開此表格
檔案名稱描述
Msextmz.exe這個可執行的程式從執行 Exchange Server 的伺服器上的信箱擷取時區資訊。這個可執行的程式也會更新使用者的指定清單的信箱行事曆叫用 (Invoke) [Outlook 來針對每個指定的使用者的工具。
Msextmzcfg.exe這個可執行的程式是組態工具,在更新 Exchange Server 伺服器執行的大部分所牽涉的步驟。

Exchange 工具版本 2

2007 年 2 月 21,發行版本 2 的 Exchange 行事曆更新工具。 這篇文章是指 Exchange 工具版本 2。如果您執行 Exchange 工具版本 1,解除安裝它,並安裝版本 2。 Exchange 工具版本 2 包含了下列改進:
  • 您在更新模式下執行工具時,兩次快速,視為版本 1 第 2 版的效能。
  • 使用者介面已獲得改善。
  • 記憶體遺漏會固定經常重新啟動該必要的用戶端電腦。
  • 改良的演算法是為了將已解壓縮的時區對應到作業系統的時區。

風險與限制的執行 Exchange 工具

有兩個執行 Exchange 工具之前,先考慮的問題。 下表列出這些的問題其潛在的影響 IT 基礎結構,以及使用者和他們的減少錯誤策略。
摺疊此表格展開此表格
風險 效果緩和措施
有很多的會議更新。伺服器和網路效能降低。判斷什麼對伺服器和網路的效能影響可能是藉由先更新使用者的小型批次。如果負載而言過於凌亂破碎,執行工具,專用的維護小時期間或在離峰。
此工具太長而無法執行時。MSXTMZ.exe 是單一執行緒。如果您執行這個檔案在更新模式下,針對數個千分位使用者在同一時間,Exchange 工具可能要花許多小時或可能是幾天才能完成。若要加速針對所有信箱的更新程序,分成批次,數個使用者,並在另一部電腦上使用個別的 MSXTMZ.exe 執行個體,以更新使用者的每一批次。

正在更新信箱的選項

下表列出可以用來更新使用的 DST 2007 時區規則的使用者信箱的五個選項。
摺疊此表格展開此表格
選項專業人員缺點
散佈 Outlook 工具,以每一位使用者,並指示使用者更新他們自己的信箱。這個選項可以避免風險與限制的執行 Exchange 工具。很難保證所有使用者將會都執行 Outlook 工具正確地並適時地。Outlook 的使用者將無法執行 Outlook 工具。額外的教育性工作需要減少使用者的混淆。
針對所有受影響的使用者與伺服器執行 [Exchange] 工具。此選項為使用者提供有效率的經驗。有前面表格中所述,與執行 Exchange] 工具相關聯的問題。
執行 「 Exchange 工具,並更新僅週期性約會。 讓使用者藉由使用 Outlook] 工具來更新他們自己的信箱中的單一執行個體約會。沒有牽涉到的不正確地進行更新的單一執行個體約會的較少的風險。執行中的工具與執行中的 [Exchange] 工具的缺點結合的 Outlook cons。
[Exchange] 工具或 Outlook 工具都不執行。要求使用者檢查他們的行事曆和 re-book 約會視需要。此選項可避免執行中的 [Exchange] 工具的問題。除非所有使用者都 re-book 所有受影響的約會,一些行事曆項目將會延伸 DST 期間就關閉就一小時。額外的教育性工作需要減少使用者的混淆。
散佈 Outlook 工具,以每一位使用者,並指示使用者更新他們自己的信箱。然後,使用 Exchange 工具的時區] 擷取模式來決定使用者是否正在執行 Outlook 工具。如果使用者不執行 Outlook 工具,系統管理員可以執行 Exchange 工具。這個選項可以降低使用者無法適時地執行該工具的風險,並可避免執行 Exchange 的問題] 工具。這不是一個選項如果使用者正在執行 Outlook 2007。

如何安裝 Exchange 工具

Exchange 行事曆更新工具是可以使用自我解壓縮的可執行檔 Msextmz.exe 形式。

安裝之後, 安裝目錄中的檔案應該包含下列檔案:
  • Msextmz.exe
  • Msextmzcfg.exe
  • Msextmz.ini

    這個檔案是主要的.ini 檔案,Msextmz.exe 所使用的所有參數的文都件。
  • Msextmzcfg.xml

    這個檔案是將 Outlook、 CDO 和 Outlook Web Access 時區對應到作業系統時區的時區對應檔。
如更多有關最新版本的 Exchange 行事曆更新工具,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
941018如何使用 Exchange 行事曆更新工具來解決日光節約時間

[Exchange] 工具所支援的語言

Exchange 工具功能只能於英文。此工具將只能在英文 (美國) 電腦上執行。

版本的 Exchange Server 相容於 [Exchange] 工具

Exchange 工具可以更新下列版本的 Exchange 伺服器上的信箱:
  • Microsoft Exchange Server 2007 企業版
  • Microsoft Exchange Server 2007
  • Microsoft Exchange Server 2007 標準版
  • Microsoft Exchange Server 2003
  • Microsoft Exchange Server 2003 企業版
  • Microsoft Exchange 2000 伺服器
  • Microsoft Exchange Server 2003 標準版
  • Microsoft Exchange 2000 Server 企業版
  • Microsoft Exchange 2000 Server 標準版

[Exchange] 工具所支援的作業系統

Exchange 工具會在下列作業系統上執行:
  • Microsoft Windows Server 2003
  • Microsoft Windows XP
  • Microsoft Windows 2000
不支援 Windows Vista。

該怎麼做才能執行 [Exchange] 工具

安裝更新

在執行 Exchange 工具之前請確定用戶端和伺服器電腦會正確地更新與下列更新:
  1. 在用戶端和伺服器電腦上安裝 Windows 日光節約時間更新。如需有關如何更新正在執行 Windows 作業系統軟體的電腦的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
    942763Microsoft Windows 作業系統的 2007 年十二月的累積時區更新
  2. 對於 Exchange 2003 SP2 安裝 [下列與您的組織相關的更新]:
    • 911829當您嘗試執行任何編輯的工作或必須按一下以啟用 Outlook Web Access 中的撰寫框架時,收到錯誤訊息
    • 924334撰寫郵件] 表單會停止回應 Exchange Server 2003 中安裝網際網路總管 7.0 和 Outlook Web Access 用戶端上的 [S/MIME 控制項之後
    附註可以在同一時間為步驟 1 中完成這個步驟。

請確認系統需求

必須在 Microsoft Office Outlook 2003 的電腦上執行 [Exchange] 工具或 Microsoft Office Outlook 2007 安裝,且具有安裝的 Outlook 時區資料工具。此外,Microsoft.NET Framework 2.0 版必須安裝在用戶端電腦上。

Outlook 和區域資料更新工具,為 Microsoft Office Outlook 不是 Exchange 工具下載套件的一部分。他們必須分開安裝。

附註請勿混淆與實際 Outlook 工具可執行檔也名為 Tzmove.exe 名為 Tzmove.exe [Outlook 工具安裝程式套件。

若要成功地執行 Exchange 工具,電腦不必須擁有 PickLogonProfile 登錄值設定。或者,此登錄值必須設定為 0。如果要判斷此登錄值是否存在,請依照下列步驟執行。

重要這個區段、 方法或任務包含告訴您如何修改登錄的步驟。然而,如果您不當修改登錄,可能會發生嚴重的問題。因此,執行這些步驟時請務必小心。為加強保護,修改登錄之前,請務必將它備份起來。以後您就可以在發生問題時還原登錄。如需有關如何備份和還原登錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
322756如何備份和還原在 Windows 登錄
  1. 按一下 [開始]、 按一下 [執行]、 輸入 regedit,然後按一下 [確定]]。
  2. 展開下列子機碼:
    HKEY_CURRENT_USER\Software\Microsoft\Exchange\client\options\
  3. 按一下 [選項],然後再判斷 [PickLogonProfile 值是否存在。如果 PickLogonProfile 值存在,且設定為 [1,設定值為 0。要這麼做,請您執行下列步驟:
    1. PickLogonProfile,] 上按一下滑鼠右鍵,然後按一下 [修改]
    2. 數值資料] 方塊中鍵入 0,再按 [確定]
[Exchange] 工具不能執行的 Exchange 伺服器或 Exchange 系統管理工具的電腦上執行。如果嘗試在執行的 Exchange 伺服器或 Exchange 系統管理工具的電腦上安裝 Exchange 工具您會收到下列錯誤訊息:
無法與 Microsoft Exchange 安裝 Microsoft Exchange 行事曆更新工具。

如何以手動方式設定及執行 Msextmz.exe

設定 Msextmz.ini 檔案

Msextmz.ini 檔案必須正確設定,如 Msextmz.exe 正確執行。我們建議您閱讀 [Msextmz.ini 中的註解修改 Msextmz.ini 檔案之前小心檔案。

指定 Msextmz.exe 執行模式

Msextmz.exe 會在兩種模式中執行。若要指定的執行模式,特定參數必須在 Msextmz.ini 檔案中設定。下列清單說明三種模式,並說明如何 Msextmz.ini 檔案中設定模式。
  • 時區解壓縮

    在這個模式 Msextmz.exe 時區資訊從擷取每個信箱藉由讀取一組 MAPI 屬性。

    Msextmz.exe 可以檢查都由使用者組織中使用者 ’s 行事曆,然後再試著判斷使用者的時區的週期性約會。不過,這個選項是需要大量資源。預設情況下,因此,此選項不會啟用。若要以便此選項設定 [Msextmz.ini 檔案中的 [ReadCalendarTimezones 參數]。

    Msextmz.exe 記錄中包含的信箱清單的輸出檔的時區資訊為每個使用者傳統 DN。每個信箱傳統 DN 了下列類型的時區值:
    • Outlook Web Access 時區
    • CDO 時區
    • Outlook 的時區
    • 週期性會議時區
    檔案的格式會使用下列格式:
    User_DN<>\tabCDO_Time_Zone<\tab>Outlook Web Access_Time_Zone<\tab>Outlook_Time_Zone<>\tabRecurring_Meeting_Time_Zone<\crlf>
    如果 Msextmz.exe 無法擷取時區資訊為任何時間區域的四個型別信箱傳統 DN 將會記錄在檔案時發生錯誤。

    將使用者對應到只有一個時區,您必須匯入輸出檔案至 Microsoft Excel。在 Excel,篩選根據要時間區域的其中一個的使用者清單。您使用的時區取決於您的環境。

    範例如果大部分的使用者使用 Blackberry 裝置 Exchange 5.5 Outlook Web Access 或其他 CDO 基礎的解決方案,篩選清單由 CDO 時區。如果大部分的使用者使用 Exchange Outlook Web Access,篩選清單,Outlook Web Access 時區。如果大部分使用者不適合在這些案例的其中一個,篩選清單的週期性會議時區。

    在時區解壓縮模式下執行工具,設定.ini 檔,如下所示:
    • 離開指令行參數 uncommented。
    • 將 OutputFile 參數設定。
    • 將 ErrorFile 參數設定。
    • 將 ServerDN 參數設定。
    • 設定設定檔參數。
    • 設定記錄檔案參數。
    • 將 ExportTimezones 參數設定為 1。
    • 標記為註解其餘的.ini 檔案中的參數。
  • 更新

    在這個模式 Msextmz.exe 將會更新所有輸入檔中指定的信箱。輸入的檔應該以下列格式:
    User_DN<\tab>Server_Friendly_Name<\tab>OS_Time Zone_Registry_Key<\crlf>
    在一部用戶端上執行的 Msextmz.exe 只有一個執行個體。不過,Msextmz.exe 可以同時執行多個用戶端上。

    若要在這個模式下執行 Msextmz.exe,您必須設定 Msextmz.ini 檔案,如下所示:
    • 請確定指令行參數 uncommented,而且指向正確位置的 Tzmove.exe。
    • 將 InputFile 參數設定。
    • 標記為註解 OutputFile 參數。
    • 將 ErrorFile 參數設定。
    • 將 ServerDN 參數設定。
    • 設定記錄檔案參數。
    • 將 LogDirectory 參數設定。
    • 標記為註解 ExportTimezones 參數。
    • 取消註解剩餘的參數。
    在更新模式 Msextmz.exe 可以接受包含上不同的 Exchange 使用者的輸入的檔的伺服器。.ini 設定需要您提供的 Exchange 伺服器。在這種情況下您只可以指定一個伺服器目錄名稱的 Exchange Exchange 組織中的伺服器。

    若要更新週期性約會,設定指令行參數具有下列值:
    tzmove.exe/q /onlyrecurring
    若要更新週期性和單一執行個體約會,使用預設的指令行值。

為 Msextmz.exe 設定使用權限

執行 Msextmz.exe 所需的權限而定用在執行模式。下表列出所需的每個執行模式使用權限。
摺疊此表格展開此表格
執行模式權限
時區撤離Exchange 只能瀏覽的系統管理員
正在執行 Msextmz.exe 之電腦的本機系統管理員
更新網域使用者具有所有信箱的完整信箱存取 」 和 「 傳送 」 權限
正在執行 Msextmz.exe 之電腦的本機系統管理員

「 信箱權限授與 「 指令碼

您可以使用範例 GrantMailboxPermission.vbs 指令碼來網域權利授與使用者完整信箱存取 」 與 「 傳送為所有信箱。

此指令碼執行的 Exchange 2000 伺服器或 Exchange Server 2003 的電腦上只由 Exchange 管理員中執行。無法在執行 Exchange Server 2007 的電腦執行這個指令碼。 但是,您可以使用 Exchange 管理命令介面授與必要的權限。

在 < 參考 > 一節中提供 VBS 指令碼的程式碼。下表說明這個指令碼執行的兩種模式。
摺疊此表格展開此表格
模式命令列描述
新增CScript GrantMailboxPermission.vbs –add Domain_Name \ User_Name File_Name授與 Domain_Name \ User_Name 到輸入檔中所列的使用者信箱的完整信箱存取 」 和 「 傳送 」 權限。輸入的檔案必須包含使用者信箱,由 CRLF 分隔的傳統 DN 的文字檔。

指令碼會產生 GrantMailboxPermission.log 檔案。這個檔案是記錄都已處理的信箱。記錄檔的第一行是 Domain_Name \ User_Name 被授與存取權限的使用者。請勿刪除這個檔案。在移除模式中使用這個檔案。

如果明確拒絕存取已被指派給使用者,指令碼會記錄 「 資訊檔中名為"GrantMailboxPermission.err]。指令碼不會授與或變更使用權限。

如果使用者是已被指派拒絕存取的安全性群組的一部份,指令碼會授與完整信箱存取 」 和 「 傳送 」 權限。不過,使用者將無法登入信箱。所有的錯誤將會記錄在 GrantMailboxPermission.err 檔案。
移除CScript GrantMailboxPermission.vbs –remove移除從 Domain_Name GrantMailboxPermission.log 檔案中所列的信箱的完整信箱存取 」 和 「 傳送 」 權限 \ User_NameDomain_Name \ GrantMailboxPermission.log 檔中指定 User_Name
附註當您在執行 Exchange Server 電腦上執行此指令碼時,指令碼指令碼順利處理使用者時,傳回句號 (.)。如果它並不會成功地處理使用者指令碼會傳回一個驚嘆號 (!)。

附註輸出檔的時區解壓縮模式不能用來作為輸入檔,此指令碼。若要建立輸入的檔,此指令碼,可以時區擷取輸出檔的內容貼到 「 記事本 」、 將內容儲存為新的文件,然後使用 [與輸入檔的 [新文件。

記錄在更新模式下的運作方式

記錄檔從 Outlook 時區資料更新工具

在執行 Outlook 工具時工具會在暫存目錄中建立記錄檔。這個檔案被命名為 「 Outlook 時區 Update.log]。Msextmz.exe 擷取從 」 Outlook 時區 Update.log 」 資訊,並再建立記錄檔每位使用者在.ini 檔案 LogDirectory 中所指定的目錄。

這些檔案的命名藉由使用下列格式:
MSExTmz-User’s CN from the User DN-Random number.LOG
比方說 Outlook 工具會記錄下列資訊:
MSExTmz USER3 0x0131273E.LOG
Outlook 的工具會執行此處理擁有下列 DN 時:
/ O = 第一個組織/OU = 第一個系統管理群組/CN = 收件者/CN = user3

檔案時發生錯誤

如果無法對任何信箱執行 Outlook 工具 Msextmz.exe,使用者的 DN 將會記錄在檔案時發生錯誤。Msextmz.exe 將無法登任何項目檔案時發生錯誤如果 Outlook 工具已經成功地執行。

記錄檔

Msextmz.ini 檔案裡,均設定 記錄檔 選項,輸出 Msextmz.exe 從命令提示視窗的資訊也可用在指定的檔案。

如何執行 Msextmzcfg.exe

Msextmzcfg.exe 自動化程序的解壓縮時區、 解析為每個使用者的時區及產生使用者清單和所需在更新模式下執行 Msextmzcfg.exe.ini 檔案。我們建議您執行而非以手動方式執行這些步驟使用 Msextmzcfg.exe。本節說明如何執行 Msextmzcfg.exe。

必要的權限

用來執行 Msextmzcfg.exe 該帳戶必須具有下列權限在用戶端上:
  • Exchange 僅檢視管理
  • 本機系統管理員

處理程序使用 Msextmzcfg.exe 更新 Exchange 伺服器的範例

  1. 在用戶端的電腦上建立 Outlook 設定檔的登入位於您試圖更新的 Exchange 伺服器的信箱。請確定設定檔是在線上模式中,然後設定此設定檔是預設的設定檔。

    附註Exchange 伺服器必須支援線上模式。
  2. 執行 Msextmzcfg.exe 啟動 [Exchange] 工具。
  3. 頁面一的 Exchange 行事曆更新工具精靈完成下列程序的其中一個:

    如果要解壓縮的 Exchange 伺服器上的所有信箱時區,請依照下列步驟執行:
    1. 在 [伺服器名稱] 方塊中鍵入 [好記的名稱或 [完全合格網域名稱 (FQDN) 的 Exchange 伺服器]。如果好記的名稱包含一個 「",使用 NetBIOS 名稱來代替。 如果伺服器是在另一個 Active Directory 樹系,將會失敗 Msextmzcfg.exe。
    2. 來源擷取輸出檔案 中方塊中,輸入將包含所有信箱時區資訊的檔案名稱。
    3. 如果要解壓縮的週期性會議時區按一下以選取 [擷取週期性會議時區] 核取方塊。

      重要如果您使用此設定,抽選模式的執行的階段將會大幅增加。預設情況下,抽選週期性會議時區 清除核取方塊。
    4. 按一下 [Outlook 設定檔名稱] 清單,然後按一下您在步驟 1 中建立設定檔。
    5. 按一下 [下一步]。


    若要要略時區萃取請依照下列步驟執行:
    1. 按一下以選取 [略過時區萃取 核取方塊。預設情況下,會清除 略過時區萃取] 核取方塊。
    2. 來源擷取輸出檔案 中方塊中,輸入從先前的時區擷取執行的輸出檔名稱。
    3. 在 [伺服器名稱] 方塊中鍵入 [好記的名稱或用來產生您在步驟 3b 中指定的輸出檔,Exchange 伺服器的 FQDN]。
    4. 按一下 [下一步]。
  4. 時區萃取完成後 Msextmzcfg.exe 剖析輸出檔,並嘗試對應使用者信箱從及時區與實際作業系統時區。

    如果不符合任何時區,您必須以手動方式對應 圖時區] 頁面上的時區。若要執行此動作按一下符合 Windows 時區] 清單中的 [使用者] 時區之 Windows 時區,然後按一下 [下一步]。
  5. 當對應程序完成時,Msextmzcfg.exe 來使用者分類成下列群組:
    • 只有一個時區 (比方說具有使用者 CDO、 Outlook Web Access、 Outlook 或週期性會議及時區) 的使用者或具有對應到相同的作業系統時區的多個時區的使用者
    • 對應到不同的作業系統時區的多個時區的使用者
    • 任何時區資訊的使用者
    Msextmzcfg.exe 可讓您在獨立的文字檔儲存 「 衝突 」 和 「 不存在 」 的使用者的清單。要這麼做,請您執行下列步驟:
    1. 在 [衝突的時區資訊的使用者] 區域輸入 ConflictUsers.txt 在 [輸出檔案] 方塊中。
    2. 沒有時區資訊的使用者] 區域輸入 NonExistent.txt 在 [輸出檔案] 方塊中。
  6. 在 [行事曆更新組態] 頁面上提供要產生使用者清單輸入的檔案]、 [.ini 的檔案] 及 [批次檔,用來更新信箱所需的資訊。要這麼做,請您執行下列步驟:
    1. 在 [選取所需要更新的時區] 清單中,按一下以選取您想要更新的時區] 核取方塊。
    2. 批次檔數目] 鍵入您想要產生的使用者的批次數目。

      此資訊非常有用,如果您想要加速執行階段更新。您可以只要將使用者的大型清單分解成較小的批次,然後執行 [更新模式中的 [Msextmz.exe 的多個執行個體。不同的電腦上執行這項操作,而且有 Msextmz.exe 程序不同的批次的使用者的每個執行個體。

      附註您無法在相同的用戶端電腦上執行 Msextmz.exe 的多個執行個體。
    3. 在 [Tzmove.exe 路徑] 方塊輸入 Outlook 工具,其參數的路徑。如果想更新唯一的週期性會議按一下以選取 [僅週期性會議] 核取方塊。
    4. 張貼郵件信箱的延遲 (秒) 方塊輸入您想要延遲的秒數設定檔之間更新信箱中建立。我們建議使用預設值 0 秒。
    5. 等待每個信箱時間 (分鐘)] 方塊中鍵入您要 Outlook 工具,以等候之前它將會逾時時間的分鐘數。我們建議使用預設值為 15 分鐘。
  7. 按一下 [完成]。Msextmzcfg.exe 會產生目前的執行目錄下的子目錄。子目錄的名稱是 Exchange 伺服器的好記的名稱。在子目錄包含下列檔案:
    • MSExTmz _x.ini

      這個檔案是.ini 檔案,由 Msextmz.exe 用來在更新模式下執行。 x 是批次號碼的預留位置。
    • Mailboxes_ x.txt

      這個檔案是使用者清單輸入的檔所使用 Msextmzcfg.exe 在更新模式下執行。 x 是批次號碼的預留位置。
    • MSExTmz_ x.bat

      這個檔案是批次檔執行更新時 [Msextmzcfg.exe 對抗 Mailboxes_ x.txt 檔中指定的使用者模式。
    • NonExistent.txt

      這個檔案包含在其信箱中沒有時區資訊的使用者清單。
    • ConflictUsers.txt

      這個檔案包含有時區衝突的使用者清單。
  8. 找出伺服器命名的子目錄在 [記事本] 中開啟 Mailboxes_x.txt 檔案、 移除項任何資源或系統信箱目,然後再存檔 Mailboxes_x.txt。
  9. 請依照下列步驟執行:
    1. 啟動 Outlook,並確認 Outlook 正確登入伺服器使用預設的設定檔,而不提示您選取的設定檔。
    2. 確認沒有任何提示出現在 Outlook 啟動時。 如果有提示,無法執行 Msextmz.exe。
    3. 請確認下列的檔案不存在:
      %USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook\Extend.dat
      如果這個檔案也請將它重新命名。
    藉由移至名為在伺服器之後的子目錄,以及執行批次檔案一一更新信箱。為了順利地執行批次檔案,您必須使用具有 「 完整信箱存取 」 和 「 傳送 」 權限為您想要更新的信箱的帳戶。

執行 Exchange 工具之後,該如何處理

安裝更新

在您完成更新您的環境中的所有 Exchange 伺服器後,請在 Exchange 伺服器上安裝下列更新:
926666Exchange 2003 Service Pack 2 的 2007 年的日光節約時間變更的更新

已知的問題

  • 在 Outlook Web Access 中所建立的週期性會議不會更新 「 Exchange 工具

    如果更新信箱之前,您可以安裝 Exchange 伺服器上的知識庫文件 926666 的提到的更新,[Exchange] 工具不會更新在 Outlook Web Access 中建立的週期性會議。如果要解決這個問題,移除更新 926666、 執行 Exchange] 工具,然後再重新更新 926666 安裝 Exchange 伺服器上]。
  • 必須重新啟動 Exchange 2007 之後您執行 Exchange 工具

    為 Exchange 2007 Outlook Web Access 在您執行 Exchange 工具後,正確地顯示行事曆項目,Exchange 服務必須重新啟動。
  • 您無法安裝 [Exchange] 工具

    [Exchange] 工具將無法安裝成功如果其中一個下列的登錄機碼存在:
    • HKEY_CLASS_ROOT\Outlook.Application.9
    • HKEY_CLASS_ROOT\Outlook.Application.10
    在這種情況下當您嘗試安裝 Exchange 工具時收到下列錯誤訊息:
    無法與此版本的 Microsoft Outlook 安裝 Exchange Server 行事曆 Rebasing 的工具。
    如果要解決這個問題,刪除這些登錄機碼]、 安裝 Exchange] 工具,然後再還原登錄機碼]。
  • 一個時區可能是模稜兩可

    中太平洋 (PST) 的時區在 Outlook 2003 或較早版本的 Outlook 中使用 DST 2006 規則所建立的週期性行事曆項目不會更新由 Outlook 工具。這個問題會影響 Msextmz.exe,因為 Msextmz.exe 執行 Outlook 工具。

    若要解決這個問題,變更登錄,以移除墨西哥時區執行 Msextmz.exe 的電腦上。在更新模式中執行 Msextmzcfg.exe,然後再還原墨西哥時區登錄中。要這麼做,請您執行下列步驟。

    重要這個區段、 方法或任務包含告訴您如何修改登錄的步驟。然而,如果您不當修改登錄,可能會發生嚴重的問題。因此,執行這些步驟時請務必小心。為加強保護,修改登錄之前,請務必將它備份起來。以後您就可以在發生問題時還原登錄。如需有關如何備份和還原登錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    322756如何備份和還原在 Windows 登錄
    1. 備份登錄。
    2. 按一下 [開始]、 按一下 [執行]、 輸入 regedit,然後按一下 [確定]]。
    3. 展開下列子機碼:
      HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time 區域
    4. 墨西哥標準時間,] 上按一下滑鼠右鍵,然後按一下 [刪除]。
    5. 在 [確認機碼刪除] 對話方塊中,按一下 []。
    6. 墨西哥標準時間 2 上, 按一下滑鼠右鍵,然後按一下 [刪除]。
    7. 在 [確認機碼刪除] 對話方塊中,按一下 []。
    8. 在更新模式下執行 Msextmzcfg.exe。
    9. 從您在步驟 1 中建立的備份還原登錄。
    如需有關如何備份及還原登錄的詳細資訊,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    256986Microsoft Windows 登錄的描述
  • 處理每個伺服器的信箱的數目限制

    在使用者清單模式和時區解壓縮模式,Msextmz.exe 可以處理只 65,535 信箱伺服器上。如果伺服器以上 65,535 信箱將不會處理某些信箱。
  • 可能有與會議房間的工作分派衝突

    當您使用 Outlook 工具時,會議會移至正確的時間。不過,這可能導致衝突,與會議房間的工作分派。

    如果您正在執行 Exchange Server 2007,我們建議您設定資源預約服務員 Exchange 2007 到 3 的衝突數上限。更新所有信箱後,會自動先解決衝突。

    如果您使用的直接預約] 或 [自動接受代理程式,請依照下列步驟執行來更新資源信箱:

    以直接預約

    附註下列的步驟需要您的 Microsoft Office Outlook (Tzmove.exe) 下載最新 Hotfix 時區資料更新工具。
    1. 執行 Tzmove.exe (Outlook 的工具) 與 / FORCEREBASESUPPRESSALLUPDATES 對資源信箱的命令列參數。
    2. 在針對所有其他信箱的標準模式中執行 Tzmove.exe。
    之後,更新已完成,如果您使用 Outlook 來登入資源信箱 andto 讀取會傳送在步驟 2 中的更新時,那些會議更新出現在資源信箱行事曆上為"暫時性的"。如果沒有人登入時資源信箱時,原始在步驟 1 中已更新的會議要求將會以接受資源信箱行事曆上出現。

    如需有關 FORCEREBASESUPPRESSALLUPDATES,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
    933146Microsoft Office Outlook 的時區資料更新工具的 Hotfix 套件的描述


    為 [自動接受代理程式
    1. 請確定 [自動接受代理程式 」 正在執行伺服器上。
    2. 在用戶端電腦上安裝日光節約時間更新。
    3. 執行 Tzmove.exe (Outlook 的工具) 與 / FORCEREBASESUPPRESSALLUPDATES 針對具有自動接受代理程式啟用的資源信箱的命令列參數。
    4. 確認一次自動接受代理程式正在執行。這點很重要,以確定使用者會收到接受郵件,以進行更新他們組織的會議。
    5. 在針對所有其他信箱的標準模式中執行 Tzmove.exe。
  • 公用資料夾行事曆

    [Exchange] 工具並不會更新公用資料夾行事曆。如需有關如何更新公用資料夾行事曆,請參閱 Outlook 工具文件的資訊。
  • 您必須使用 「 執行身分 」 命令列中

    如果想要藉由使用 「 執行身分 」 命令列中執行 Msextmz.exe 請確定您同時也使用 「 執行身分 」 來設定在登錄中設定 PickLogonProfile 值的登錄編輯程式。
  • Msextmz.exe 可能會停止回應

    通用類別目錄伺服器的問題可能會造成 Msextmz.exe 停止回應。如果發生這種情況請依照下列步驟執行:
    1. 停止 Msextmz.exe。
    2. 如果 Msextmz.ini 中設定的記錄檔參數,找出處理哪些信箱。處理信箱 記錄檔中的項目提供 Msextmz.exe 停止回應時處理的信箱使用者 DN。

      如果參數未設定 Msextmz.ini 中記錄檔,處理信箱資訊可在中找到 [命令提示字元] 視窗。

      不處理後面 Msextmz.exe 停止回應時處理的信箱的所有使用者信箱。這適用於信箱中 ServerName_TimeZone_Input_File.txt 用做為此執行輸入的檔案。
    3. 建立新的輸入的檔包含使用者不被處理的信箱 DN。
    4. 您 Msextmz.exe 使用再次執行這個新的輸入檔之前請確定您處理由前一個執行所產生的檔案時發生錯誤的使用者。
  • 您可以執行 Outlook 工具和相同的環境中的 [Exchange] 工具

    您可以在相同的環境中執行 Outlook 工具和 Exchange 工具。如果您在 Outlook] 工具已更新的信箱上執行 Exchange 工具或反向操作就會發生沒有副作用。不過,如果系統管理員所執行的 Exchange 工具就分別執行 Outlook 工具的使用者不需要。
  • 晚於預期顯示備忘提醒

    由 [Exchange] 工具更新的信箱的非會議提醒將不會更新,如果 Outlook 永遠不會有連接到線上模式中信箱。 在這種情況下提醒會出現一個小時之後超過預期。

    如果 Outlook 永遠不會有連線在線上模式,您必須調整 Outlook 時區更新工具找到的行事曆約會不正確的提醒。如果 Outlook 永遠不會有連線在線上模式,[提醒] 搜尋資料夾不存在信箱中。因此這個工具並不會更新電子郵件項目、 連絡人或其他提醒。比方說工具並不會更新提醒電子郵件項目,以便在將來的時間待上或在具有一個提醒的工作項目上的提醒。
  • 可能長執行時間

    Msextmz.exe 是單一執行緒。因此,它花許多小時對許多信箱執行工具。

    供參考,Microsoft IT 便能更新大約 53,000 信箱中 16 小時,藉由使用九個用戶端。這等於每分鐘每個用戶端 6.13 信箱的更新率。

    受邀者在會議邀請中的數目應該不會影響執行的階段的更新模式。這是因為用戶端觀點會議更新給一位收件者地傳送相同的時間與傳送會議更新到一百收件者。

    受邀者的數目,並會影響會議更新的列印份數。 不過,這就是郵件流量,而非執行階段發生問題。
  • 事件記錄檔可能空間用完後更新許多信箱

    Tzmove.exe 會產生資訊事件,其中包含每一個成功的更新來源 TZMOVE EventID 32。大量事件可能會造成應用程式記錄檔,超過磁碟上配置的空間。 在更新模式下 Msextmz.exe 依賴這些事件來判斷 Tzmove.exe 成功執行。 如果 Msextmz.exe 找不到對應 Msextmz.exe 嘗試更新的信箱與相關聯的 Tzmove.exe 事件,Msextmz.exe 假設更新未成功。因此 Msextmz.exe error.txt 檔中記錄信箱 DN。 若要避免發生這種問題,我們建議您將事件記錄檔大小設定為最大值,並允許覆寫。
  • 「 無法安裝,因為偵測到舊版的 「 Microsoft Exchange 行事曆更新工具 」。請解除安裝它們並再次執行這個安裝程式 」

    如果您先前已安裝 Exchange 行事曆更新工具版本 1.0,您必須先解除安裝 1.0 版安裝版本 2.0 之前。1.0 版已分散成自我解壓縮的可執行程式,並在其中包含兩個 MSI 套件: Msextmz.msi 和 Msextmzcfg.msi。安裝 2.0 版之前,您必須解除安裝這兩個封裝。如果您仍然安裝版本 2.0 的問題請嘗試 re-installing 和解除安裝版本 1.0 使用 *.msi 套件,而不是使用 [新增或移除程式] 工具。然後,重新啟動您的電腦並安裝版本 2.0。如果所有其他失敗直接從 *.msi 套件解壓縮二進位碼檔案。

錯誤訊息和解析度

  • 無法尋找信箱 Timezone:error 0x80004005
    這個錯誤訊息的原因可能是下列問題之一:
    • 工具找不到該特定的使用者信箱中的任何時區值。 若要解決這個問題,請嘗試新增 「 ReadCalendarTimeZones = 1 」 (不含引號) 至 Msextmz.ini 檔案,以強制工具,以檢查時區資訊的週期性行事曆項目。 您可以使用從上次執行從收到的錯誤記錄檔 DN 來建立新的輸入的檔。
    • 您所參考 Tzmove.exe 從錯誤的目錄。 如果要解決這個問題,展開到 Msextmz 所在的位置,或更新以包含 Tzmove.exe 在您使用的工作站上的安裝位置的完整路徑 Msextmz.ini 資料夾的 [下載的安裝檔案]。

      附註 當您為 Microsoft Office Outlook 下載時區資料更新工具時,Tzmove.exe 檔案會是實際的工具的安裝程式。 當您執行 Msextmz 參考安裝程式會導致錯誤。
    • 您用來執行 Msextmz 帳戶不具有完整的信箱權限,且尚未委派正確的 Exchange 權限。 如果要解決這個問題,請從 Exchange Server 電腦執行 「 授與信箱權限 」 指令碼。
  • 無法處理信箱/O = CONTOSO / OU = FIRST ADMINISTRATIVE GROUP / CN = RECIPIENTS / CN = TESTMB01 0x80004005
    仔細檢閱 legacyExchangeDN 並進行任何必要的修正。 若要並確認值精確,使用 ADSIEdit 複製及貼上值。
  • 無法開啟信箱資料表的伺服器/O = CompanyRoot / OU = IT / cn = 組態/cn = 伺服器/cn = EXCH01。 錯誤 80040115
    這是 RPC 錯誤。 仔細檢閱 legacyExchangeDN 並進行任何必要的修正。
    請選取有效的伺服器
    您需要在伺服器辨別的名稱 (DN)。DN 應該類似下列的 DN:
    ServerDN: / O = CompanyRoot/OU = IT / cn = 組態/cn = 伺服器/cn = EXCH01
  • 應用程式無法正確地初始化 (0xc0000135)。按一下 [確定] 以終止應用程式上的
    因為尚未安裝.NET Framework 2.0,就會發生這個錯誤訊息。
  • HrTestMailboxAccess: 無法開啟信箱-0x8004011D。
    如果您在更新作業期間收到這個錯誤訊息,您正在使用的帳戶並沒有完整存取權限到信箱。該帳戶必須要能更新信箱工具的所有信箱都具有完整信箱存取權限。

    請確認已授與正確的權限為 Msextmz.exe 設定權限 」 一節中使用方法所述。

?考

「 信箱權限授與 「 指令碼

Option Explicit
' For FileSystemObject
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const TristateTrue = -1
Const TristateUseDefault = -2
Const TristateFalse = 0

'Permission Type: Allow or Deny
Const ADS_ACETYPE_ACCESS_ALLOWED = &H0
Const ADS_ACETYPE_ACCESS_DENIED = &H1
Const ADS_ACETYPE_ACCESS_ALLOWED_OBJECT = &H5
Const ADS_ACETYPE_ACCESS_DENIED_OBJECT = &H6

Const ADS_ACEFLAG_INHERIT_ACE = &H2
Const ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE = &H4
Const ADS_ACEFLAG_INHERIT_ONLY_ACE = &H8
Const ADS_ACEFLAG_INHERITED_ACE = &H10
Const ADS_ACEFLAG_VALID_INHERIT_FLAGS = &H1f
Const ADS_ACEFLAG_SUCCESSFUL_ACCESS = &H40
Const ADS_ACEFLAG_FAILED_ACCESS = &H80

'Declare ADSI constants
Const ADS_SCOPE_SUBTREE = 2
Const ADS_OPTION_SECURITY_MASK = 3
Const ADS_OPTION_REFERRALS	= 1
Const ADS_SECURITY_INFO_DACL = 4
Const ADS_CHASE_REFERRALS_NEVER = &h00 
Const ADS_CHASE_REFERRALS_SUBORDINATE = &h20 
Const ADS_CHASE_REFERRALS_EXTERNAL = &h40

'Microsoft Exchange 
Const EX_MB_SEND_AS_ACCESSMASK  = &H00100
Const EX_FULLMAILBOX_ACCESSMASK = 1
Const EX_MB_SEND_AS_GUID = "{AB721A54-1E2F-11D0-9819-00AA0040529B}"

'Application Parameter Index
Const ARG_INDEX_MODE = 0
Const ARG_INDEX_USERNAME = 1
Const ARG_INDEX_FILENAME = 2
Const MIN_ARG = 1

Const MODE_INVALID = -1 
Const MODE_ADD = 0
Const MODE_REMOVE = 1

Const ADD = "-ADD"
Const REMOVE = "-REMOVE"

'Application Const String
Const EMPTYSTRING = ""
Const ERROR_FILENAME = "GrantMailboxPermission.err"
Const OUTPUT_FILENAME = "GrantMailboxPermission.log"
Dim OUTPUT_DELIMITER
OUTPUT_DELIMITER = vbTab

'Logging file
Dim objFSO
Dim objfileError
Dim objfileOutput
Dim objfileImport
Dim objconn
Dim objCommand
Dim rootDSE
Dim sDomainContainer
Dim sUserLDAPPath
Dim objUser
Dim objSDNTsecurity
Dim objDACLNT
Dim objDACLEX
Dim objSDMailbox
Dim fFMA
Dim fSendAs
Dim AccessTypeForFMA
Dim AccessTypeForSendAS
Dim fAddedFMA
Dim fAddedSendAs
Dim fRemovedFMA
Dim fRemovedSendAs
Dim sArraySplit
Dim sOneRow
Dim sGrantedUser
Dim dArgCount
Dim cScriptMode
Dim dArgExpected
Dim fOneError

On Error Resume Next
'Parameter Checking
dArgCount = Wscript.Arguments.Count
If (dArgCount < MIN_ARG) Then
	DisplaySyntax
End If

cScriptMode = MODE_INVALID
Select Case UCase(WScript.Arguments(ARG_INDEX_MODE))
	Case ADD
		cScriptMode = MODE_ADD
		dArgExpected = ARG_INDEX_FILENAME + 1
	Case REMOVE
		cScriptMode = MODE_REMOVE
		dArgExpected = ARG_INDEX_MODE + 1
	Case Else
		cScriptMode = MODE_INVALID
End Select

If (cScriptMode = MODE_INVALID Or dArgCount <> dArgExpected) Then
	DisplaySyntax
End If

If (cScriptMode = MODE_ADD) Then
	sGrantedUser = WScript.Arguments(ARG_INDEX_USERNAME)
	If (IsValidUserName(sGrantedUser) = False) Then
		DisplaySyntax
	End If
End If

CreateImportExportFiles

If (cScriptMode = MODE_ADD) Then
	err.Clear
	
	'Prepare LDAP connection
	Set objconn = CreateObject("ADODB.Connection")
	Set objCommand = CreateObject("ADODB.Command")
	objconn.Provider = "ADSDSOObject"
	objconn.Open "ADs Provider"
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to bind to Active Directory server, error:" & err.Description)
		objfileError.WriteLine("Failed to bind to Active Directory server, error:" & err.Description)
		WScript.Quit
	End If
		
	Set rootDSE = GetObject("LDAP://rootDSE")
	sDomainContainer = rootDSE.Get("defaultNamingContext")
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to find a Domain Container:" & err.Description)
		objfileError.WriteLine("Failed to find a Domain Container:" & err.Description)
		WScript.Quit
	End If
		
	Set objCommand.ActiveConnection = objconn

	Do While objfileImport.AtEndOfStream <> True
		fOneError = False
		sUserLDAPPath = EMPTYSTRING
		err.Clear

		sOneRow = Trim(objfileImport.ReadLine)
		If sOneRow <> EMPTYSTRING Then
		
		    sUserLDAPPath = GetLDAPPathFromLegacyDN(sOneRow)
		    If (err.number <> 0) Then
			    objfileError.WriteLine("Failed to get user's LDAP path from " & sOneRow)
			    fOneError = True
			    err.Clear
		    End If

		    If (fOneError = False) Then
			    Set objUser = GetObject(sUserLDAPPath)
			    If (err.number <> 0) Then
				    objfileError.WriteLine("Failed to get user object from " & sUserLDAPPath)
				    objfileError.WriteLine("Error: " & err.Description)
				    fOneError = True
				    err.Clear
			    End If
		    End If
    	
		    If (fOneError = False) Then
			    Set objSDMailBox = objUser.MailboxRights
			    Set objDACLEX = objSDMailbox.DiscretionaryAcl
			    Set objSDNTsecurity = objUser.ntSecurityDescriptor
			    Set objDACLNT = objSDNTsecurity.DiscretionaryAcl
			    If (err.number <> 0) Then
				    objfileError.WriteLine("Failed to get DACL of " & sUserLDAPPath)
				    objfileError.WriteLine("Error: " & err.Description)
				    fOneError = True
				    err.Clear
			    End If
		    End If

		    ' Check Full Mailbox Access and Send As permission
		    fFMA = False
		    fSendAs = False
		    AccessTypeForFMA = ADS_ACETYPE_ACCESS_ALLOWED
		    AccessTypeForSendAS = ADS_ACETYPE_ACCESS_ALLOWED

		    If (fOneError = False) Then
			    CheckFullMailboxAccess objDACLEX, sGrantedUser, fFMA, AccessTypeForFMA
			    CheckSendAs objDACLNT, sGrantedUser, fSendAs, AccessTypeForSendAS
			    If (err.number <> 0) Then
				    objfileError.WriteLine("Failed to Check permission of " & sUserLDAPPath)
				    objfileError.WriteLine("Error: " & err.Description)
				    fOneError = True
				    err.Clear
			    End If
		    End If

		    'If we don't have either SendAS or FMA, we're going to add these permission
		    If ( (AccessTypeForFMA = ADS_ACETYPE_ACCESS_DENIED) Or (AccessTypeForSendAs = ADS_ACETYPE_ACCESS_DENIED_OBJECT) ) Then
			    'Deny access already granted, won't add permission to this user
			    objfileError.WriteLine("Deny permission already added: " & sUserLDAPPath)
			    fOneError = True
		    End If
    		
		    If ( fOneError = False And ((fFMA = False) Or (fSendAs = False)) ) Then
			    fAddedFMA = False
			    fAddedSendAs = False
    			
			    If (fFMA = False) Then
				    'Add FMA permission
				    err.Clear
				    AddAce objDACLEX, sGrantedUser, EX_FULLMAILBOX_ACCESSMASK, ADS_ACETYPE_ACCESS_ALLOWED, ADS_ACEFLAG_INHERIT_ACE, 0,0,0
				    objSDMailbox.DiscretionaryAcl = objDACLEX
				    objUser.MailboxRights = Array(objSDMailbox)
				    If ( err.number <> 0 ) Then
					    objfileError.WriteLine("Failed to add FullMailbox Access: " & sUserLDAPPath)
					    objfileError.WriteLine("Error: " & err.Description)
					    fOneError = True
					    fAddedFMA = False
					    err.Clear
				    Else
					    fAddedFMA = True
				    End If
			    End If
    			
			    If (fSendAs = False) Then
				    'Add SendAs permission
				    err.Clear
				    AddAce objDACLNT, sGrantedUser, EX_MB_SEND_AS_ACCESSMASK, ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, 0,1, EX_MB_SEND_AS_GUID, 0
				    objSDNTsecurity.DiscretionaryAcl = objDACLNT
				    objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
				    objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
				    If ( err.number <> 0 ) Then
					    objfileError.WriteLine("Failed to add SendAs permission: " & sUserLDAPPath)
					    objfileError.WriteLine("Error: " & err.Description)
					    fOneError = True
					    fAddedSendAs = False
					    err.Clear
				    Else
					    fAddedSendAs = True
				    End If
			    End If

			    If (fOneError = False ) Then 
				    objUser.SetInfo
				    If (err.number <> 0) Then
					    objfileError.WriteLine("Failed to update user: " & sUserLDAPPath)
					    objfileError.WriteLine("Error: " & err.Description)
					    fOneError = True
					    err.Clear		
				    Else
					    'Update Logging
					    objfileOutput.WriteLine(sUserLDAPPath & OUTPUT_DELIMITER & fAddedFMA & OUTPUT_DELIMITER & fAddedSendAs)		
				    End If
			    End If
		    End If

		    Set objUser = Nothing
		    Set objSDNTsecurity = Nothing
		    Set objDACLNT = Nothing
		    Set objDACLEX = Nothing
		    Set objSDMailBox = Nothing

		    If (fOneError = True) Then
			    WScript.StdOut.Write("!")
		    Else
			    WScript.StdOut.Write(".")
		    End If
        End If
	Loop

Set rootDSE = Nothing
Set objCommand = Nothing
Set objconn = Nothing

End If

If (cScriptMode = MODE_REMOVE) Then
	'Retreive the granted user from the first line of import file
	sGrantedUser = objfileImport.ReadLine
	If (IsValidUserName(sGrantedUser) = False) Then
		WScript.StdOut.WriteLine("Invalid User in import file. please check import file..")
		objfileError.WriteLine("Invalid User in import file. please check import file..")
		WScript.Quit
	End If
	
	Do While objfileImport.AtEndOfStream <> True
		fOneError = False
		sUserLDAPPath = EMPTYSTRING
		fAddedFMA = False
		fAddedSendAs = False
		fRemovedFMA = False
		fRemovedSendAs = False
		err.Clear

		sOneRow = objfileImport.ReadLine
		sArraySplit = Split(sOneRow, OUTPUT_DELIMITER)

		'First column is Ldap path
		sUserLDAPPath = sArraySplit(0)
		'Second column is FullMailbox Permission
		fAddedFMA = sArraySplit(1)
		'Third column is SendAs
		fAddedSendAs = sArraySplit(2)

		Set objUser = GetObject(sUserLDAPPath)
		If (err.number <> 0) Then
			objfileError.WriteLine("Failed to get user object from " & sUserLDAPPath)
			objfileError.WriteLine("Error: " & err.Description)
			fOneError = True
			err.Clear
		End If
		
		If ((fOneError = False) And (fAddedFMA = "True")) Then		
			Set objSDMailBox = objUser.MailboxRights
			Set objDACLEX = objSDMailbox.DiscretionaryAcl
			fRemovedFMA = RemoveFullMailboxAccess(objDACLEX, sGrantedUser)
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to Remove Full MailboxAccess from " & sUserLDAPPath)
				objfileError.WriteLine("Error: " & err.Description)
				fOneError = True
				err.Clear
			End If
			
			If (fRemovedFMA = False) Then
				objfileError.WriteLine("Couldn't find Full mailbox access permission on " & sUserLDAPPath)
			End If
			
			If ((fOneError = False) And (fRemovedFMA = True)) Then
				objSDMailbox.DiscretionaryAcl = objDACLEX
				objUser.MailboxRights = Array(objSDMailbox)
			End If
		End If

		If ((fOneError = False) And (fAddedSendAs = "True")) Then		
			Set objSDNTsecurity = objUser.ntSecurityDescriptor
			Set objDACLNT = objSDNTsecurity.DiscretionaryAcl

			fRemovedSendAs = RemoveSendAs(objDACLNT, sGrantedUser)
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to Remove SendAs from " & sUserLDAPPath)
				objfileError.WriteLine("Error: " & err.Description)
				fOneError = True
				err.Clear
			End If

			If (fRemovedSendAs = False) Then
				objfileError.WriteLine("Couldn't find SendAs permission on " & sUserLDAPPath)
			End If
			
			If ((fOneError = False) And (fRemovedSendAs = True)) Then
				objSDNTsecurity.DiscretionaryAcl = objDACLNT
				objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
				objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
			End If
		End If

		If ((fOneError = False) And (fRemovedFMA Or fRemovedSendAs)) Then
			objUser.SetInfo
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to update ADSI for user: " & sUserLDAPPath)
				objfileError.WriteLine("Error: " & err.Description)
				fOneError = True
				err.Clear		
			Else 
				If ( fRemovedFMA Or fRemovedSendAs ) Then
					'Update Logging
					objfileError.WriteLine("Removed Permission from " & sUserLDAPPath & OUTPUT_DELIMITER & fRemovedFMA & OUTPUT_DELIMITER & fRemovedSendAs)
				End If
			End If
		End If

		If (fOneError = True) Then
			WScript.StdOut.Write("!")
		Else
			WScript.StdOut.Write(".")
		End If
	Loop
End If

CloseImportexportFiles

Function IsValidUserName (sUserName)
	Dim dPosition
	dPosition = InStr(1, sUserName, "\")
	If (dPosition = 0 ) Then
		IsValidUserName = False
		objfileError.WriteLine("Invalid User:" & sUserName)
	Else
		IsValidUserName = True
	End If
End Function

Function CheckSendAs (objNTSD, sUser, fSendAs, AccessType)
	Dim intACECount
	Dim objACE
	
	err.Clear
	fSendAs = False
	AccessType = ADS_ACETYPE_ACCESS_ALLOWED
	intACECount = objNTSD.AceCount

	If intACECount Then
		For Each objACE In objNTSD
			err.Clear
			If ( (UCase(objACE.Trustee) = UCase(sUser)) And (objACE.ObjectType = EX_MB_SEND_AS_GUID) ) Then
				fSendAs = True
				AccessType = objACE.AceType
			End If
		Next
	End If	

	If (err.number <> 0) Then
		objfileError.WriteLine("Check SendAs permissions Failed : " & sUser)
		objfileError.WriteLine("Error: " & err.Description)
		err.Clear
		fOneError = True
	End If
	Set objACE = Nothing
End Function

Function CheckFullMailboxAccess (objACL, sUser, fFoundFMA, AccessType)
	Dim intACECount
	Dim objACE

	err.Clear
	fFoundFMA = False
	AccessType = ADS_ACETYPE_ACCESS_ALLOWED
	intACECount = objACL.AceCount
	If intACECount Then
		For Each objACE In objACL
			If ( (UCase(objACE.Trustee) = UCase(sUser)) And ((objACE.AccessMask And EX_FULLMAILBOX_ACCESSMASK) <> 0)) Then
				fFoundFMA = True
				AccessType = objACE.AceType
			End If
		Next
	End If

	If (err.number <> 0) Then
		objfileError.WriteLine("Check FullMailbox permissions Failed : " & sUser)
		objfileError.WriteLine("Error: " & err.Description)
		err.Clear
		fOneError = True
	End If
	Set ObjACE = Nothing
End Function

Function RemoveSendAs (objNTSD, sUser)
	Dim intACECount
	Dim objACE
	Dim fFound
	
	fFound = False
	intACECount = objNTSD.AceCount
	
	If intACECount Then
		For Each objACE In objNTSD
			If ((UCase(objACE.Trustee) = UCase(sUser)) And (objACE.ObjectType = EX_MB_SEND_AS_GUID) ) Then
				objNTSD.RemoveAce objACE
				fFound = True
			End If
		Next
	End If

	RemoveSendAs = fFound		
End Function

Function RemoveFullMailboxAccess (objACL, sUser)
	Dim intACECount
	Dim objACE
	Dim fFound
	
	fFound = False
	intACECount = objACL.AceCount
	
	If intACECount Then
		For Each objACE In objACL
			If((0 <> Instr(UCase(objACE.Trustee), UCase(sUser))) And (objACE.AccessMask And EX_FULLMAILBOX_ACCESSMASK) <> 0) Then
				objACE.AccessMask = (objACE.AccessMask Xor EX_FULLMAILBOX_ACCESSMASK)
				fFound = True
			End If
		Next
	End If

	RemoveFullMailboxAccess = fFound		
End Function

Function GetLDAPPathFromLegacyDN (sLegacyDN)
	Dim rsUsers
	Dim sLdapPath
	
	objCommand.CommandText = "<GC://" & sDomainContainer & ">;(&(&(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=user)(legacyExchangeDN=" & sLegacyDN & ")) ))));adspath;subtree"
	objCommand.Properties("searchscope") = ADS_SCOPE_SUBTREE
	objCommand.Properties("Page Size") = 10
	objCommand.Properties("Timeout") = 30 
	objCommand.Properties("Chase referrals") = (ADS_CHASE_REFERRALS_SUBORDINATE Or ADS_CHASE_REFERRALS_EXTERNAL)

	err.Clear	
	Set rsUsers = objCommand.Execute
	If (err.number <> 0) Then
		objfileError.WriteLine("Search for mailbox owners failed, error:" & err.Description)
		fOneError = True
	End If
	
	If (rsUsers.RecordCount = 0) Then
		objfileError.WriteLine("No mailbox owner user accounts found for " & sLegacyDN & " in " & sDomainContainer & ".")
		fOneError = True		
	End If

	If (rsUsers.RecordCount > 1) Then
		objfileError.WriteLine("Multiple mailboxs owner user accounts found for " & sLegacyDN & " in " & sDomainContainer & ".")
		fOneError = True		
	End If

	sLdapPath = Replace(rsUsers.Fields(0).Value, "GC://", "LDAP://")	
	GetLDAPPathFromLegacyDN = sLdapPath
	Set rsUsers = Nothing
End Function

Function CloseImportexportFiles

	objfileError.WriteLine("*******************************************************")
	objfileError.WriteLine("End at " & Date & " " & Time)
	objfileError.WriteLine("*******************************************************")

	objFSO.Close
	objfileError.Close
	objfileOutput.Close
	objfileImport.Close
	
	Set objFSO = Nothing
	Set objfileError = Nothing
	Set objfileOutput = Nothing
	Set objfileImport = Nothing
End Function

Function CreateImportExportFiles
	Dim sErrorsFileName
	Dim sImportFileName
	Dim sOutputFileName

	err.Clear
	Set objFSO = CreateObject("Scripting.FileSystemObject")
	sErrorsFileName = ERROR_FILENAME
	sImportFileName = EMPTYSTRING
	sOutputFileName = EMPTYSTRING

	Select Case cScriptMode
		Case MODE_ADD
			sImportFileName = WScript.Arguments(ARG_INDEX_FILENAME)
			sOutputFileName = OUTPUT_FILENAME
		Case MODE_REMOVE
			sImportFileName = OUTPUT_FILENAME 'Use output file name as import file
			sOutputFileName = EMPTYSTRING	
		Case Else
			DisplaySyntax
	End Select

	Set objfileError = objFSO.OpenTextFile(sErrorsFileName, ForAppending, True, TristateTrue)
	objfileError.WriteLine("*******************************************************")
	objfileError.WriteLine("Start at " & Date & " " & Time)
	objfileError.WriteLine("*******************************************************")

	If (cScriptMode = MODE_REMOVE) Then
		Set objfileImport = objFSO.OpenTextFile(sImportFileName, ForReading, False, TristateTrue)
	Else
		Set objfileImport = objFSO.OpenTextFile(sImportFileName, ForReading, False, TristateFalse)
	End If

	If (sOutputFileName <> EMPTYSTRING) Then
		'Check if output file already exists.
		If (objFSO.FileExists(sOutputFileName)) Then
			Set objfileOutput = objFSO.OpenTextFile(sOutputFileName, ForReading, False, TristateTrue)
			sOneRow = objfileOutput.ReadLine
			'If user name in the file is different from parameter, we can't proceed.
			If ( sOneRow <> sGrantedUser ) Then
				WScript.StdOut.WriteLine("The Domain\User must be the same as " & sOneRow )
				WScript.Quit
			End If
			Set objfileOutput = objFSO.OpenTextFile(sOutputFileName, ForAppending, True, TristateTrue)
		Else
			Set objfileOutput = objFSO.OpenTextFile(sOutputFileName, ForWriting, True, TristateTrue)
			'The first line of Log file is the user who is going to be granted the permissions
			objfileOutput.WriteLine(sGrantedUser)
		End If
	End If
	
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to open Log file, error:" & err.Description)
		WScript.Quit
	End If
End Function

Function AddAce(dacl, TrusteeName, gAccessMask, gAceType, gAceFlags, gFlags, gObjectType, gInheritedObjectType)
	Dim Ace1
	
	Set Ace1 = CreateObject("AccessControlEntry")
	Ace1.AccessMask = gAccessMask
	Ace1.AceType = gAceType
	Ace1.AceFlags = gAceFlags
	Ace1.Flags = gFlags
	Ace1.Trustee = TrusteeName
	'Determine whether ObjectType has to be set
	If CStr(gObjectType) <> "0" Then
		Ace1.ObjectType = gObjectType
	End If

	'Determine whether InheritedObjectType has to be set.
	If CStr(gInheritedObjectType) <> "0" Then
		Ace1.InheritedObjectType = gInheritedObjectType
	End If
	dacl.AddAce Ace1

    Set Ace1 = Nothing
End Function

Function DisplaySyntax
	WScript.StdOut.WriteLine("Syntax:")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Grant Full mailbox access and SendAs permission to USER based on IMPORT_FILE:")
	WScript.StdOut.WriteLine("    CSCRIPT " & WScript.ScriptName & " -Add DOMAIN\USER IMPORT_FILE")
	WScript.StdOut.WriteLine("    NOTE: """ & OUTPUT_FILENAME & """ will be created for -Remove option ")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Remove Full mailbox access and SendAs permission based on " & OUTPUT_FILENAME & ":")
	WScript.StdOut.WriteLine("    CSCRIPT """ & WScript.ScriptName & """ -Remove ")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("For all modes, errors are saved to " & ERROR_FILENAME )

	WScript.Quit	
End Function

修訂

摺疊此表格展開此表格
版本日期變更
1.02007 年一月 11 日原始版本
2.02007 年一月 12 日編輯的變更
3.02007 年二月 07 日完整的文件重新寫入
3.12007 年二月 08 日更新的下載中心 URL
3.22007 年二月 08 日編輯的變更
4.02007 年二月 9 日新增新的資訊,有關會議空間衝突
4.12007 年二月 12 日新增的 Exchange 2003 企業版以 「 適用於 」 一節
4.22007 年二月 12 日已更正的印刷錯誤
4.32007 年二月 12 日更正附註中的步驟編號
5.02007 年二月 13 日< 如何安裝 Exchange 工具 > 一節中的新增的虛擬機器資訊
6.02007 年二月 15 日"比預期稍後出現提醒 」 一節的重新寫入
7.02007 年二月 15 日虛擬機器為 Microsoft Exchange 行事曆更新工具套件的新增的下載資訊
8.02007 年二月 16 日Exchange 系統管理工具 」 怎麼辦才能執行 [Exchange] 工具 」 區段中的新增的資訊。
8.12007 年二月 19 日修正 「 如何執行 Msextmzcfg.exe 」 一節中的檔名
8.22007 年二月 20 日User_Name 和 File_Name 授與信箱權限 」 指令碼一節中的之間新增的空格
9.02007 年二月 20 日發行項的重新寫入
10.02007 年二月 20 日內部中繼資料更新
10.12007 年二月 20 日已更正的印刷錯誤
10.22007 年二月 20 日已更正的印刷錯誤
10.32007 年二月 20 日已更正的印刷錯誤
10.42007 年二月 21 日已更正的印刷錯誤
11.02007 年二月 22 日版本 2 Exchange 工具的額外的資訊
11.12007 年二月 22 日已更正的印刷錯誤
11.22007 年二月 23 日加入的資料表來指示文件修訂
12.02007 年二月 26 日事件記錄檔空間和錯誤訊息和這些錯誤的解決方式的加入的資訊的額外的資訊
13.02007 年二月 27 日已移除的下載 URL 虛擬機器資訊和 933185 加入交互參照
14.02007 年二月 28 日已知問題] 區段中變更文字中第一個項目符號包括 KB926666
15.02007 年二月 27 日新增的虛擬機器資訊
16.02007 年二月 28 日加入有關的資訊在最新 Hotfix 的時區資料更新工具,為 Microsoft Office Outlook (Tzmove.exe) 以"對於直接預約"區段。新增交互參照至 933146
16.12007 年二月 28 日更正表格標籤
17.02007 年三月 01 日已移除的 Exchange Server 5.5 資訊
18.02007 年三月 5 日rewrote 修訂表格
19.02007 年三月 08 日HRTestMailboxAccess 」 錯誤訊息的已加入的資訊
19.12007 年三月 13 日在會議邀請中移除重複的段落,關於受邀者的數目
19.22007 年三月 19 日已更新的修訂表格
19.32007 年三月 21 日「 關於 [Exchange] 工具 」 一節中的已移除的虛擬機器資訊
19.42007-03-四月更新的簡介區段
19.52007 年八月 4 日更新的標題
21.02007 年九月 06 日關於使用較新的工具的發行項 941018 新增的資訊
21.12007 年九月 07 日移除過時的知識庫文章連結。

屬性

文章編號: 930879 - 上次校閱: 2008年1月15日 - 版次: 22.2
這篇文章中的資訊適用於:
  • Microsoft Exchange Server 2007 Enterprise Edition
  • Microsoft Exchange Server 2007 Standard Edition
  • Microsoft Exchange Server 2003 Enterprise Edition
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange 2000 Server Standard Edition
關鍵字:?
kbmt kbhowto kbresolve kbexpertiseinter kbinfo KB930879 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:930879
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com