使用者將無法傳送電子郵件訊息,從行動裝置或共用的信箱在 Exchange 2000 Server 和 Exchange Server 2003

文章翻譯 文章翻譯
文章編號: 912918 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當您嘗試在 Microsoft Exchange 傳送電子郵件2000 伺服器或在 Microsoft Exchange Server 2003 中,您無法傳送電子郵件訊息。此外,您可能會收到下列錯誤訊息之一,或其中一個下列的未傳遞報告 (Ndr)。

錯誤訊息

  • 存取被拒
  • 您沒有足夠的權限若要執行這項操作在此物件上。連絡資料夾連絡人或您的系統,請參閱系統管理員。
  • 未列出的訊息錯誤
  • MAPI_E_NO_ACCESS為 2147024891
  • 無法送出的郵件訊息使用者的使用者名稱 (HRESULT: 為 2147024891) Pausing 使用者的使用者名稱。(安全性錯誤-無法存取使用者信箱)。
  • 資源不找到
附註您會收到 「 拒絕存取 」 錯誤訊息或 「 資源當您登入為 Microsoft Outlook Web Access 找不到 」 的錯誤訊息委派的帳戶。

Ndr

  • 您並沒有對此收信人所傳送的權限。針對若需協助,請連絡您的系統管理員。
  • 無法使用您的信箱傳送郵件。您執行動作沒有要傳送的郵件指定的使用者的身份的權限。

受影響的產品

這個問題已知會影響下列協力廠商產品:
  • 在 [影片 (邊緣) BlackBerry 企業伺服器 (BES) 的參考資料
  • 良好的技術 GoodLink 無線通訊
這個問題可能也會影響自訂 MAPI 或共同作業的資料物件 (CDO)-傳送電子郵件訊息的程式。

其他也可以使用服務帳戶來傳送電子郵件的協力廠商產品會受到影響。如果您正在執行協力廠商產品受到這我們的問題,建議您連絡廠商,協助您解決這樣的問題。

不過,我們已經確認,下列的協力廠商產品不會受到這個問題:
  • Cisco 凝聚力的統一訊息
  • 交換任務遷移套件
  • 交換 Microsoft ExMerge 公用程式

發生的原因

如果下列情形之一時,可能會發生這個問題true:
  • 您沒有權限,來傳送電子郵件訊息中的,以您用來傳送電子郵件的帳戶中的信箱擁有者訊息。
  • 您正在執行 Microsoft Exchange 2000 伺服器服務封包3 (SP3) 加上的 Store.exe 檔案版本等於或晚於版本6619.4。 版本 6619.4 第一次均能使用下列的 Microsoft 中知識庫文件:
    915358 Hotfix 是可用來變更 「 完整信箱存取權限,在 Exchange 2000 Server 中的行為
  • 您正在執行 Microsoft Exchange Server 2003 SP1,加上等於或晚於版的 Store.exe 檔案版本7233.51。
  • 您正在執行 Exchange Server 2003 SP2,加上 Store.exe等於或晚於版本 7650.23 的檔案版本。版本 7650.23第一次均能使用下列 Microsoft 知識庫 」 中文件:
    895949 「 以下列傳送 」 權限行為變更在 Exchange 2003
    這項變更不是隨附於 Exchange Server 2003 SP2。如果您有執行 Exchange Server 2003 SP1 的 Store.exe 檔案版本,其中包含這項變更,而且您升級至 Exchange Server 2003 SP2,您必須安裝此 hotfix,若要保留新的行為的 SP2 版本。這項變更將會包含在 Microsoft Exchange Server 2003 SP3。

安全性弱點的影響

前面所示的 Store.exe 檔案版本"會使"區段中,授與隱含授與完整信箱存取權限若要以信箱擁有者傳送的使用權限。這表示該另一個帳戶具有完整權限者還可以傳送電子郵件的信箱存取如同他們所送出的信箱擁有者。

許多 Microsoft Exchange客戶所要求的 「 以下列傳送 」 權限加以區隔完整信箱存取 」 權限,兩個原因如下:
  • 若要防止電子郵件詐騙。
  • 將以確定這些電子郵件所傳送的郵件委派永遠都能清楚劃分所傳送的電子郵件訊息由實際信箱擁有者。
現在將所有的新版本的 Exchange 儲存區明確地要求 「 以下列傳送 」 權限來傳送電子郵件訊息中的,以信箱擁有者。但是下, 面列出這三個例外情形需求:
  • 信箱擁有者帳戶不需要明確傳送 」對其本身信箱的權限。
  • 信箱關聯外部帳戶則否需要明確的 「 以下列傳送 」 權限。
  • 代理人帳戶,同時具有 「 完整信箱存取權限並不需要明確的 「 以下列傳送 」 權限。
如需有關這些例外狀況的詳細資訊,請參閱 「 更多資訊 〉 一節。

解決方案

授與信箱,除了 〈 原因 〉 一節中所提到的部分或完整存取所有的帳戶必須現在被明確授與 「 以下列傳送 」 權限為信箱擁有者帳戶以信箱擁有者身分傳送郵件。這包括執行這類的行動裝置使用者傳送電子郵件功能的應用程式服務帳戶。

「 以下列傳送 」 權限套用至 Active Directory 使用者物件,不會儲存在資料庫中的信箱內容的識別。因此,必須授與擁有信箱之每個使用者物件上的服務帳戶 「 以下列傳送 」 權限。當電子郵件傳送時,不會傳送來自特定信箱或資料庫中,而是從使用者。使用者可能會是信箱擁有者或任何其他的帳戶具有 「 以下列傳送 」 權限。

您不能授與 「 傳送 」 權限執行 Exchange Server 的伺服器或資料庫物件上,並授與 「 以下列傳送 」 權限之資料庫中的所有信箱的效果。授與 「 以下列傳送 」 權限在 Exchange 資料庫物件上的,授予您權限資料庫本身。在資料庫中的所有信箱都繼承的權限。不過,它並不提供的使用者擁有傳送 」 權限,以及誰擁有在資料庫中的信箱的權限。

附註授與 「 以下列接收 」 權限在 Exchange 資料庫是功能上等同授與所有的完整信箱存取權限在資料庫中的信箱。這點不同於 [傳送的行為與的使用權限。

如何授與 「 以下列傳送 」 權限的帳戶

若要明確地授與另一個帳戶的權限,來為信箱進行傳送擁有者,請依照下列步驟執行:
  1. 啟動 [Active Directory 使用者和電腦管理]主控台。
  2. 在上 檢視 功能表中,請確定進階的功能 選取選項。如果沒有這個選項選取,[安全性] 頁面將不會顯示為使用者帳戶物件。
  3. 開啟擁有使用者帳戶的內容信箱。
  4. 按一下 安全性 索引標籤。
  5. 如果帳戶沒有出現在 [群組或使用者的清單名稱、 加入應該具有 「 以下列傳送 」 權限的帳戶使用者。
  6. 權限 方塊中,按一下 「 傳送為 」 允許 適當的帳戶的使用權限。
  7. 按一下 [確定].
  8. 在重新啟動 Microsoft Exchange 資訊儲存庫服務受影響的 Exchange 伺服器。
附註如果您不要重新啟動 Microsoft Exchange 資訊儲存庫Microsoft Exchange 資訊儲存庫服務將會更新服務,其若要建立新的快取的權限的權限才會生效,根據在下列登錄子機碼中設定的值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\ParametersSystem

數值名稱: 信箱快取保留限制
實值型別: 呼叫完成
基數: 十進位
數值資料: 信箱資訊快取歷時限制,以分鐘為單位.
此登錄項目的預設值為 120 分鐘 (兩個小時為單位)。如果您修改此登錄項目時,您必須重新啟動 MicrosoftExchange 資訊儲存庫服務。

附註如果您將逾時值設定為非常低的值時,貴用戶會影響伺服器的效能。

如何將授與 「 以下列傳送 」 權限多個帳戶

範例指令碼係依會搜尋使用中目錄服務網域帳戶具有 「 完整信箱存取權限,而 「 以下列傳送 」 權限信箱不這份文件的結尾。這些是將此安全性變更影響的服務或資源帳戶的特性。此指令碼可以產生一個匯出檔案,您可以檢閱、 編輯及再重新匯入以授與 「 以下列傳送 」 權限給需要此權限的帳戶。

您也可以使用以繼承在 Active Directory 網域中,或在容器中的每個使用者物件上授與 「 以下列傳送 」 權限。如果您授與這個方法以下列傳送 」 權限,您可能會授與不是您所屬意的物件的權限。此外,您可能會遺失從容器移動物件的權限。因此,這個方法不建議您使用,並仔細考慮之前加以實作的安全性疑慮。

如果您授與傳送 」 權限使用這種方法,卻繼承 「 以下列傳送 」 權限的帳戶將變得不可見於指令碼所參考的文件結尾。若要在稍後使用指令碼來處理這些帳戶,您必須先移除繼承的傳送 」 權限。

使用繼承來授與 「 以下列傳送 」 權限的單一帳戶在 Active Directory 網域或容器中的所有使用者帳戶,請依照下列步驟執行:
  1. 啟動 [Active Directory 使用者和電腦管理]主控台。
  2. 在上 檢視 功能表中,請確定進階的功能 選取選項。如果沒有這個選項選取,[安全性] 頁面將不會顯示網域和容器物件。
  3. 開啟網域或容器的內容,然後按一下 [安全性] 頁面。
  4. 按一下 進階.
  5. 如果未列出所需的權限的帳戶,按一下 新增綴恁寁帳戶。否則,連按兩下編輯的帳戶。
  6. 會套用到 清單中按一下使用者物件.
  7. 授與 「 傳送 」 權限的帳戶。
  8. 按一下 [確定] 直到您會結束並儲存所有的變更。

特殊的規則 adminSDHolder 的受保護的帳戶

如果您要授與 「 以下列傳送 」 權限,同時也是網域系統管理員的信箱擁有者使用指令碼,以下列傳送 」 權限將不會生效。我們強烈建議您並不啟用信箱的使用者帳戶具有網域系統管理員權限,或為 adminSDHolder 保護。

AdminSDHolder物件是具備廣泛的 Active Directory 系統管理權限的帳戶的範本。若要防止意外的提升權限,都會受到adminSDHolder物件的任何帳戶必須有權限,以符合對adminSDHolder物件本身所列示的。

如果您變更權限,或是為受保護的帳戶adminSDHolder物件的權限,背景工作將會復原幾分鐘的時間內變更。比方說,如果您授與 「 以下列傳送 」 權限的應用程式服務帳戶的網域系統管理員物件上時,背景工作將自動撤銷這個權限。

因此,您不能授與 「 以下列傳送 」 權限的帳戶,除非您變更 [ adminSDHolder物件本身,都會受到adminSDHolder物件的應用程式服務帳戶。如果您變更adminSDHolder物件,將會變更所有受保護的帳戶的存取權限。才應該變更adminSDHolder物件之後全面性的檢討,安全性的問題,可能會發生這項變更。

若要將信箱與帳戶相關聯,相對受到影響由adminSDHolder物件,請依照下列步驟執行:
  1. 啟動 [Active Directory 使用者和電腦管理]主控台。
  2. 在上 檢視 功能表中,請確定進階的功能 選取選項。如果沒有這個選項選取,[安全性] 頁面將無法看到,User 帳戶物件。
  3. 建立一般使用者帳戶做為信箱擁有人。
  4. 指定一般使用者帳戶在 Exchange 上的信箱伺服器。
  5. 開啟新的信箱擁有者帳戶的內容。
  6. 進階的交換 方塊中,授與完整信箱存取 」 權限給受保護的系統管理員帳戶。
  7. 在 [安全性] 頁面上,授與 「 以下列傳送 」 權限給受保護的系統管理員帳戶。
  8. 按一下 [確定] 若要結束的屬性信箱擁有者物件。
  9. 信箱擁有者帳戶物件中,按一下滑鼠右鍵,然後按一下 停用帳戶 若要停用的所有登入帳戶。
如需有關 adminSDHolder 保護帳號],按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
907434「 傳送為 」 權限已經移除了使用者物件後,您設定的 「 傳送為 」 權限的 Active Directory 使用者和電腦] 嵌入式管理單元在 Exchange Server
318180 AdminSDHolder 執行緒會影響可轉移的通訊群組的成員
817433 委派權限無法使用而繼承會自動停用
306398 AdminSDHolder 物件會影響過去的系統管理員帳戶的控制權的委派

為 BlackBerry 的企業伺服器的特殊工作

任務 1: 請確定 BlackBerry 企業伺服器正在執行另一個且唯一的帳戶

請確定 BlackBerry 企業伺服器正在執行為區隔系統管理工作特別建立的帳戶。藉由預設值,這個帳戶就稱為"BESAdmin"。

如果您有不同的負責管理 BlackBerry 企業伺服器,請移至工作 2。

如果您並沒有個別的帳戶,建立個別的帳戶。然後,使用這個帳戶來執行系統管理工作。如需有關如何執行這項操作,如果您正在執行 BlackBerry 企業伺服器 4.0 或 BlackBerry 企業伺服器 4.1 的指示,請參閱 BlackBerry 企業伺服器安裝指南。如需如何執行此資料庫,如果您正在執行 BlackBerry 企業伺服器 3.6,請參閱入門指南 》 與 BlackBerry 企業 Server 2000/2003年的安裝。

任務 2: 請確定 BlackBerry 企業 Server 服務帳號有適當的權限

檢查有 BlackBerry 企業 Server 服務帳號適當的權限。

附註如果帳戶是網域中,請確定帳戶是只有網域使用者群組的成員。在網域控制站,該帳戶應該是內建系統管理員群組的成員。
  1. 在 BlackBerry 企業伺服器上,請依照下列步驟執行:
    1. 請確定帳戶是本機的成員系統管理員群組。
    2. 指派 「 本機登入 」 和 「 以服務方式登入 」帳戶的權限。
  2. 在授與 Exchange View-Only 系統管理員權限系統管理群組層級。執行這項操作,請依照下列步驟執行:
    1. 在 Exchange 系統管理員,滑鼠右鍵按一下第一個Exchange Server 系統管理群組名稱],然後按一下 委派控制項.
    2. 請注意,「 BlackBerry 企業伺服器 」 服務帳戶會列為具有 Exchange View-Only 系統管理員的角色。
  3. 授與 「 以下列傳送,"「 接收 」 和 「 管理資訊伺服器層級的每一部 Exchange 伺服器的存放區 」 權限。若要這點,請依照下列步驟執行:
    1. 在 Exchange 系統管理員,滑鼠右鍵按一下第一個Exchange Server 系統管理群組名稱,然後再展開 伺服器 群組。
    2. 以滑鼠右鍵按一下 Exchange 伺服器,請按一下 屬性然後按一下 安全性.
    3. 在 [在上方窗格中,選取 [BlackBerry 企業Server 服務帳號。在下方窗格中,請確定 「 傳送 」、 「「 接收 」 和 「 管理資訊儲存庫 」 權限設定為 允許.
    4. 對每個 Exchange 重複步驟 3b 」 和 「 3 c伺服器。
  4. 授與 「 以下列傳送,"「 接收 」 和 「 管理資訊信箱儲存區存放區 」 的權限。執行這項操作,請依照下列步驟執行:
    1. 在 Exchange 系統管理員,滑鼠右鍵按一下第一個交換系統管理群組名稱,然後展開 伺服器 群組。
    2. 展開 [第一個信箱儲存區群組],以滑鼠右鍵按一下每個信箱儲存區中,按一下 屬性然後按一下 安全性.
    3. 在 [在上方窗格中,選取 [BlackBerry 企業Server 服務帳號。在下方窗格中,請確定 「 傳送 」、 「「 接收 」 和 「 管理資訊儲存庫 」 權限設定為 允許.
    4. 每個各信箱存放區重複步驟 4b 和 4 的 cExchange 伺服器。
  5. 在 [Active Directory 使用者和電腦] 嵌入式管理單元,請遵循下列步驟進行:
    1. 以滑鼠右鍵按一下您想要新增的使用者權限,然後再按一下 屬性.
    2. 在上 安全性 索引標籤上,新增BlackBerry 企業伺服器服務帳戶,然後再按一下以選取 將以傳送 核取方塊。
如果您沒有執行 Exchange Server 2003年,請參閱任務 3。

任務 3: 清除 BlackBerry 企業伺服器上的快取

若要清除的權限中的快取 Exchange 儲存區,請重新啟動Blackberry 相關的服務,然後再重新啟動 Microsoft Exchange 資訊存放區。在您之後重新啟動 Exchange 儲存區,您必須重新啟動緣 Blackberry 相關的服務,以授與剛新增傳送 」 的"BESAdmin"帳戶在 Exchange 儲存區上的使用權限。

其他相關資訊

Exchange 信箱及資料夾存取權限會被分割之間 Active Directory 及 Microsoft Exchange 資料庫。不過,這兩種類型權限會設定在 [Active Directory 使用者管理] 主控台中,但是不同的權限會儲存在兩個不同的位置。

一般而言,如果物件的 [安全性] 頁面上設定使用權限,它是作用中目錄的使用權限。若設在 [Exchange 進階信箱權限。頁面上,它是 Exchange 資料庫的權限。

MsExchMailboxSecurityDescriptor Active Directory 屬性是子集的一份有效的信箱權限。它用於內部 exchange 的用途。此外, msExchMailboxSecurityDescriptor屬性會更新以符合目前的有效權限,如果系統管理員會使用支援的介面,來指定權限。不過,如果msExchMailboxSecurityDescriptor屬性是由系統管理員,所做的變更直接修改將不會傳播到 Exchange 儲存區,以及所做的變更將不會效果。無法保證與實際信箱權限進行同步處理。您不應該使用msExchMailboxSecurityDescriptor屬性讀取或寫入信箱權限。
如需詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
310866如何在資訊儲存庫中存在的信箱設定 Exchange Server 2003年與 Exchange 2000 伺服器的信箱權限

「 完整信箱存取 」 權限會Exchange 資料庫儲存區的權限。「 以下列傳送 」 權限是作用中目錄的使用權限。正在交換 Store.exe 檔案變更前本文所述,Exchange 系統並未諮詢的設定「 傳送 」 權限如果寄件者已經有完整信箱存取使用權限。

「 以下列傳送 」 權限和內含完整信箱存取 」 權限已啟用 Exchange 伺服器系統管理員可以授與自己在伺服器上任何信箱的有效 「 以下列傳送 」 權限,所管理。藉由區隔 「 以下列傳送 」 權限從 「 完整信箱存取權限,使用中目錄的系統管理員現在可封鎖這項程序,因為傳送 」使用權限是 Active Directory 使用權限,而且不 Exchange 儲存區使用權限。因此,處理程序不一定的控制之下Exchange 系統管理員。

信箱擁有者

信箱擁有者可視為 Active Directory 使用者帳戶其msExchMailboxGUID屬性提供全域唯一識別項 (GUID)針對特定的信箱。允許在整個樹系中的只能有一個帳戶執行特定信箱的 GUID。如果您嘗試將設定第二個擁有者相同的 GUID、 Active Directory 將拒絕含有錯誤的變更。

當您啟用信箱的帳戶,或當您連線已中斷連線Active Directory 帳戶的信箱,信箱 GUID 是自動地被設定在該帳戶。這並不需要或不建議系統管理員直接設定信箱的 Guid。

關聯的外部帳戶

常見的 Exchange 組態是安裝在交換資源樹系。資源樹系是在不同的樹系的樹系在系統中都有信箱的使用者帳號。這代表因為msExchMailboxGUID屬性只能在同一個樹系中的物件設定的問題Exchange 伺服器。

這個問題的解決方法是啟用信箱在 Exchange 伺服器樹系中的帳戶。然後,連結這擁有信箱功能其中一個 Microsoft Windows NT 4 網域或另一個樹系中的帳戶。您可以藉由授與關聯的外部帳戶權限執行這項操作。只會有一個可以授與帳戶相關聯的外部帳戶權限。該帳戶也就是選取不同的樹系必須是。

當您設定 [關聯外部帳戶 」 權限,您正在撰寫外部的 SID 值帳戶以信箱擁有者的msExchMasterAccountSID屬性。因此,這不是權限,但便利的方式來控制msExchMasterAccountSID屬性的值。設定msExchMasterAccountSID屬性後,外部帳戶擁有 SID將被授與存取 Exchange 如同它是實際的信箱擁有者帳戶。

附註這只適用於 Exchange,不所有的存取權使用中目錄的存取。此外,您應該將標示信箱擁有者為已停用的帳戶進行登入之後您可以設定關聯的外部帳戶權限,這樣所有的權限為預期的。
如需詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
300456用戶端權限和委派不會保存在之後被指定在 Exchange 2000 中

委派案例

委派是已授與之部分存取權限的使用者另一個信箱與該信箱的身份傳送電子郵件訊息的權限擁有人。常見的委派案例是授與代理人存取主管的行事曆的行政助理。可以委派一般讀取和更新行事曆。此外,委派可以回覆給任何主管的身份的電子郵件訊息。

若要授與 「 傳送代理者 」 和代理人權限,您可以使用下列兩個介面:
  • 信箱擁有者,在物件上授與傳送代理者 」 權限在 [Exchange 一般] 對話方塊。
  • 在 Microsoft Office Outlook 中,使用 委派 對話方塊。
這兩種方式設定publicDelegates屬性的信箱。這個屬性中所列的所有使用者都擁有傳送代理者 」 信箱擁有者] 權限。當這類代理人傳送電子郵件訊息中具有 [主人的名字 方塊中,從委派,並不是從或信箱擁有者,會傳送電子郵件訊息。電子郵件訊息的 方塊會顯示下列值:
代理人的名稱> 的身份信箱擁有者>
在某些情況下,您可能無法在 Outlook 中設定publicDelegates屬性。 如需詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
329622您委派存取在 Outlook 中的之後未"代表傳送 」 權限指派給使用者

如果您委派權限授予您的信箱,委派可以使用傳送代理者 」 權限,即使您並不權限授予其中一個信箱資料夾。委派具有基本權限是傳送代理者 」 權限。若要存取您的信箱資料夾的權限是分開,除了委派權限必須被授與。一般而言,委派會使用 Outlook,若要存取個別的您提供它們的權限的資料夾。若要這樣做,請按一下 開啟 在上 檔案 在 Outlook,然後再按一下功能表 其他使用者的資料夾.

或者,委派可以開啟您的信箱列為額外信箱中 進階 其 Outlook 設定檔] 索引標籤。這個方法會使您委派的 Outlook 資料夾樹狀目錄中出現的信箱。此外,這個方法可為其信箱中的所有資料夾的存取權已授與代理人的權限。

您可能會想要代理人有時候擁有的權限的身份傳送,而有時具有傳送 」 權限。若要設定代理人擁有這兩個權限中,請遵循下列步驟進行:
  • 授與代理人 「 完整信箱存取 」 權限。這無法透過 Outlook 執行。相反地,Active Directory 管理員必須信箱擁有者帳戶上執行這項操作。即使您上授與擁有者權限在您的信箱,不是為完整的同一權限的每一個資料夾信箱存取 」 權限。
  • 請勿授與代理人 「 以下列傳送 」 權限。如果您授與代理人 「 傳送 」 權限,就會傳送的所有電子郵件訊息委派和 「 以下列傳送 」 權限不會完成。該代理人將沒有永遠無法使用傳送代理者 」 權限。
在這個案例中,想要使用 「 傳送代理者 」 權限的代理人應該登入他們自己的信箱。如果您的委派回覆或轉寄電子郵件訊息中的其中一個現有的程式資料夾,電子郵件訊息自動將會在您的身份傳送。如果代理人替您建立新的電子郵件,則他們必須輸入您的姓名在 若要傳送的電子郵件訊息] 方塊中您代表。

不論代理人是否已開啟您的資料夾所有的電子郵件訊息都整個信箱為次要信箱,或從您的傳送會使用傳送代理者 」 只要他們自己的權限信箱是目前 Outlook 設定檔的主要信箱。

當代理人想要為您傳送電子郵件、 他們應該登入到您藉由使用不同的 Outlook 設定檔會開啟您的信箱的信箱。電子郵件代理人傳送到此設定檔登入的郵件會自動傳送您的。

找出具有 「 完整信箱存取權限,而不需以下列傳送 」 權限的帳戶

這一節中所描述的範例指令碼可以搜尋一一次的使用者帳戶的 active Directory 網域中完整的信箱已授與 「 以下列傳送 」 權限沒有信箱存取 」 權限。

重要您變更權限之前,請參閱"關於信箱擁有者和代理人"一節。

指令碼有下列三種模式:
  • 匯出您可以輸出具有完整信箱存取權限的使用者清單權限,但沒有 「 傳送 」 權限。您可以檢閱這份清單中[記事本] 或移除不想讓任何帳戶的另一個編輯器「 以下列傳送 」 權限。
  • 匯入您可以匯入使用者具有完整信箱存取權限的清單收件者 「 以下列傳送 」 權限應同時授與的使用權限。請注意,您不能使用這個指令碼來授與 「 完整信箱存取權限,傳送 」 權限。每個帳戶都必須具有完整信箱存取若要授與 「 以下列傳送 」 權限的使用權限。
  • SetAll您可以在網域中的所有使用者授與 「 以下列傳送 」 權限使用者已經擁有特定信箱的完整信箱存取權限。A在匯出檔案相同的格式,就會產生記錄檔。這是相當於執行而不需要編輯的匯出與匯入模式匯出檔案。
附註在這段指令碼中沒有復原的函式。

所需的指令碼的權限

當您使用登入時,您必須執行指令碼來自相同的系統管理帳戶樹系的信箱擁有者帳戶是來自。指令碼可能不適用於具有的帳戶跨樹系系統管理權限。指令碼可能也無法運作時您從已加入不同的樹系與樹系的工作站上執行要聯結的信箱擁有者帳號。

提供這些條件下,您可以使用多個系統管理帳戶,在執行指令碼藉由使用RunAs.exe命令的單一登入工作階段。可能是這個程序如果您有分割 Active Directory 及 Exchange Server 權限而且您有沒有可以管理所有 Exchange 伺服器或全部的單一帳戶使用中目錄的網域。您可以開啟命令提示字元執行的指令碼為每個系統管理帳戶。請考慮下列的範例:
RunAs.exe /user:domain\account cmd.EXE
附註您不應該同時執行多份指令碼一個網域。

匯出檔案中的欄位所中當做如下所示。描述的欄位中出現的順序匯出檔案。
  • 信箱擁有者帳戶的顯示名稱

    可能有多個列的輸出檔列出相同的信箱擁有者。發生這個問題,當多個其他帳戶同一個信箱有完整信箱存取權限。
  • 網域和登入名稱具有 「 完整信箱存取 」 權限,但沒有 「 傳送 」 權限的帳戶

    相同的帳戶可能會多次出現在匯出檔案時的帳戶具有存取權多個信箱。這是可能是大小寫的應用程式服務帳戶或個人的人員管理多個資源信箱。
  • 顯示具有 「 完整信箱存取 」 權限,但沒有 「 傳送 」 權限的帳戶名稱

    這個欄位除了提供 登入名稱為了方便您識別該帳戶的欄位。
  • 信箱擁有者的委派狀態

    如果信箱擁有者有委派,此欄位值是已委派.如果信箱擁有者有沒有委派,此欄位值是 否委派.
  • 信箱擁有者帳戶的啟用或停用狀態

    此欄位非常有用,當您想要找出資源帳戶或跨樹系的信箱帳戶。一般來說,這些帳戶都是停用。
  • 信箱擁有者帳戶的完整辨別名稱

    這個欄位是很有用,當您想要識別網域和信箱擁有者帳戶的容器。
  • 信箱擁有者的信箱資料庫的完整辨別名稱

    這個欄位包含資料庫、 儲存群組伺服器及信箱的系統管理群組。
在下列範例中,具有使用者身分登入名稱"NoSendAs"具有 「 完整信箱存取 」 權限,但不是傳送 」「 信箱擁有者 」 信箱的權限:
"""信箱擁有者""""""Domain\NoSendAs""""""否傳送使用者身分""""""有委派""""""啟用"""[省略其他欄位]

系統管理工作站組態的指令碼。

此指令碼會使用 Exchange 管理介面來進行通訊與 Exchange 伺服器。因此,必須執行這個指令碼從交換伺服器或工作站與安裝 Exchange 系統管理員連絡。

編輯匯出檔案

匯出檔案的格式為 Unicode 純文字這樣的可容納從多種語言的字元集。有些文字編輯器可能無法正確地檢視或編輯該檔案,或可能會將檔案儲存為 ANSI或 ASCII 文字。Windows Server 2003、 Windows XP 中,與 Microsoft 「 記事本 」 公用程式Windows 2000 能夠正確地處理 Unicode 文字檔案。此外,Microsoft Office Excel 能夠正確地處理 Unicode 文字檔案。

輸出檔是以三倍以 tab 字元分隔的格式每個欄位值的引號。三重引號用來進行匯入和匯出更具有決定性的 Excel 中。在Excel 中,三重引號將會變得單引號括住,並將還原為檔案重新儲存為 Unicode 文字時,三重引號括起來。請參閱下列指示,正確地開啟和儲存匯出檔案中Excel。

您也可以不藉由使用 Excel 來篩選已匯出檔案「 Find.exe 」 公用程式或 「 Findstr.exe 」 公用程式。這些公用程式是Windows 包含。它們可讓您搜尋檔案中的關鍵字,只輸出包括或不包含的行這些單字。比方說,如果您想要製作一份清單中所有擁有代理人的信箱擁有者的檔案,使用兩個命令來建立檔案包含"Has Delegates"字串的行數:
Find.exe}"已委派 」 的 OriginalFile.txt > HasDelegates.txt

"已委派"Findstr.exe 時 OriginalFile.txt > HasDelegates.txt
另一個範例,假設您想要篩選出所有信箱擁有者和代理人。/V參數會輸出與搜尋文字不符的所有行。您可以的使用以下任一命令產生的檔案,不包括所有"有委派 」 的程式行:
Find.exe 「 沒有委派 」 OriginalFile.txt > NoDelegates.txt

Find.exe /V"已委派"OriginalFile.txt > NoDelegates.txt

Findstr.exe 時 「 無委派 」 OriginalFile.txt > NoDelegates.txt

"已委派"Findstr.exe /V 時 OriginalFile.txt > NoDelegates.txt
您也可以使用這些命令產生的檔案所列出的所有應用程式服務帳戶,擁有完整的帳戶信箱存取 」 權限,但並沒有 「 以下列傳送 」 權限。/I參數會讓命令不區分大小寫:
Find.exe /I"domain\ServiceAccount"OriginalFile.txt > ServiceAccount.txt

Findstr.exe /I 時"domain\ServiceAccount"OriginalFile.txt > ServiceAccount.txt
附註如果您使用 Find.exe 公用程式來產生篩選過的檔案時,您必須移除「 Find.exe 」 公用程式 」 會在檔案頂端建立標頭行。

執行使用萬用字元的檔案名稱 (1。 1) Findstr.exe 公用程式。如果您使用萬用字元的字元輸出檔中的每一行會依檔名檔案名稱為開頭。您應該您使用 Find.exe 篩選之後,請仔細檢查輸出檔或若要確認佔領您的篩選條件,或排除這些帳戶的 Findstr.exe,您目的。

在下列範例中,具有使用者身分登入名稱"NoSendAs"具有 「 完整信箱存取權限,但不是傳送 」「 信箱擁有者 」 信箱的權限。
"""Mailbox Owner""" """Domain\NoSendAs""" """No Send As User""" """Has Delegates""" """Enabled""" [additional fields omitted] 

關於擁有代理人的信箱擁有者

具有 「 完整信箱存取權限的代理人 (也就是「 超級 」) 通常不應該賦予 「 以下列傳送 」 權限。當超級直接到信箱擁有者的信箱,委派的記錄檔可以為擁有者傳送。當代理人使用 Outlook 的委派功能 (其他若要開啟的信箱開啟其他使用者的資料夾),擁有者的身份傳送郵件。

超級授與 「 以下列傳送 」 權限,只有當您想要一律以信箱擁有者身份進行傳送,並且絕不代表傳送的委派信箱擁有者。我們建議您搜尋文字"已在匯出檔案委派 」,然後決定是否任何一個超級代理人才,是列就是實際的信箱擁有者的委派。

只有超級代理人才會列在匯出檔案。一般代理人並不具有「 完整信箱存取權限。此外,當您授與 「 以下列傳送 」 權限以一般的代理人,委派會一直傳送與信箱擁有者。即使一般代理人不具有 「 完整信箱存取 」 權限,也是如此。如果您不要 Send As 權限授予給委派時您並不會想要您可以輕易地撤銷稍後在權限。

如何在 Excel 中開啟一個匯出檔案

  1. 開啟 [匯出檔案前,請啟動 Excel。
  2. 輸入文字檔案時,請在 Excel 中開啟的檔案。「 文字匯入精靈 」 會啟動。
  3. 在匯入字串精靈,變更或接受下列設定:
    • 原始資料型別: 分隔
    • 起始列號: 1
    • 檔案原始格式: Unicode (utf-8)
    • 分隔符號: 只有定位
    • 連續分隔符號視為單一:未標示
    • 文字辨識符號: 」 (加倍引號)

如何在您編輯此檔案,在 Excel 中的儲存匯出檔案

  1. 在 [匯出檔案中,按一下 另存成.
  2. 儲存檔案,讓您維持不變,請使用不同的名稱編輯的原始檔案的副本。
  3. 按一下 檔案按一下 另存成輸入檔案名稱以儲存輸出,然後再按一下 Unicode 文字檔案類型 清單。

指令碼語法

這是文字模式的指令碼,以及它應該在命令執行不是從 [提示] 視窗中, 執行 對話方塊。若要開啟命令提示字元] 視窗中按一下 啟動按一下 執行型別 CMD開啟 方塊中,然後再按一下 [確定].

錯誤記錄檔和匯出檔案會儲存到目前的命令提示字元下目錄。您必須在其中建立檔案的權限這個目錄中。若要取得命令列說明,請輸入下列命令:
CSCRIPT AddSendAs.vbs
若要匯出沒有 「 以下列傳送 」 權限的網域具有完整信箱存取權限的使用者,請輸入下列命令:
CSCRIPT AddSendAs.vbs [domain controller name] –Export
Example:
CSCRIPT AddSendAs.vbs CORP-DC-1 –Export
匯出檔案會被轉換成"Send_As_Export_H_MM_SS.txt"。

若要匯入已編輯過的匯出檔案,請輸入下列命令:
CSCRIPT AddSendAs.vbs [domain controller name] –Import [filename]


Example:


CSCRIPT AddSendAs.vbs CORP-DC-1 –Import "Send_As_Export_H_MM_SS.txt"

如何將授與 「 以下列傳送 」 權限的所有使用者已經擁有信箱 「 完整信箱存取使用權限的網域中每個信箱

附註如果您有代理人也具有 [完整信箱存取權限在您的組織中的使用權限,您不應該使用 SetAll 模式。如果您這樣做使用 SetAll 模式在此情況下,會授與代理人傳送 」使用權限。這種行為可能會造成他們傳送給使用的所有電子郵件訊息「 傳送 」 權限而非 「 傳送的權限。您可以藉由移除 「 傳送 」 權限被錯誤地更正這個問題授與代理人:
CSCRIPT AddSendAs.vbs [domain controller name] –SetAll


Example:


CSCRIPT AddSendAs.vbs CORP-DC-1 –SetAll
如果您使用了 SetAll 模式,將會匯出檔案產生為 Send_As_Export_H_MM_SS.txt。您應該先儲存這個檔案,因為它是已變更的所有帳戶的記錄。如果您在執行指令碼一次,它並不會輸出相同的帳戶清單因為帳戶會有已授與 「 以下列傳送 」 權限。

將會在執行指令碼時,您會遇到的錯誤儲存至 Send_As_Errors_H_MM_SS.txt 檔案。錯誤的檔案名稱會符合任何相關聯的匯出檔案的 hours_minutes_seconds 時間戳記。

指令碼修改部分

可能是您組織中擁有的權限的帳戶許多物件,但不是想變動權限。若要減少大小的匯出檔案中,您可以篩選這些帳戶,藉由修改位於指令碼頂端附近的 FMA_EXCLUSIVE_LIST 變數。藉由預設值,這個變數預設會列出應在隱藏起來的少數帳戶指令碼的輸出。您可以使用下列格式來新增更多帳戶。
& "<Domain\Name>" & OUTPUT_DELIMITER
比方說,您可以變更下列變數的值。
FMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITER
使其出現,如下所示。
FMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITER & "Mydomain\Service1" & OUTPUT DELIMITER
這項變更會隱藏清單中的"Mydomain\Service1"帳戶匯出檔案加上"NT AUTHORITY\SELF"和"NT AUTHORITY\SYSTEM"。請注意形式值區分大小寫,而且它必須完全出現一樣,或者像是在匯出檔案。

另外有一個可編輯的變數,FMA_EXCLUSIVE_EXSVC,具有預設值"\Exchange服務"& OUTPUT_DELIMITER。「 Exchange 服務 」 是系統帳戶的名稱可在 Exchange 中被授與 「 Active Directory 連接器的權限5.5 與 Exchange 2000 移轉和同時案例的伺服器。這個帳戶是建立多個網域,而且它可能會重複出現在匯出檔案如果它不會隱藏。

FMA_EXCLUSIVE_EXSVC 變數只接受做為值的一個帳戶。帳戶名稱不區分大小寫。該帳戶必須以反斜線字元 (\) 開頭,並且不可包含該帳戶所屬的網域。帳戶將被抑制所有已存在的網域。

如果您曾經使用協力廠商的遷移工具或目錄同步處理方法,不同的帳戶可能存在於已廣泛授與的權限給使用者信箱的多個網域。在此案例中,您可以使用替代該帳戶的名稱為 < \Exchange 服務 >。

提示與警告

  • 請勿捨棄所產生的記錄和錯誤檔指令碼。可能是疑難排解或回復變更時會具有價值稍後。請記住,當您授與 「 以下列傳送 」 權限,帳戶,它將不會再記錄在匯出檔案。
  • 如果您的 Exchange 伺服器或資料庫當機,指令碼處理將會變慢。在這種情況下,您可以依資料庫排序匯出檔案,移動行之後停止的資料庫到不同的檔案,以便與相關聯的匯入。
  • 指令碼會抑制輸出的帳戶,登入名稱以"$"結尾或 NT AUTHORITY\SYSTEM。這些系統帳戶不應該一般來說,需要 「 傳送為權限,並將它們從匯出檔案移除可大幅減少其大小。
  • 匯出檔案必須是以 Unicode 格式,才可以重新匯入。如果您必須小心將檔案儲存為 ANSI 文字,您可以載入 [記事本] 中的檔案,並將它儲存為 Unicode 解決這個問題文字。
  • 如果匯入無法正常執行,疑難排解與測試帳戶與匯入檔案中的單一資料行。您應該設定測試帳戶的密碼正在執行的 Exchange 伺服器上擁有信箱,然後授與另一個測試帳戶的完整信箱存取權限。請勿授與 「 以下列傳送 」 權限給其他的測試帳戶。
  • 沒有這個指令碼復原 」 模式。若要拿掉您必須產生 send As 權限授與這個指令碼,另一個指令碼或以手動方式將它們移除。若要避免未提供復原 」 模式若要移除以下列傳送 」 權限中的所有使用者的這段指令碼使用組織。
  • 指令碼不正確地處理具有的帳戶被授與 「 完整信箱存取以及使用者物件 「 完全控制。完整控制 」 包括了 「 以下列傳送 」 權限,但指令碼將會匯出如同它並沒有 「 以下列傳送 」 權限的帳戶。這可能會增加的大小匯出檔案中,但不是會發生無法匯入檔案],然後又再授與 「 傳送 」 權限給這類帳戶。
  • 有區別的使用中目錄使用者帳戶名稱,並包含索引標籤,或不可以是不符合的雙引號使用此指令碼處理。指令碼可以正確地處理名稱,包含成對的雙引號如下所示:
    「 CN = 第一個"暱稱 「 姓氏,DC = 網域,DC = com"
  • 每個版本的 Excel 支援不同的行最大限制。 如需詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
    120596大於 65536 列的文字檔無法匯入到 Excel 97、 Excel 2000,Excel 2002 和 Excel 2003
    下列是 Excel 2003 和 Excel 2007 的資料列限制:
    • Excel 2003: 65536 列
    • Excel 2007 1048576: 資料列
    如果您的輸出檔超過這些限制,您必須將檔案分成幾節逐一載入 Excel 中。
  • Send_As_Errors 檔也會列出特定帳戶位置發生無法讀取或寫入權限。如果您在其他帳戶網域都已順利處理,這些帳戶可能有若干共通可以防止指令碼執行。常見的問題包括遵循:
    • 沒有檢視或設定系統管理的權限帳戶的內容。
    • Exchange 信箱儲存區未執行。
    • 工作站不是相同的成員網域。
    • 不是正在使用的系統管理帳戶來自相同的樹系。
若要執行這段指令碼,複製並貼上開始之間的所有線條指令碼並結束指令碼到純文字編輯器如 「 記事本 」。儲存指令碼為 AddSendAs.vbs。開始指令碼。
Option Explicit

Dim OUTPUT_DELIMITER
OUTPUT_DELIMITER = """""""" & vbTab & """"""""

'Define exclusive list, if FMA is given to any user in this list, it's ignored.  If you 
'want to modify this list, please be sure to follow the same format. Every alias has to 
'have a OUTPUT_DELIMITER before and after it
Dim FMA_EXCLUSIVE_LIST
FMA_EXCLUSIVE_LIST = OUTPUT_DELIMITER & "NT AUTHORITY\SELF" & OUTPUT_DELIMITER & "NT AUTHORITY\SYSTEM" & OUTPUT_DELIMITER
Dim FMA_EXCLUSIVE_EXSVC
FMA_EXCLUSIVE_EXSVC = "\Exchange Services" & OUTPUT_DELIMITER

'Permission Type: Allow or Deny
const ACCESS_ALLOWED_OBJECT_ACE_TYPE  = 5
const ADS_ACETYPE_ACCESS_ALLOWED = &h0
const ADS_ACETYPE_ACCESS_DENIED = &h1

'Flags: Specifies Inheritance
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_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

'output file name
Const EXPORT_FILE = "Send_As_Export"
Const ERROR_FILE = "Send_As_Errors"

' script mode
const MODE_INVALID = -1 
const MODE_SETALL = 0
const MODE_EXPORT = 1
const MODE_IMPORT = 2
const SETALL = "-SETALL"
const EXPORT = "-EXPORT"
const IMPORT = "-IMPORT"

' argument index
Const ARG_INDEX_MODE = 1
Const ARG_INDEX_DC = 0
Const ARG_INDEX_FILENAME = 2

' column index in import/export file
Const COLUMN_INDEX_USERDISPLAYNAME = 0
Const COLUMN_INDEX_FMAALIAS = 1
Const COLUMN_INDEX_FMADISPLAYNAME = 2
Const COLUMN_INDEX_IFPUBLICDELEGATE = 3
Const COLUMN_INDEX_MAILBOXSTATUS = 4
Const COLUMN_INDEX_USERADSPATH = 5
Const COLUMN_INDEX_HOMEMDB = 6

Const EMPTYSTRING = ""
Const STRNO = "No Delegates"
Const STRYES = "Has Delegates" 
Const MIN_ARG = 2
Const INIT_ARRAY_SIZE = 100

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

Const ForReading	= 1
Const ForWriting	= 2
Const ForAppending	= 8
Const TristateTrue	= -1
Const ADS_SCOPE_SUBTREE = 2

Dim objUser
Dim objSDMailBox
Dim objSDNTsecurity
Dim objDACLNTSD
Dim objNewACE

Dim sTrusteeAlias()
Dim sFMADeniedList
Dim sFMAExplicitAllow
Dim fACESendasFound
Dim dArraySize
Dim TotalACE
Dim i
Dim rootDSE
Dim conn
Dim objCommand
Dim objCmdDisplayName
Dim rsUsers
Dim FoundObject
Dim objFSO
Dim objfileImport
Dim objfileExport
Dim objfileError
Dim sImportFilePath
Dim cScriptMode
Dim dArgCount
Dim dArgExpected
Dim sDCServer
Dim sMailboxStatus
Dim sIfPublicDelegate
Dim sFMAUserDisplayName
Dim sExportFileName
Dim sErrorsFileName
Dim msPublicDelegates
Dim fError
Dim fOneError
Dim fFMAAllowed

On Error Resume Next
dArraySize = INIT_ARRAY_SIZE
ReDim Preserve sTrusteeAlias(dArraySize)

dArgCount = Wscript.Arguments.Count 
If ( dArgCount < MIN_ARG ) Then
	DisplaySyntax
End If

err.Clear
fError = False
fOneError = False
cScriptMode = MODE_INVALID
Select Case UCase(WScript.Arguments(ARG_INDEX_MODE))
	Case SETALL 
		cScriptMode = MODE_SETALL
		dArgExpected = ARG_INDEX_MODE + 1
	Case EXPORT 
		cScriptMode = MODE_EXPORT
		dArgExpected = ARG_INDEX_MODE + 1
	Case IMPORT 
		cScriptMode = MODE_IMPORT
		dArgExpected = ARG_INDEX_FILENAME + 1
	Case Else 
		cScriptMode = MODE_INVALID
End Select
If (cScriptMode = MODE_INVALID Or dArgCount <> dArgExpected) Then
	DisplaySyntax
End If

sDCServer = WScript.Arguments(ARG_INDEX_DC)

CreateOutputFiles

If ( cScriptMode = MODE_SETALL Or cScriptMode = MODE_EXPORT ) Then
	Dim sDomainContainer
	If (cScriptMode = MODE_SETALL) Then
		Dim strInput 
		WScript.StdOut.WriteLine("WARNING: If you continue, each account in the domain that has")
		WScript.StdOut.WriteLine("Full Mailbox Access permission for a given mailbox will also be")
		WScript.StdOut.WriteLine("granted permission to Send As the mailbox owner.")
		WScript.StdOut.WriteLine()
		WScript.StdOut.WriteLine("To preview the list of mailboxes before granting Send As,")
		WScript.StdOut.WriteLine("cancel this operation and use the -Export mode of this script.")
		WScript.StdOut.WriteLine()
		WScript.StdOut.Write("Press Y to continue or any other key to cancel: ")
		strInput = WScript.StdIn.ReadLine()
		If (UCase(strInput) <> UCase("Y")) Then
			WScript.Quit
		End If	
	End If
	
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("""!"" indicates an error processing an object.")
	WScript.StdOut.WriteLine("     Check " & sErrorsFilename)
	WScript.StdOut.WriteLine("Starting...")
	WScript.StdOut.WriteLine()

	err.Clear	
	Set rootDSE = GetObject("LDAP://" & sDCServer & "/RootDSE")
	sDomainContainer = rootDSE.Get("defaultNamingContext")
	WScript.StdOut.WriteLine("Finding domain controller [ " & sDCServer & " ] for domain [ " & sDomainContainer & " ]")
	
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to find the domain or domain controller, error:" & err.Description)
		objfileError.WriteLine("Failed to find the domain or domain controller, error:" & err.Description)
		WScript.Quit
	End If
			
	err.Clear	
	Set conn = CreateObject("ADODB.Connection")
	Set objCommand = CreateObject("ADODB.Command")
	conn.Provider = "ADSDSOObject"
	conn.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 objCommand.ActiveConnection = conn
	WScript.StdOut.WriteLine("Searching for mailbox owner user accounts in " & sDomainContainer)
	
	objCommand.CommandText  = "<LDAP://" & sDCServer & "/" & sDomainContainer & ">;(&(&(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=user)(msExchHomeServerName=*)) ))));adspath;subtree"
	objCommand.Properties("searchscope") = ADS_SCOPE_SUBTREE
	objCommand.Properties("Page Size") = 100
	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
		WScript.StdOut.WriteLine("Search for mailbox owners failed, error:" & err.Description)
		objfileError.WriteLine("Search for mailbox owners failed, error:" & err.Description)
		WScript.Quit
	End If

	If (rsUsers.RecordCount = 0) Then
		WScript.StdOut.WriteLine("No mailbox owner user accounts could be seen in " & sDomainContainer & ".")
		objfileError.WriteLine("No mailbox owner user accounts found in " & sDomainContainer & ".")
		fError = True		
	End If

	While Not rsUsers.EOF
		If (fOneError = True) Then
			WScript.StdOut.Write("!")
		Else
			WScript.StdOut.Write(".")
		End If
		fOneError = False
		
		'Skip any mailbox object in Microsoft Exchange System Objects container
		If (0 = Instr(rsUsers.Fields(0).Value, MESO)) Then
			err.Clear 
			Set objUser = GetObject(rsUsers.Fields(0).Value)
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get user object: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				fError = True
				fOneError = True
				err.Clear
			End If
			Set objSDMailBox = objUser.MailboxRights
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get mailbox rights: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				fError = True
				fOneError = True
				err.Clear
			End If
			Set objSDNTsecurity = objUser.ntSecurityDescriptor
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get NTSD: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				fError = True
				fOneError = True
				err.Clear
			End If
			
			Set objDACLNTSD = Nothing
			If (objUser.AccountDisabled) Then
				sMailboxStatus = "Disabled"
			Else
				sMailboxStatus = "Enabled"
			End If

			'Query this user's publicDelegates list
			err.Clear 
			msPublicDelegates = objUser.Get("publicDelegates")
			If (err.number <> 0) Then
				'This user doesn't have publicDelegates list set
				sIfPublicDelegate = STRNO
				err.Clear
			Else
				sIfPublicDelegate = STRYES
			End If
			
			err.Clear 			
			FindAllFMAUsers objSDMailBox
			
			If (TotalACE > dArraySize) Then
			'Needs to allocate bigger size array
				dArraySize = TotalACE + 1
				ReDim Preserve sTrusteeAlias(dArraySize)
				FindAllFMAUsers objSDMailBox
			End If
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to query mailbox rights of user: " & rsUsers.Fields(0).Value)
				objfileError.WriteLine("Error: " & err.Description)
				err.Clear
				fError = True
				fOneError = True
			End If
			
			If TotalACE > 0 Then
				Set objDACLNTSD = objSDNTsecurity.DiscretionaryAcl

				For i = 0 to TotalACE - 1 Step 1
					
					'Check if we already have Send As ACE in NT security descriptor
					'If it exists, either allow or deny, we don't need to add send as to it 
					CheckSendAsACE objDACLNTSD, sTrusteeAlias(i)
					
					'Note: deny entries take precedence over allow entries. 
					'If there is FMA deny ACE, skip it even if we find FMA allow ACE 
					IfFMAAllowed(sTrusteeAlias(i) & OUTPUT_DELIMITER)
					If ((fFMAAllowed = True) And (fACESendasFound = 0)) Then
						If cScriptMode = MODE_SETALL Then
							Set objNewACE = CreateObject ("AccessControlEntry")
							objNewACE.AceFlags = 0 
							objNewACE.AceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE
							objNewACE.AccessMask = EX_MB_SEND_AS_ACCESSMASK 
							objNewACE.Flags = 1
							objNewACE.ObjectType = EX_MB_SEND_AS_GUID
							objNewACE.Trustee = sTrusteeAlias(i)

							objDACLNTSD.AddAce objNewAce
						End If
			
						'Query trustee(FMA user) to get its displayName
						Dim rsTrustee
						Dim objTrustee
						Dim dPosition
						Dim sAlias
					
						dPosition = inStr(1, sTrusteeAlias(i), "\")
						sAlias = mid(sTrusteeAlias(i), dPosition + 1)
				
						Set objCmdDisplayName = CreateObject("ADODB.Command")			
						Set objCmdDisplayName.ActiveConnection = conn
						objCmdDisplayName.CommandText  = "<LDAP://" & sDomainContainer & ">;(&(&(& (mailnickname=" & sAlias & ") (| (&(objectCategory=person)(objectClass=user)(msExchHomeServerName=*)) ))));adspath;subtree"
						objCmdDisplayName.Properties("searchscope") = ADS_SCOPE_SUBTREE
						objCmdDisplayName.Properties("Page Size") = 100
						objCmdDisplayName.Properties("Timeout") = 30 
						objCmdDisplayName.Properties("Chase referrals") = (ADS_CHASE_REFERRALS_SUBORDINATE Or ADS_CHASE_REFERRALS_EXTERNAL)
						
						Set rsTrustee = objCmdDisplayName.Execute				
						Set objTrustee = GetObject(rsTrustee.Fields(0).Value)
						
						If (err.number <> 0) Then
							'Failed to query FMA user's display name, use its alias
							sFMAUserDisplayName = sAlias							
						Else
							sFMAUserDisplayName = objTrustee.displayName							
						End If
	
						'output to export file
						err.Clear
						objfileExport.WriteLine ("""""""" & objUser.displayName & OUTPUT_DELIMITER & sTrusteeAlias(i) & OUTPUT_DELIMITER & sFMAUserDisplayName & OUTPUT_DELIMITER & sIfPublicDelegate & OUTPUT_DELIMITER & sMailboxStatus & OUTPUT_DELIMITER & rsUsers.Fields(0).Value & OUTPUT_DELIMITER & objUser.homeMDB & """""""")
						If (err.number <> 0) Then
							objfileError.WriteLine("User " & rsUsers.Fields(0).Value & " could not be added to the export file. You should set permissions manually for this user.")
							objfileError.WriteLine("Error: " & err.Description)
							err.Clear
							fError = True
							fOneError = True
						End If
						Set objCmdDisplayName = Nothing
						Set rsTrustee = Nothing
						Set objTrustee = Nothing
					End If
				Next
					
				If cScriptMode = MODE_SETALL Then
					err.Clear
					objSDNTsecurity.DiscretionaryAcl = objDACLNTSD
					objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
					objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
					objUser.SetInfo
					If (err.number <> 0) Then
						objfileError.WriteLine("Failed to update ADSI for user: " & rsUsers.Fields(0).Value)
						objfileError.WriteLine("Error: " & err.Description)
						err.Clear
						fError = True
						fOneError = True
					End If
				End If

				TotalACE = 0
				Set objSDMailbox = Nothing
				Set objSDNTsecurity = Nothing
				Set objUser = Nothing
				Set objDACLNTSD = Nothing
			End If
		
		End If	
		rsUsers.MoveNext
	Wend
End If

If (cScriptMode = MODE_IMPORT) Then
	Dim sOneRow
	Dim sArraySplit
	Dim objUserItem
	Dim UserPath
	Dim objUserSD
	Dim objUserDACL
	Dim fNeedToAddSendAs
	
	sImportFilePath = WScript.Arguments(ARG_INDEX_FILENAME)

	WScript.StdOut.WriteLine("If you continue, each account listed in " & sImportFilePath)
	WScript.StdOut.WriteLine("that has Full Mailbox Access permission for a given mailbox")
	WScript.StdOut.WriteLine("will also be granted permission to Send As the mailbox owner.")
	WScript.StdOut.WriteLine()
	WScript.StdOut.Write("Press Y to continue or any other key to cancel: ")
	strInput = WScript.StdIn.ReadLine()
	If (UCase(strInput) <> UCase("Y")) Then
		WScript.Quit
	End If	
	WScript.StdOut.WriteLine("Starting...")
	WScript.StdOut.WriteLine()

	UserPath = EMPTYSTRING	
	err.Clear	
	Set objFSO = CreateObject("Scripting.FileSystemObject")
	Set objfileImport = objFSO.OpenTextFile(sImportFilePath, ForReading, False, TristateTrue)
	If (err.number <> 0) Then
		WScript.StdOut.WriteLine("Failed to open import file " & sImportFilePath & ", error:" & err.Description)
		objfileError.WriteLine("Failed to open import file " & sImportFilePath & ", error:" & err.Description)
		WScript.Quit
	End If	

	fNeedToAddSendAs = False
	Do While objfileImport.AtEndOfStream <> True
		If (fOneError = True) Then
			WScript.StdOut.Write("!")
		Else
			WScript.StdOut.Write(".")
		End If
		fOneError = False

		err.Clear
		sOneRow = objfileImport.ReadLine
		sArraySplit = Split(sOneRow , OUTPUT_DELIMITER)
		If (err.number <> 0) Then
			objfileError.WriteLine("Failed to parse one row: " & sOneRow )
			objfileError.WriteLine("Error: " & err.Description)
			err.Clear
			fError = True
			fOneError = True
		End If
		
		If (UserPath <> sArraySplit(COLUMN_INDEX_USERADSPATH)) Then
			'A new user
			If (fNeedToAddSendAs = True ) Then
				'update existing user
				err.Clear 
				objSDNTsecurity.DiscretionaryAcl = objDACLNTSD
				objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
				objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
				objUser.SetInfo
				If (err.number <> 0) Then
					objfileError.WriteLine("Failed to update permissions for user: " & UserPath)
					objfileError.WriteLine("Error: " & err.Description)
					fError = True
					fOneError = True
				End If
			End If
						
			fNeedToAddSendAs = False
			Set objUser = Nothing
			Set objSDNTsecurity = Nothing
			Set objDACLNTSD = Nothing

			UserPath = sArraySplit(COLUMN_INDEX_USERADSPATH)
			err.Clear 
			Set objUser = GetObject(UserPath)
			Set objSDNTsecurity = objUser.ntSecurityDescriptor  
			Set objDACLNTSD = objSDNTsecurity.DiscretionaryACL			
			If (err.number <> 0) Then
				objfileError.WriteLine("Failed to get user object: " & UserPath)
				objfileError.WriteLine("Error: " & err.Description)
				err.Clear
				fError = True
				fOneError = True
			End If
		End If
	
		'Add newACE   Do we need this check?
		CheckSendAsACE objDACLNTSD, sArraySplit(COLUMN_INDEX_FMAALIAS)
		If (fACESendasFound = 0) Then
			Set objNewACE = CreateObject ("AccessControlEntry")
			objNewACE.AceFlags = 0 
			objNewACE.AceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE
			objNewACE.AccessMask = EX_MB_SEND_AS_ACCESSMASK 
			objNewACE.Flags = 1
			objNewACE.ObjectType = EX_MB_SEND_AS_GUID
			objNewACE.Trustee = sArraySplit(COLUMN_INDEX_FMAALIAS)

			objDACLNTSD.AddAce objNewACE
			fNeedToAddSendAs = True			
		End If
	Loop
	
	If (fNeedToAddSendAs = True ) Then
		'update the last user
		err.Clear 
		objSDNTsecurity.DiscretionaryAcl = objDACLNTSD
		objUser.Put "ntSecurityDescriptor", Array( objSDNTsecurity )
		objUser.SetOption ADS_OPTION_SECURITY_MASK, ADS_SECURITY_INFO_DACL
		objUser.SetInfo
		If (err.number <> 0) Then
			objfileError.WriteLine("Failed to update permissions for user: " & UserPath)
			objfileError.WriteLine("Error: " & err.Description)
			fError = True
		End If
	End If

End If 

objFSO.Close
objfileImport.Close
objfileExport.Close
objfileError.Close

Set objFSO = Nothing
Set objfileImport = Nothing
Set objfileExport = Nothing
Set objfileError = Nothing
Set objCommand = Nothing
Set conn = Nothing

WScript.StdOut.WriteLine()
If (fError = True) Then
	WScript.StdOut.WriteLine("Finished with one or more errors. See " & sErrorsFilename)
Else
	WScript.StdOut.WriteLine("Finished successfully. No errors were encountered.")
End If

Function FindAllFMAUsers (objSD)
Dim objACL
Dim objACE
Dim intACECount
Dim strIndent
Dim dAccessMaskBit
Dim dPosition
Dim sUserAlreadyFound

	On Error Resume Next
	err.Clear
	TotalACE = 0
	sFMADeniedList = EMPTYSTRING
	sFMAExplicitAllow = EMPTYSTRING
	sUserAlreadyFound = OUTPUT_DELIMITER
	intACECount = 0
	Set objACL = objSD.DiscretionaryAcl
	intACECount = objACL.AceCount

	If intACECount Then
		' Open discretionary ACL (DACL) data.
		For Each objACE In objACL		
			
		dPosition = inStr(1, objACE.Trustee, "$")
		If ((0 = Instr(UCase(objACE.Trustee & OUTPUT_DELIMITER), UCase(FMA_EXCLUSIVE_EXSVC))) And (0 = Instr(sUserAlreadyFound, OUTPUT_DELIMITER & objACE.Trustee & OUTPUT_DELIMITER)) And (0 = Instr(FMA_EXCLUSIVE_LIST, OUTPUT_DELIMITER & objACE.Trustee & OUTPUT_DELIMITER)) And (dPosition <> Len(objACE.Trustee)) And ((objACE.AccessMask And EX_FULLMailbox_AccessMask) <>0) And ((objACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED) Or (objACE.AceType = ACCESS_ALLOWED_OBJECT_ACE_TYPE) )) Then
			If (TotalACE < dArraySize) Then
				sTrusteeAlias(TotalACE) = objACE.Trustee
				sUserAlreadyFound = sUserAlreadyFound & objACE.Trustee & OUTPUT_DELIMITER
			End If
			TotalACE = TotalACE + 1	
			If ((objACE.AceFlags And ADS_ACEFLAG_INHERITED_ACE) = 0) Then
				'Keep a list who explictly set FMA at mailbox level
				sFMAExplicitAllow = sFMAExplicitAllow & objACE.Trustee & OUTPUT_DELIMITER			
			End If
		ElseIf (( (objACE.AccessMask And EX_FULLMailbox_AccessMask) <>0 ) And (objACE.AceType = ADS_ACETYPE_ACCESS_DENIED)) Then
			'Keep a list who denied FMA, use OUTPUT_DELIMITER as demiliter, 
			'include both inherited and explicit set at mailbox level
			sFMADeniedList = sFMADeniedList & objACE.Trustee & OUTPUT_DELIMITER			
		End If
		Next
	End If

	Set objACL = Nothing
End Function

Function CheckSendAsACE (objDiscretionaryACL, sTAlias)
Dim objACE
Dim intACECount

	err.Clear 
	fACESendasFound = 0
	intACECount = objDiscretionaryACL.AceCount

	If intACECount Then
		For Each objACE In objDiscretionaryACL	
			err.Clear 
			If ( (objACE.Trustee = sTAlias) And (objACE.ObjectType = EX_MB_SEND_AS_GUID) ) Then
				fACESendasFound = 1
			End If
			If (err.number <> 0) Then
				objfileError.WriteLine("Could not read permissions for this user: " & sTAlias)
				objfileError.WriteLine("Error: " & err.Description)
				err.Clear
				fError = True
				fOneError = True
			End If			
		Next			
	End If	
End Function

Function IfFMAAllowed(sTrustee)
	'FMA allow ACE has been found. Assume it's true
	fFMAAllowed = True
	
	If ( (0 <> Instr(sFMADeniedList, sTrustee)) And (0 = Instr(sFMAExplicitAllow, sTrustee))	) Then
		'If Denied ACE is found, and no explicit allow FMA 
		fFMAAllowed = False
	End If 
End Function

Function CreateOutputFiles
	Dim sTimeArray
	Dim sTimeShort
	Dim sTime
	
	err.Clear
	sTime = Time
	sTimeShort = Split(sTime, " ")
	sTimeArray = Split(sTimeShort(0), ":")

	Set objFSO = CreateObject("Scripting.FileSystemObject")
	sErrorsFileName = ERROR_FILE & "_" & sTimeArray(0) & "_" & sTimeArray(1) & "_" & sTimeArray(2) & ".txt"
	Set objfileError = objFSO.OpenTextFile(sErrorsFileName, ForWriting, True, TristateTrue)

	If (cScriptMode = MODE_SETALL Or cScriptMode = MODE_EXPORT)	Then
		sExportFileName = EXPORT_FILE & "_" & sTimeArray(0) & "_" & sTimeArray(1) & "_" & sTimeArray(2) & ".txt"
		Set objfileExport = objFSO.OpenTextFile(sExportFileName, ForWriting, True, TristateTrue)	
	End If
	
	If err.number <> 0 Then
		WScript.StdOut.WriteLine("Unable to create export or error files: " & err.Description)
		objfileError.WriteLine("Unable to create export or error files: " & err.Description)
		fError = True
		fOneError = True
		WScript.Quit	
	End If

End Function

Function DisplaySyntax
	WScript.StdOut.WriteLine("Syntax:")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Export accounts with Full Mailbox Access that do not have Send As permission:")
	WScript.StdOut.WriteLine("     CSCRIPT """ & WScript.ScriptName & """ DOMAIN_CONTROLLER -Export")
	WScript.StdOut.WriteLine("         NOTE: The list will be saved to Send_As_Export_HH_MM_SS.txt")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Grant Send As to all accounts listed in an export file:")
	WScript.StdOut.WriteLine("     CSCRIPT """ & WScript.ScriptName & """ DOMAIN_CONTROLLER -Import ""filename.txt""")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("Grant Send As to all accounts in the domain with Full Mailbox Access:")
	WScript.StdOut.WriteLine("     CSCRIPT """ & WScript.ScriptName & """ DOMAIN_CONTROLLER -SetAll")
	WScript.StdOut.WriteLine("         NOTE: Accounts will be listed in Send_As_Export_HH_MM_SS.txt")
	WScript.StdOut.WriteLine()
	WScript.StdOut.WriteLine("For all modes, errors are saved to Send_As_Errors_HH_MM_SS.txt")

	WScript.Quit	
End Function
結束指令碼

Microsoft 會提供程式設計範例僅供說明,不做任何明示或默示的保證。這包括但不限於適售性或適合某特定用途之默示擔保。本文假設您已相當熟悉使用的我們所示範的程式設計語言以及建立和偵錯程序所使用的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能。不過,它們不會修改這些範例以提供附加功能或建構程序來滿足您特定需求。

如需有關支援從 Microsoft 取得,可用選項,請造訪下列 Microsoft 網站站台:
http://support.microsoft.com/default.aspx?scid=fh[LN];CNTACTMS (英文)
本文將告訴您的協力廠商產品製造所 Microsoft 無關。Microsoft 發佈任何瑕疵責任擔保,默示或其他有關這些產品的可靠性。

屬性

文章編號: 912918 - 上次校閱: 2012年5月8日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange Server 2003 Enterprise Edition
關鍵字:?
kbtshoot kbpending kbbug kbprb kbmt KB912918 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:912918
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