Exchange 2000 Server および Exchange Server 2003 で、ユーザーがモバイル デバイスまたは共有メールボックスから電子メール メッセージを送信できない

文書翻訳 文書翻訳
文書番号: 912918 - 対象製品
すべて展開する | すべて折りたたむ

目次

現象

Microsoft Exchange 2000 Server または Microsoft Exchange Server 2003 で電子メール メッセージを送信しようとしても、送信できません。また、以下のいずれかのエラー メッセージまたは配信不能レポート (NDR) が送信元のユーザーに届くことがあります。

エラー メッセージ

  • アクセスが拒否されました。
  • オブジェクトを処理するためのアクセス許可がありません。フォルダの連絡先か、システム管理者に連絡してください。
  • Unlisted Message Error
  • MAPI_E_NO_ACCESS -2147024891
  • Failed to submit mail message for user USERNAME (HRESULT:-2147024891) Pausing user USERNAME. (Security error - Cannot access the users mailbox.)
  • 見つかりません
: 代理人アカウントを使用してログインすると、Outlook Web Access (OWA) により "アクセスが拒否されました" または "見つかりません" というエラー メッセージが表示されます。

NDR

  • この受信者に送信するアクセス許可がありません。システム管理者に連絡してください。
  • このメールボックスを使ってメッセージを送信できません。指定されたユーザーの代理としてメッセージを送信するアクセス権がありません。
この問題により、以下のサードパーティ製品に影響があることが確認されています。
  • Research In Motion (RIM) BlackBerry Enterprise Server (BES)
  • Good Technology GoodLink Wireless Messaging
ただし、以下のサードパーティ製品は、この問題による影響を受けないことが確認されています。
  • Cisco Unity Unified Messaging
  • Quest Migration Suite for Exchange
  • Microsoft ExMerge ユーティリティ (Exchange 用)
この問題により、電子メール メッセージの送信を行う MAPI または CDO (Collaborative Data Objects) ベースのカスタム プログラムにも影響がある可能性があります。

サービス アカウントを使用して電子メール メッセージを送信するその他のサードパーティ製品も、この問題の影響を受ける可能性があります。実行しているサードパーティ製品がこの問題の影響を受けている場合は、製造元に問い合わせて、問題解決のサポートを依頼することをお勧めします。詳細については、「詳細」を参照してください。

重要 : 業務上重要なアプリケーション用に "送信者" アクセス許可の機能を復元するための緊急手段として、Active Directory コンテナまたはドメイン全体で継承を使用することにより、サービス アカウントに "送信者" アクセス許可を付与することができます。この設定を行う方法の詳細は、この資料の「」に記載されています。これは差し迫った問題を解決するには効果的な方法ですが、セキュリティ面および管理面において注意すべきことがあります。たとえば、このアクセス許可の付与により、意図しないアカウントに "送信者" アクセス許可が適用される可能性があります。また、ユーザー アカウントを別のコンテナに移動する場合には、アクセス許可も設定し直す必要があります。

原因

この問題は、次のいずれかの条件に該当する場合に発生することがあります。
  • 電子メール メッセージの送信に使用しているアカウントに、メールボックスの所有者として電子メール メッセージを送信するためのアクセス許可が付与されていません。
  • ファイル バージョンが 6619.4 以降の Store.exe と共に Microsoft Exchange 2000 Server Service Pack 3 (SP3) を実行しています。バージョン 6619.4 は、以下の「サポート技術情報」 (Microsoft Knowledge Base) の資料で初めて利用できるようになりました。
    915358 Exchange 2000 Server で "フル メールボックス アクセス" アクセス許可の動作を変更する修正プログラム
  • ファイル バージョンが 7233.51 以降の Store.exe と共に Microsoft Exchange Server 2003 Service Pack 1 (SP1) を実行しています。バージョン 7233.51 は、以下の「サポート技術情報」 (Microsoft Knowledge Base) の資料で初めて利用できるようになりました。
    895949 Exchange 2003 における "送信者" アクセス許可の動作の変更
    この修正は、Microsoft Exchange 2003 Service Pack 2 (SP2) には含まれていません。Exchange Server 2003 SP1 用のこの修正プログラムをインストールした場合は、Service Pack 2 にアップグレードした後、Service Pack 2 用の修正プログラムをインストールする必要があります。
  • ファイル バージョンが 7650.23 以降の Store.exe と共に Exchange Server 2003 SP2 を実行しています。バージョン 7650.23 は、以下の「サポート技術情報」 (Microsoft Knowledge Base) の資料で初めて利用できるようになりました。
    895949 Exchange 2003 における "送信者" アクセス許可の動作の変更
    : この変更は、Exchange 2000 Server SP3、Exchange Server 2003 SP1、および Exchange Server 2003 SP2 には含まれていませんでした。この変更は、これらの Service Pack のリリース後に実装されましたが、各 Service Pack でサポートされています。この変更は、今後リリースされるこれらの製品の Service Pack に収められる予定です。

    Exchange Server 2003 SP2 をインストールした場合、新しい動作を維持するには、この追加の更新プログラムをインストールする必要があります。Exchange Server 2003 SP1 用の更新プログラムを既にインストールしていた場合でも、この更新プログラムをインストールする必要があります。

解決方法

「原因」に記載されているよりも前のファイル バージョンの Store.exe では、"フル メールボックス アクセス" アクセス許可を付与すると、暗黙的に、メールボックスの所有者として電子メール メッセージを送信するアクセス許可が付与されました。このため、"フル メールボックス アクセス" アクセス許可を持つ他のアカウントから、メールボックスの所有者が送信したように見える電子メール メッセージを送信することが可能でした。

多くの Microsoft Exchange ユーザーから、"送信者" アクセス許可と、"フル メールボックス アクセス" アクセス許可を別にして欲しいという要望が寄せられました。これは、以下の 2 つの理由によるものです。
  • 電子メール スプーフィング (なりすまし) を防止するため
  • 代理人から送信された電子メール メッセージと、本当のメールボックス所有者から送信された電子メール メッセージを、常に明確に識別できるようにするため
新しいバージョンのすべての Exchange インフォメーション ストアでは、メールボックスの所有者として電子メール メッセージを送信するには、"送信者" アクセス許可を明示的に付与する必要があります。ただし、この必要条件には以下の 3 つの例外があります。
  • メールボックス所有者のアカウントには、自身のメールボックスについて、"送信者" アクセス許可が明示的に付与されている必要はありません。
  • メールボックスに関連付けられた外部アカウントには、"送信者" アクセス許可が明示的に付与されている必要はありません。
  • "フル メールボックス アクセス" アクセス許可も付与されている代理人アカウントには、"送信者" アクセス許可が明示的に付与されている必要はありません。
これらの例外の詳細については、「詳細」を参照してください。

新しい動作では、メールボックスに対して部分的なアクセス許可または完全なアクセス許可が付与されている、その他のすべてのアカウントについては、メールボックスの所有者として電子メールを送信するには、明示的に "送信者" アクセス許可を付与する必要があります。これには、モバイル デバイス ユーザーの電子メール メッセージの送信などの機能を実行するアプリケーション サービス アカウントも含まれます。

メールボックスを所有する各ユーザー オブジェクトごとにサービス アカウントに "送信者" アクセス許可を付与する必要があります。Exchange サーバーまたはデータベース オブジェクトに対する "送信者" アクセス許可を付与することでは、データベース内のすべてのメールボックスに対する "送信者" アクセス許可を付与したのと同じ効果を得ることはできません。

このような動作となるのは、"送信者" アクセス許可が Active Directory のアクセス許可であり、設定されている Active Directory オブジェクトに対して適用されるためです。Exchange データベース オブジェクトの "送信者" アクセス許可を付与すると、データベース自体の "送信者" アクセス許可が付与されますが、データベース内のメールボックスを所有するユーザーの "送信者" アクセス許可は付与されません。

: Exchange データベースの "送信者" アクセス許可を付与すると、データベース内のすべてのメールボックスに対する "フル メールボックス アクセス" アクセス許可を付与したのと実質的に同じ効果が得られます。これは、"送信者" アクセス許可の動作とは異なります。

"送信者" アクセス許可の場合、データベース オブジェクト自体に対してのみアクセス許可が適用されます。データベース内のメールボックスに対しては、アクセス許可は適用されません。"受信者" アクセス許可の場合、実質的にデータベース内のすべてのメールボックスにアクセス許可が継承されます。

データベース内のすべてのメールボックスを、"データベース" という 1 つのメールボックス内の複数のフォルダとして考えてみると、この 2 つのアクセス許可の違いをよく理解することができます。データベースに対する完全なアクセス許可が付与されている場合、データベース内のすべてのコンテンツに対するアクセス許可を持っています。つまり、すべてのメールボックスにアクセスすることができます。

"送信者" アクセス許可は、データベース内に格納されているメールボックス コンテンツではなく、Active Directory ユーザー オブジェクトの ID に対して適用されます。電子メール メッセージが送信される際、メッセージは特定のメールボックスまたはデータベースから送信されるのではなく、ユーザーから送信されます。このユーザーは、メールボックスの所有者か、"送信者" アクセス許可が付与された他のアカウントです。

メールボックスの所有者として送信するアクセス許可を他のアカウントに明示的に付与するには、以下の手順を実行します。
  1. Active Directory ユーザーとコンピュータ管理コンソールを開きます。
  2. [表示] メニューで [拡張機能] がオンになっている (チェックマークが表示されている) ことを確認します。このオプションがオンになっていないと、ユーザー アカウント オブジェクトの [セキュリティ] ページが表示されません。
  3. メールボックスを所有しているユーザー アカウントのプロパティを開きます。
  4. [セキュリティ] タブをクリックします。
  5. グループおよびユーザー名の一覧に対象のアカウントが表示されていない場合は、このユーザーの "送信者" アクセス許可を付与するアカウントを追加します。
  6. 対象のアカウントについて、[アクセス許可] ボックスで [送信者] の [許可] チェック ボックスをオンにします。
  7. [OK] をクリックします。
  8. 影響を受ける Exchange サーバーで Microsoft Exchange インフォメーション ストア サービスを再起動します。
: Microsoft Exchange インフォメーション ストア サービスを再起動しない場合、Microsoft Exchange インフォメーション ストア サービスでは、以下のレジストリ サブキーで設定されている値に従ってアクセス許可のキャッシュが更新され、新しいアクセス許可が有効になります。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\ParametersSystem


値の名前 : Mailbox Cache Age Limit
値の種類 : REG_DWORD
基数 : 10 進数
値のデータ : The mailbox information cache age limit in minutes (メールボックス情報キャッシュの有効期間 (分単位))
このレジストリ エントリのデフォルトの値は、120 分 (2 時間) です。このレジストリ エントリを変更した場合は、Microsoft Exchange インフォメーション ストア サービスを再起動する必要があります。

: タイムアウトの設定値が小さすぎる場合は、サーバーのパフォーマンスに影響が出る場合があります。

複数のアカウントに "送信者" アクセス許可を付与する方法

この資料の末尾には、サンプル スクリプトが掲載されています。このスクリプトは、Active Directory ディレクトリ サービス ドメイン内で、メールボックスに対する "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないアカウントを検索します。この条件に該当するサービスまたはリソース アカウントが、このセキュリティ上の変更の影響を受けます。このスクリプトでは、エクスポート ファイルを生成することができます。生成されたファイルの参照および変更を行って、インポートし直すことにより、このアクセス許可が必要なアカウントに "送信者" アクセス許可を付与することができます。

また、Active Directory ドメインまたはコンテナ内の各ユーザー オブジェクトで継承を使用することにより、"送信者" アクセス許可を付与することもできます。この方法を使用して、"送信者" アクセス許可を付与すると、意図していなかったオブジェクトにもアクセス許可が付与される可能性があります。また、コンテナからオブジェクトを移動すると、アクセス許可が失われる可能性があります。このため、この方法はお勧めできません。また、この方法ではセキュリティ上の影響が生じる可能性があるため、実装前に十分に検討する必要があります。

Active Directory ドメインまたはコンテナ内のすべてのユーザー アカウントの "送信者" アクセス許可を 1 つのアカウントに付与するには、以下の手順を実行します。
  1. Active Directory ユーザーとコンピュータ管理コンソールを開きます。
  2. [表示] メニューで [拡張機能] がオンになっている (チェックマークが表示されている) ことを確認します。このオプションがオンになっていないと、ドメイン オブジェクトおよびコンテナ オブジェクトの [セキュリティ] ページが表示されません。
  3. ドメインまたはコンテナのプロパティを開き、[セキュリティ] タブをクリックします。
  4. [詳細設定] (または [詳細]) をクリックします。
  5. アクセス許可が必要なアカウントが一覧に表示されていない場合は、[追加] をクリックし、対象のアカウントを選択します。既に表示されている場合は、アカウントをダブルクリックして編集します。
  6. [適用先] ボックスの一覧の [ユーザー オブジェクト] をクリックします。
  7. そのアカウントについて、[送信者] の [許可] チェック ボックスをオンにします。
  8. [OK] を数回クリックして各ダイアログ ボックスを閉じ、すべての変更を適用します。
: この資料の末尾に掲載されているスクリプトでは、アクセス許可の継承が利用されています。このため、この方法を使用して "送信者" アクセス許可を付与すると、"送信者" アクセス許可を継承したアカウントはスクリプトで認識されなくなります。それらのアカウントを後からスクリプトで処理するには、まず、継承された "送信者" アクセス許可を削除する必要があります。

adminSDHolder で保護されるアカウントに関する特別な規則

スクリプトを使用して、メールボックス所有者の "送信者" アクセス許可を付与しても、メールボックス所有者がドメイン管理者である場合は、"送信者" アクセス許可は有効になりません。ドメイン管理者の権限を持つユーザー アカウントまたは adminSDHolder で保護されているユーザー アカウントについては、メールボックスを有効にしないことを強く推奨します。

adminSDHolder オブジェクトは、幅広い Active Directory 管理者権限を持つアカウント用のテンプレートです。意図しない特権の昇格が行われないようにするため、adminSDHolder オブジェクトで保護されているアカウントには、adminSDHolder オブジェクト自体に設定されているアクセス権と対応するアクセス権が付与されている必要があります。

保護されているアカウントの adminSDHolder オブジェクトの権限またはアクセス許可を変更すると、数分以内にバックグラウンドで処理が実行され、変更が元に戻されます。たとえば、ドメイン管理者オブジェクトの "送信者" アクセス許可をアプリケーション サービス アカウントに付与すると、バックグラウンドの処理で自動的にこのアクセス許可が削除されます。

このため、adminSDHolder オブジェクト自体を変更しない限り、アプリケーション サービス アカウントに、adminSDHolder オブジェクトで保護されているアカウントの "送信者" アクセス許可を付与することはできません。adminSDHolder オブジェクトに変更を加えると、保護対象のすべてのアカウントに対するアクセス許可が変更されます。adminSDHolder オブジェクトに変更を加える場合は、事前に、変更によって生じる可能性のあるセキュリティ上の影響を十分に確認しておく必要があります。

adminSDHolder オブジェクトで保護されているアカウントにメールボックスを関連付けるには、以下の手順を実行します。
  1. Active Directory ユーザーとコンピュータ管理コンソールを開きます。
  2. [表示] メニューで [拡張機能] がオンになっている (チェックマークが表示されている) ことを確認します。このオプションがオンになっていないと、ユーザー アカウント オブジェクトの [セキュリティ] ページが表示されません。
  3. メールボックス所有者として機能する通常のユーザー アカウントを作成します。
  4. 作成した通常のユーザー アカウントに、Exchange サーバー上のメールボックスを割り当てます。
  5. 新しいメールボックス所有者のアカウントのプロパティを開きます。
  6. [Exchange の詳細設定] タブの [メールボックスの権利] をクリックし、保護されている管理者アカウントに "フル メールボックス アクセス" アクセス許可を付与します。
  7. [セキュリティ] タブで、保護されている管理者アカウントに "送信者" アクセス許可を付与します。
  8. [OK] をクリックして、メールボックスの所有者オブジェクトのプロパティを閉じます。
  9. メールボックスの所有者オブジェクトを右クリックし、[アカウントを無効にする] をクリックして、このアカウントに対するログオンを無効にします。
adminSDHolder で保護されたアカウントの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
907434 Exchange Server の Active Directory ユーザーとコンピュータ スナップインで "送信者" アクセス許可を構成した後、ユーザー オブジェクトから "送信者" アクセス許可が削除される
318180 AdminSDHolder スレッドが配布グループの推移メンバに影響を与える
817433 委任されたアクセス許可を利用できず継承が自動的に無効になる
306398 以前管理者だったアカウントのオブジェクト制御の委任に AdminSDHolder オブジェクトの設定が影響する

BlackBerry Enterprise Server 用の特別な作業

作業 1 : BlackBerry Enterprise Server が、独立した一意のアカウントで実行されていることを確認する

BlackBerry Enterprise Server が、管理タスク用に作成された個別のアカウントを使用して実行されていることを確認します。このアカウントは、デフォルトでは "BESAdmin" という名前です。

BlackBerry Enterprise Server の管理用に個別のアカウントがある場合は、作業 2 に進みます。

個別のアカウントがない場合は、アカウントを作成します。このアカウントを使用して、管理タスクを実行するようにします。個別のアカウントで管理タスクを実行する方法については、実行している BlackBerry Enterprise Server のバージョンに応じて、以下のいずれかの BlackBerry Web サイトを参照してください。

BlackBerry Enterprise Server 4.0 または BlackBerry Enterprise Server 4.1 を実行している場合は、以下の BlackBerry Web サイトを参照してください。
http://www.blackberry.com/btsc/search.do?cmd=displayKC&docType=kc&externalId=9174704&sliceId=&dialogID=11024244&stateId=1 0 11020632
BlackBerry Enterprise Server 3.6 を実行している場合は、以下の BlackBerry Web サイトを参照してください。
http://www.blackberry.com/btsc/search.do?cmd=displayKC&docType=kc&externalId=KB04334&sliceId=SAL_Public&dialogID=11016727&stateId=1 0 11020358

作業 2 : BlackBerry Enterprise Server のサービス アカウントに適切なアクセス許可が付与されていることを確認する

BlackBerry Enterprise Server のサービス アカウントに適切なアクセス許可が付与されていることを確認します。

: アカウントがドメイン内にある場合は、そのアカウントが、Domain Users グループにのみ属していることを確認します。ドメイン コントローラでは通常、アカウントがビルトイン Administrators グループのメンバになっています。
  1. BlackBerry Enterprise Server で、次の手順を実行します。
    1. アカウントが Local Administrators グループのメンバであることを確認します。
    2. アカウントに "ローカル ログオン" および "サービスとしてログオン" のアクセス許可を付与します。
  2. 管理グループ レベルでの "Exchange 管理者 (参照のみ可)" のアクセス許可を付与します。これを行うには、以下の手順を実行します。
    1. Exchange システム マネージャで、最初の Exchange Server 管理グループの名前を右クリックし、[制御の委任] をクリックします。
    2. BlackBerry Enterprise Server のサービス アカウントに対して "Exchange 管理者 (参照のみ可)" の役割が表示されていることを確認します。
  3. 各 Exchange Server サーバーに対して、サーバー レベルで "Send As"、"Receive As"、および "Administer Information Store" のアクセス許可を付与します。これらのアクセス許可を付与するには、以下の手順を実行します。
    1. Exchange システム マネージャで、最初の Exchange Server 管理グループの下の [サーバー] を展開します。
    2. Exchange Server のサーバー名を右クリックし、[プロパティ] をクリックします。[セキュリティ] タブをクリックします。
    3. 上のボックスで、BlackBerry Enterprise Server のサービス アカウントをクリックします。下のボックスで、[Send As]、[Receive As] および [Administer information store] の右にある [許可] 列のチェック ボックスをオンにします。
    4. 各 Exchange Server サーバーに対して、手順 3b. および 3c. を実行します。
  4. メールボックス ストアに対して "Send As"、"Receive As" および "Administer Information Store" のアクセス許可を付与します。これらのアクセス許可を付与するには、以下の手順を実行します。
    1. Exchange システム マネージャで、最初の Exchange Server 管理グループの下の [サーバー] を展開します。
    2. [最初のストレージ グループ] を展開し、各メールボックス ストアを右クリックし、[プロパティ] をクリックします。[セキュリティ] タブをクリックします。
    3. 上のボックスで、BlackBerry Enterprise Server のサービス アカウントをクリックします。下のボックスで、[Send As]、[Receive As] および [Administer information store] の右にある [許可] 列のチェック ボックスをオンにします。
    4. 各 Exchange Server サーバーに対して、手順 4b. および 4c. を実行します。
  5. Active Directory ユーザーとコンピュータ スナップインで、以下の手順を実行します。
    1. アクセス許可を追加するユーザーを右クリックし、[プロパティ] をクリックします。
    2. [セキュリティ] タブで、BlackBerry Enterprise Server のサービス アカウントを追加し、[送信者] の [許可] チェック ボックスをオンにします。
Exchange Server 2003 を実行していない場合は、作業 3 を参照してください。

作業 3 : BlackBerry Enterprise Server のキャッシュを消去する

インフォメーション ストアのアクセス許可のキャッシュを消去するには、Blackberry 関連のサービスおよび Microsoft Exchange インフォメーション ストアを再起動します。インフォメーション ストアを再起動した後、RIM Blackberry 関連のサービスを再起動して、新しく追加した "送信者" アクセス許可を Exchange インフォメーション ストアの "BESAdmin" アカウントに付与する必要があります。

特定の Blackberry サーバーの要件については、以下の BlackBerry Web サイトを参照してください。
http://www.blackberry.com/btsc/search.do?cmd=displayKC&docType=kc&externalId=KB04707&sliceId=SAL_Public&dialogID=3016166&stateId=0%200%202441763

詳細

Exchange メールボックスおよびフォルダのアクセス許可は、Active Directory と Microsoft Exchange データベースに分かれています。どちらのアクセス許可も Active Directory のユーザーとコンピュータ管理コンソールで設定されますが、それぞれのアクセス許可は別々の場所に保存されています。

原則として、オブジェクトのプロパティの [セキュリティ] タブで設定されるアクセス許可は、Active Directory のアクセス許可です。[Exchange の詳細設定] タブの [メールボックスの権利] で設定されるアクセス許可は、Exchange データベースのアクセス許可です。このため、ユーザーのデータベースが利用できない場合に [メールボックスの権利] をクリックすると、以下のエラー メッセージが表示されます。
Microsoft Information Store サービスは利用できません
原則として [Exchange の詳細設定] タブの [メールボックスの権利] で設定したアクセス許可は Exchange データベースに格納されますが、"関連付けられた外部アカウント" アクセス許可の場合は例外です。"関連付けられた外部アカウント" アクセス許可は本来アクセス許可ではなく、Active Directory 属性 msExchMasterAccountSID を設定するための手段です。msExchMasterAccountSID 属性自体はアクセス許可ではありませんが、他のアクセス許可の動作を制御しています。msExchMasterAccountSID 属性の詳細については、この資料の「関連付けられた外部アカウント」を参照してください。

: Active Directory 属性 msExchMailboxSecurityDescriptor は、有効なメールボックスの権利のサブセットのバックアップ コピーです。この属性は、Exchange 内部でさまざまな目的に使用されます。また、msExchMailboxSecurityDescriptor 属性は、サポートされているインターフェイスを使用して管理者が権利を設定した場合、最新の有効な権利が反映されるように更新されます。

ただし、msExchMailboxSecurityDescriptor 属性を管理者が直接変更した場合、変更内容は Exchange ストアに伝達されず、変更は有効になりません。実際のメールボックスの権利との同期は保証されません。メールボックスの権利の参照または書き込みには、msExchMailboxSecurityDescriptor 属性を使用することはできません。

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
310866 インフォメーション ストア内のメールボックスに Exchange Server 2003 および Exchange 2000 Server のメールボックスの権利を設定する方法

"フル メールボックス アクセス" アクセス許可は、Exchange データベース ストアのアクセス許可です。"送信者" アクセス許可は、Active Directory のアクセス許可です。この資料に記載されている Exchange の Store.exe ファイルの変更が行われる前の Exchange システムでは、送信者に "フル メールボックス アクセス" アクセス許可が付与されている場合、"送信者" アクセス許可の設定は検証されませんでした。

: "フル メールボックス アクセス" アクセス許可は付与せずに、"送信者" アクセス許可を付与している場合もあります。この場合は必ず、Exchange で "送信者" アクセス許可が検証されていました。

"フル メールボックス アクセス" アクセス許可に "送信者" アクセス許可が含まれていたため、Exchange サーバー管理者は、管理対象のサーバー上の任意のメールボックスに対する実質的な "送信者" アクセス許可を自分自身に付与することができました。Exchange サーバー管理者は Exchange データベースに対して実質上フル コントロールのアクセスが可能であったため、このような設定が可能でした。"フル メールボックス アクセス" アクセス許可から "送信者" アクセス許可が分離されたため、Exchange サーバー管理者のこのような操作を、Active Directory 管理者が防止することが可能になりました。"送信者" アクセス許可は Active Directory のアクセス許可であり、Exchange ストアのアクセス許可ではないため、Exchange 管理者が制御する必要はありません。

メールボックスの所有者

メールボックス所有者の定義は、msExchMailboxGUID 属性に、特定のメールボックスのグローバル一意識別子 (GUID) が設定されている Active Directory ユーザー アカウントであることです。ある 1 つのメールボックスの GUID を設定できるアカウントは、フォレスト全体で 1 つだけです。2 つ目のアカウントに同じ GUID を設定しようとすると、エラーが発生し、Active Directory で変更が拒否されます。

アカウントのメールボックスを有効にするか、接続を切断したメールボックスを Active Directory アカウントに再接続すると、メールボックスの GUID がそのアカウントに自動的に設定されます。管理者が直接メールボックスの GUID を設定する必要が生じることはほとんどありません。そのような操作を行うことはお勧めしません。

関連付けられた外部アカウント

一般的な Exchange の構成では、リソース フォレストに Exchange をインストールします。リソース フォレストは、システム内でメールボックスを所有するユーザー アカウントとは別のフォレスト内に存在するフォレストです。msExchMailboxGUID 属性は、Exchange サーバーと同じフォレスト内にあるオブジェクトに対してのみ設定が可能であるため、この構成では問題があります。

この問題を解決する方法は、Exchange サーバー フォレスト内のアカウントでメールボックスを有効にし、このアカウントを、別のフォレスト内のアカウントまたは Microsoft Windows NT 4 ドメイン内のアカウントに関連付けることです。これを行うには、"関連付けられた外部アカウント" アクセス許可を付与します。"関連付けられた外部アカウント" アクセス許可を付与できるのは、1 つのアカウントに対してのみです。このアクセス許可を付与されるアカウントは、別のフォレストのアカウントである必要があります。

"関連付けられた外部アカウント" アクセス許可を設定すると、外部アカウントの SID 値がメールボックス所有者の msExchMasterAccountSID 属性に書き込まれます。つまり、これは実際にはアクセス許可ではなく、msExchMasterAccountSID 属性の値を制御するための簡便な手段です。msExchMasterAccountSID 属性が設定されると、その SID を持つ外部アカウントから、実際のメールボックス所有者のアカウントであるかのように Exchange にアクセスすることができます。

ただし、これは Exchange に対するアクセスのみで、Active Directory に対する完全なアクセス許可が付与されるわけではありません。また、"関連付けられた外部アカウント" アクセス許可を設定した後、すべてのアクセス許可が意図したとおりに機能するように、メールボックス所有者のアカウントでログオンを無効にする必要があります。
300456 Exchange 2000 でクライアントのアクセス許可および委任の設定が維持されない

委任を使用する場合

委任されたユーザー (代理人) には、他のメールボックスに対する部分的なアクセス許可およびメールボックス所有者に代わって電子メール メッセージを送信する権限が付与されます。委任が使用される一般的な例としては、上級管理職の予定表にアシスタントがアクセスできるように権限を委任する場合があります。多くの場合、代理人は、予定表の参照および更新を行うことができます。また、代理人が上級管理職に代わって電子メール メッセージに返信することもできます。

代理アクセス許可を付与するには、メールボックス所有者の publicDelegates 属性に代理人を追加します (この属性には複数の値を設定できます)。この属性に設定されているすべてのユーザーに、メールボックス所有者の代理送信アクセス許可が付与されます。ここで設定された代理人が [差出人] ボックスにメールボックス所有者の名前を設定して電子メール メッセージを送信すると、その電子メール メッセージの [差出人] ボックスには次のように表示されます (<Delegate's Name> は代理人の名前、<Mailbox Owner> はメールボックス所有者の名前です)。
<Delegate's Name> が次の人の代理で送信しました: <Mailbox Owner>
ただし、電子メール メッセージは代理人から送信され、メールボックスの所有者からは送信されていません。

代理送信アクセス許可および代理アクセス許可を付与するには、以下の 2 つのインターフェイスを使用できます。
  • メールボックス所有者オブジェクトのプロパティにある [Exchange 全般] タブを使用して、代理送信アクセス許可を付与します。
  • Microsoft Outlook で、[オプション] ダイアログ ボックスの [代理人] タブを使用します。
どちらの方法でも publicDelegates 属性が設定されます。ただし、Outlook を使用する方法では、フォルダごとに特定のアクセス許可を代理人に付与することができます。また、Outlook 内の各フォルダのプロパティから直接、代理人にアクセス許可を付与することもできます。

場合によっては、Outlook では publicDelegates 属性を設定できないことがあります。
329622 Outlook でアクセス許可を委任した後、ユーザーに代理送信アクセス許可が割り当てられない

メールボックスへの代理アクセス許可を代理人に付与すると、メールボックス フォルダへのアクセス許可を付与していなくても、代理人は代理送信アクセス許可を使用することができます。代理人に付与される基本的なアクセス許可は、代理送信アクセス許可です。メールボックス フォルダにアクセスするためのアクセス許可は別のものであり、代理アクセス許可に加えて別途付与する必要があります。

通常、代理人は、Microsoft Outlook を使用して、アクセス許可が付与された個々のフォルダにアクセスします。フォルダを開くには、Outlook の [ファイル] メニューの [開く] をポイントし、[ほかのユーザーのフォルダ] をクリックします。

別の方法として、Outlook でメールボックスのプロパティを開き、[詳細] をクリックし、[詳細設定] タブで追加のメールボックスを指定することにより、メールボックスを開くことができます。この方法では、代理人の Outlook のフォルダ ツリーにメールボックス所有者のメールボックスが表示されます。また、この方法では、代理アクセス許可が付与されたメールボックス内のすべてのフォルダにアクセスできます。

代理人に対して、あるときには代理送信アクセス許可を付与し、別のときには "送信者" アクセス許可を付与したいという場合があります。これらの 2 つのアクセス許可を代理人に付与するには、以下の手順を実行します。
  • 代理人に、"フル メールボックス アクセス" アクセス許可を付与します。この設定は Outlook から行うことはできません。この設定は、Active Directory 管理者がメールボックス所有者のアカウントに対して行う必要があります。メールボックス内のすべてのフォルダに対する所有者のアクセス許可を付与しても、"フル メールボックス アクセス" アクセス許可を付与したのと同じことにはなりません。
  • "送信者" アクセス許可を代理人に付与しないようにします。このアクセス許可を代理人に付与すると、その代理人が送信するすべての電子メール メッセージは、"送信者" アクセス許可で送信されます。代理人が、代理送信アクセス許可で送信することができなくなります。
このように設定した場合、代理人が代理送信アクセス許可を使用するには、代理人自身のメールボックスにログオンする必要があります。メールボックス所有者のフォルダに既に配信された電子メール メッセージについて、代理人が返信または転送を行うと、電子メール メッセージは自動的にメールボックス所有者の代わりに送信されます。代理人がメールボックス所有者の代わりに新しい電子メール メッセージの作成を行う場合、代理人は [差出人] ボックスにメールボックス所有者の名前を入力する必要があります。

代理人が、メールボックス所有者のフォルダまたはメールボックス全体を追加のメールボックスとして開いているかどうかに関係なく、現在の Outlook プロファイルで代理人自身のメールボックスがプライマリ メールボックスとして設定されている場合、代理人がメールボックス所有者の代わりに送信する電子メール メッセージはすべて代理送信アクセス許可を使用して送信されます。

代理人が、メールボックス所有者として電子メール メッセージを送信する場合、メールボックス所有者のメールボックスのみを開く、別の Outlook プロファイルを使用して、メールボックス所有者のメールボックスにログオンする必要があります。このプロファイルにログオンした代理人が送信する電子メール メッセージは、自動的にメールボックス所有者から送信されます。

"フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないアカウントの検出

以下に掲載されているサンプル スクリプトでは、1 つの Active Directory ドメイン内で、あるメールボックスについて "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないユーザー アカウントを検索することができます。

重要 : アクセス許可を変更する前に、「メールボックス所有者と代理人について」を参照してください。

このスクリプトには、以下の 3 つのモードがあります。
  • Export : "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないユーザーの一覧を出力することができます。この一覧をメモ帳などのエディタで参照し、"送信者" アクセス許可を付与しないアカウントを削除することができます。
  • Import : "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可も付与する必要があるユーザーの一覧をインポートすることができます。このスクリプトを使用して、"フル メールボックス アクセス" アクセス許可と、"送信者" アクセス許可の両方を付与することはできません。このスクリプトで、"送信者" アクセス許可を付与するには、"フル メールボックス アクセス" アクセス許可が既にアカウントに付与されている必要があります。
  • SetAll : 特定のメールボックスについて既に "フル メールボックス アクセス" アクセス許可が付与されている、ドメイン内のすべてのユーザーに、"送信者" アクセス許可を付与することができます。Export モードで出力されるのと同じ形式で、ログ ファイルが生成されます。このモードは、Export モードを実行し、エクスポート ファイルを編集せずに Import モードを実行するのと同じです。
: このスクリプトには、実行した操作を元に戻す機能はありません。

スクリプトの実行に必要なアクセス許可

スクリプトを実行するには、メールボックス所有者のアカウントと同じフォレストに属する管理者アカウントを使用してログオンする必要があります。フォレストを越えた管理者のアクセス許可を持つアカウントでは、スクリプトは機能しない可能性があります。また、メールボックス所有者のアカウントとは異なるフォレストに属しているワークステーションから実行した場合にも、スクリプトは機能しない可能性があります。

このような状況では、RunAs.exe コマンドを使用して、1 つのログオン セッションで複数の管理者アカウントを使用してスクリプトを実行することができます。Active Directory および Exchange Server のアクセス許可が複数に分かれていて、1 つですべての Exchange サーバーおよび Active Directory ドメインを管理できるアカウントがない場合に、この方法が役立ちます。コマンド プロンプトを開き、それぞれの管理者アカウントを使用してスクリプトを実行します。以下の例を参考にしてください。
RunAs.exe /user:domain\account CMD.EXE
: このスクリプトを、同じドメインに対して、一度に複数回実行しないようにしてください。

エクスポート ファイルのフィールドについて、以下に説明します。説明の順序は、エクスポート ファイルに表示されるフィールドの順序に対応しています。
  • メールボックス所有者のアカウントの表示名

    エクスポート ファイルには、同じメールボックス所有者に関する行が複数出力されることもあります。同じメールボックスに対する "フル メールボックス アクセス" アクセス許可が複数のアカウントに付与されている場合に、このような出力が生成されます。
  • "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないアカウントのドメイン名およびログオン名

    1 つのアカウントに複数のメールボックスに対するアクセス許可が付与されている場合、エクスポート ファイルに同じアカウントが複数回表示されます。アプリケーション サービス アカウントや、複数のリソース メールボックスを管理しているユーザーの場合に、このような出力が生成されます。
  • "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないアカウントの表示名

    アカウントの特定に役立つように、ログオン名に加えてこのフィールドが出力されます。
  • メールボックス所有者の委任の状態

    メールボックス所有者に代理人がいる場合は、このフィールドに Has Delegates と表示されます。メールボックス所有者に代理人がいない場合は、このフィールドに No Delegates と表示されます。
  • メールボックス所有者のアカウントの状態 (有効または無効)

    このフィールドは、リソース アカウントやフォレストを越えるメールボックスのアカウントを識別するのに役立ちます。このようなアカウントは通常無効 (disabled) になっています。
  • メールボックス所有者のアカウントの完全な識別名

    このフィールドは、メールボックス所有者のアカウントのドメインおよびコンテナを特定するのに役立ちます。
  • メールボックス所有者のメールボックス データベースの完全な識別名

    このフィールドには、メールボックスのデータベース、ストレージ グループ、サーバーおよび管理者グループが表示されます。
次の例では、"NoSendAs" というログオン名のユーザーに、"Mailbox Owner" メールボックスに対する "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていません。
"""Mailbox Owner""" """Domain\NoSendAs""" """No Send As User""" """Has Delegates""" """Enabled""" [additional fields omitted]

スクリプトを実行するための管理者ワークステーションの構成

このスクリプトでは、Exchange の管理インターフェイスを使用して Exchange サーバーとの通信を行います。このため、このスクリプトは Exchange サーバー、または Exchange システム マネージャがインストールされているワークステーションから実行する必要があります。

エクスポート ファイルの編集

エクスポート ファイルは、Unicode 形式のプレーン テキストとして出力されるため、複数の言語の文字セットがサポートされます。テキスト エディタによっては、ファイルの参照や編集を正常に行うことができない場合や、ファイルの保存時にテキストが ANSI または ASCII 形式で保存される場合があります。Microsoft Windows XP、Microsoft Windows 2000、および Microsoft Windows Server 2003 のメモ帳では、Unicode 形式のテキスト ファイルが適切に処理されます。また、Microsoft Excel でも Unicode 形式のテキスト ファイルを適切に処理することができます。

エクスポート ファイルは、各フィールドの値が 3 つの二重引用符で囲まれたタブ区切りの形式です。Excel でインポートやエクスポートを確実に行えるように、引用符が三重になっています。Excel では、3 つの二重引用符が 1 つの二重引用符になり、ファイルを再度 Unicode テキストとして保存すると 3 つの二重引用符に戻ります。エクスポート ファイルを Excel で正常に開いて保存するには、以下の説明を参照してください。

Excel を使用せずに、Find.exe ユーティリティまたは Findstr.exe ユーティリティを使用して、エクスポート ファイルに対してフィルタを適用することができます。Windows に含まれているこれらのユーティリティでは、ファイル内の特定の単語を検索して、特定の語が含まれている行のみ、あるいは特定の語が含まれていない行のみを結果として得ることができます。たとえば、代理人が設定されたメールボックスの所有者の一覧を作成する場合、以下のいずれかのコマンドを使用して、"Has Delegates" という文字列を含む行のみを含むファイルを作成できます。
Find.exe "Has Delegates" OriginalFile.txt > HasDelegates.txt

Findstr.exe /C:"Has Delegates" OriginalFile.txt > HasDelegates.txt
また、代理人が設定されたメールボックスの所有者をフィルタにより除外する場合、/V スイッチを使用すると、検索語句と一致しない行がすべて出力されます。以下のいずれかのコマンドを使用して、"Has Delegates" という文字列を含む行を除いたファイルを作成できます。
Find.exe "No Delegates" OriginalFile.txt > NoDelegates.txt

Find.exe /V "Has Delegates" OriginalFile.txt > NoDelegates.txt

Findstr.exe /C:"No Delegates" OriginalFile.txt > NoDelegates.txt

Findstr.exe /V /C:"Has Delegates" OriginalFile.txt > NoDelegates.txt
また、次のコマンドを使用して、"フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないアプリケーション サービス アカウントをすべて含むファイルを作成できます (/I スイッチを使用すると、コマンドで大文字と小文字が区別されません)。
Find.exe /I "domain\ServiceAccount" OriginalFile.txt > ServiceAccount.txt

Findstr.exe /I /C:"domain\ServiceAccount" OriginalFile.txt > ServiceAccount.txt
: Find.exe を使用して、フィルタ処理したファイルを作成した場合、Find.exe によって作成されたファイル冒頭のヘッダー行を削除する必要があります。

Findstr.exe では、ワイルドカード (*.*) のファイル名は使用しないようにします。ワイルドカードを使用すると、出力ファイル内の各行の先頭にファイル名が含まれます。Find.exe または Findstr.exe を使用してフィルタ処理を行った後は、意図したとおりのアカウントが抽出または除外されているかどうか、出力ファイルを注意深く確認する必要があります。

次の例では、"NoSendAs" というログオン名のユーザーに、"Mailbox Owner" メールボックスに対する "フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていません。
"""Mailbox Owner""" """Domain\NoSendAs""" """No Send As User""" """Has Delegates""" """Enabled""" [additional fields omitted] 

メールボックス所有者と代理人について

"フル メールボックス アクセス" アクセス許可が付与された代理人 (ここでは "上級代理人" と呼びます) には通常、"送信者" アクセス許可は付与しません。上級代理人は、直接メールボックス所有者のメールボックスにログオンすることにより、"送信者" アクセス許可で送信できます。代理人が Outlook の委任機能を使用すると (追加のメールボックスを開くか、他のユーザーのフォルダを開きます)、メッセージは代理送信アクセス許可で送信されます。

常にメールボックス所有者の "代理人" アクセス許可で送信し、代理送信アクセス許可では送信しないようにする場合にのみ、"代理人" アクセス許可を上級代理人に付与します。エクスポート ファイルで "Has Delegates" というテキストを検索し、一覧の中のいずれかの上級代理人が本当にメールボックス所有者の代理人であるかどうかを確認することをお勧めします。

エクスポート ファイルには、上級代理人のみが出力されます。通常の代理人には、"フル メールボックス アクセス" アクセス許可は付与されません。また、通常の代理人に "代理人" アクセス許可を付与すると、必ず、メールボックス所有者の "代理人" アクセス許可で送信されます。これは、通常の代理人に "フル メールボックス アクセス" アクセス許可が付与されていない場合にも該当します。意図せず、代理人に "代理人" アクセス許可が付与されてしまった場合は、後から簡単にそのアクセス許可を削除することができます。

エクスポート ファイルを Excel で開く方法

  1. エクスポート ファイルを開く前に、Excel を起動します。
  2. Excel で、ファイルの種類としてテキスト ファイルを指定して、エクスポート ファイルを開きます。テキスト ファイル ウィザードが開始されます。
  3. テキスト ファイル ウィザードで、以下のような設定になるように、必要に応じて設定を変更します。
    • 元のデータの形式 : コンマやタブなどの区切り文字によってフィールドごとに区切られたデータ
    • 取り込み開始行 : 1
    • 元のファイル : Unicode (UTF-8)
    • 区切り文字 : タブ ([タブ] 以外のチェック ボックスはオフにします)
    • 連続した区切り文字は 1 文字として扱う : (チェック ボックスをオフにします)
    • 文字列の引用符 : " (二重引用符)

Excel での編集後にエクスポート ファイルを保存する方法

  1. Excel でエクスポート ファイルを開いた状態で、[ファイル] メニューの [名前を付けて保存] をクリックします。
  2. 編集前のエクスポート ファイルを上書きせずにそのまま残すように、[ファイル名] ボックスに別のファイル名を入力します。
  3. [ファイルの種類] ボックスの一覧の [Unicode テキスト] をクリックし、[保存] をクリックします。

スクリプトの構文

これはテキスト モードのスクリプトであり、[ファイル名を指定して実行] ダイアログ ボックスではなく、コマンド プロンプト ウィンドウから実行する必要があります。コマンド プロンプト ウィンドウを表示するには、[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックし、[名前] ボックスに CMD と入力し、[OK] をクリックします。

エラー ログおよびエクスポート ファイルは、コマンド プロンプトの実行時のディレクトリに保存されます。スクリプトを実行するユーザーに、このディレクトリにファイルを作成するのに必要なアクセス許可が付与されている必要があります。
コマンド ラインのヘルプを表示するには、次のコマンドを入力します。
CSCRIPT AddSendAs.vbs
1 つのドメイン内の、"フル メールボックス アクセス" アクセス許可が付与されていて、"送信者" アクセス許可が付与されていないユーザーの一覧をエクスポートするには、次のコマンドを入力します。
CSCRIPT AddSendAs.vbs [domain controller name] -Export
例 :
CSCRIPT AddSendAs.vbs CORP-DC-1 -Export
Send_As_Export_H_MM_SS.txt という名前のエクスポート ファイルが生成されます。
編集したエクスポート ファイルをインポートするには、次のコマンドを入力します。
CSCRIPT AddSendAs.vbs [domain controller name] -Import [filename]


例 :


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

ドメイン内でメールボックスに対する "フル メールボックス アクセス" アクセス許可が既に付与されているすべてのユーザーに、対応するメールボックスに対する "送信者" アクセス許可を付与する方法

: 組織内に、"フル メールボックス アクセス" アクセス許可を持つ代理人が存在する場合、SetAll モードは使用しないようにする必要があります。このような場合に SetAll モードを使用すると、代理人に "送信者" アクセス許可が付与されます。これにより、代理人が送信するすべての電子メール メッセージが、代理送信アクセス許可ではなく、"送信者" アクセス許可を使用して送信されます。この動作を修正するには、誤って代理人に付与された "送信者" アクセス許可を削除します。
CSCRIPT AddSendAs.vbs [domain controller name] -SetAll


例 :


CSCRIPT AddSendAs.vbs CORP-DC-1 -SetAll
SetAll モードを使用すると、Send_As_Export_H_MM_SS.txt という形式の名前でエクスポート ファイルが生成されます。これは、変更が加えられたアカウントの一覧が記録されたファイルであるため、保存しておく必要があります。スクリプトを再度実行しても、アカウントには既に "送信者" アクセス許可が付与されているため、同じアカウントの一覧は出力されません。

スクリプトの実行中に発生したエラーは、Send_As_Errors_H_MM_SS.txt という形式の名前のファイルに出力されます。エラー ファイルの名前に含まれているタイムスタンプ (H_MM_SS の部分。H は時間、MM は分、SS は秒を表します) は、関連するエクスポート ファイルと対応しています。

スクリプトの変更

多くのオブジェクトに対するアクセス許可が付与されていて、そのアクセス許可を変更できないアカウントが組織内に存在することがあります。このような場合にエクスポート ファイルのサイズを小さくするには、スクリプトの先頭付近にある 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
この変更を行うと、"NT AUTHORITY\SELF"、"NT AUTHORITY\SYSTEM" と同様に "Mydomain\Service1" アカウントもエクスポート ファイルから除外されます。Domain\Name の値は大文字と小文字が区別されるため、エクスポート ファイルに表示されるものとまったく同じになるように指定する必要があります。

FMA_EXCLUSIVE_EXSVC も編集できる変数です。この変数のデフォルトの値は、"\Exchange Services" & OUTPUT_DELIMITER です。"Exchange Services" は、Exchange 5.5 と Exchange 2000 の移行または共存の事例で、Active Directory コネクタを使用してアクセス許可が付与されたアカウントの名前です。このアカウントは複数のドメインに作成されるため、除外しない場合、エクスポート ファイルに同じアカウントが繰り返し現れます。

FMA_EXCLUSIVE_EXSVC 変数の値に指定できるアカウントは 1 つのみです。このアカウント名は、大文字と小文字が区別されません。アカウントの先頭には円記号 (\) を付け、アカウントが属しているドメインは含めません。存在するすべてのドメインで、このアカウントは除外されます。

サードパーティの移行ツールを使用した場合、またはディレクトリの同期を行った場合、複数のドメインに、ユーザーのメールボックスに対して広くアクセス許可が付与された異なるアカウントが存在することがあります。このような場合、"\Exchange Services" の代わりにそのアカウントの名前を指定することができます。

ヒントと注意事項

  • スクリプトによって生成されたログ ファイルおよびエラー ファイルは削除しないようにしてください。トラブルシューティングを行う場合や、後で変更内容を元に戻す場合に必要になることがあります。いったんアカウントに対して "送信者" アクセス許可を付与すると、再度スクリプトを実行してもエクスポート ファイルに同じ内容は出力されないことに注意してください。
  • Exchange サーバーまたはデータベースに障害が発生すると、スクリプトの実行速度が低下します。その場合、後でインポートを実行する際には、エクスポート ファイルの内容をデータベースごとに並べ替えて、停止しているデータベースに関連する行を別のファイルに移動することができます。
  • 末尾に "$" が付いているログオン名や NT AUTHORITY\SYSTEM というログオン名については、ファイルにアカウントの情報が出力されません。これらのシステム アカウントには通常、"送信者" アクセス許可は必要ありません。これらを出力の対象から除外することにより、エクスポート ファイルのサイズを著しく小さくすることができます。
  • エクスポート ファイルをインポートするには、ファイルが Unicode 形式になっている必要があります。誤ってファイルを ANSI テキストとして保存した場合は、メモ帳でファイルを開き、Unicode テキスト形式で保存し直すことにより、修正することができます。
  • インポートが正常に行われない場合は、テスト用のアカウントを作成し、インポート ファイルに 1 行だけ入力して、トラブルシューティングを行います。実行されている Exchange サーバー上にメールボックスを持つアカウントを、テスト用に構成する必要があります。テスト用のアカウントをもう 1 つ用意して、"フル メール ボックス アクセス" アクセス許可のみを付与し、"送信者" アクセス許可は付与しないでおきます。
  • このスクリプトには、元に戻す機能は用意されていません。このスクリプトを実行して付与した、"送信者" アクセス許可を削除するには、別のスクリプトを作成するか、手動でアクセス許可を削除する必要があります。このスクリプトを使用して、組織内のすべてのユーザーから "送信者" アクセス許可を削除することがないように、このスクリプトでは元に戻す機能をサポートしていません。
  • このスクリプトでは、"フル メールボックス アクセス" アクセス許可と共にユーザー オブジェクトの "フル コントロール" アクセス許可を付与されたアカウントについては、適切に処理されません。"フル コントロール" アクセス許可には "送信者" アクセス許可が含まれますが、このスクリプトでは、"送信者" アクセス許可が付与されていない場合と同様に、アカウントがエクスポートされます。これにより、エクスポート ファイルのサイズが増加する可能性がありますが、ファイルのインポート、およびこのようなアカウントに重複して "送信者" アクセス許可を付与することにより問題は発生しません。
  • Active Directory ユーザー アカウントで、タブが含まれている識別名、または開始記号と終了記号が対応していない二重引用符が含まれている識別名を使用している場合、このスクリプトでは処理できません。次のように、開始記号と終了記号が対応している二重引用符が含まれている名前は、正常に処理されます。
    "CN=First "Nickname" Last,DC=domain,DC=com"
  • Excel では、最大 65,535 行までのファイルを処理できます。出力ファイルの行数がこの上限を超えている場合、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 Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。
マイクロソフトが提供するサポート オプションの詳細については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/contactus/?ws=support
この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。明示または黙示にかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。

プロパティ

文書番号: 912918 - 最終更新日: 2007年11月26日 - リビジョン: 17.2
この資料は以下の製品について記述したものです。
  • 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 KB912918
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

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