从移动设备或共享邮箱在 Exchange 2000 Server 和 Exchange Server 2003年中,用户不能发送电子邮件

文章翻译 文章翻译
文章编号: 912918 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

当您尝试在电子邮件中发送电子邮件2000 服务器或在 Microsoft Exchange Server 2003 中,您不能发送电子邮件消息。此外,您可能会收到以下错误消息之一或下面的未送达报告 (Ndr) 之一。

错误消息

  • 访问被拒绝
  • 您没有足够的权限若要执行此操作,在此对象上。请参阅文件夹联系人或您的系统管理员。
  • 未列出的邮件错误
  • MAPI_E_NO_ACCESS为-2147024891
  • 无法提交的邮件用户的用户名 (HRESULT: 为-2147024891) 暂停用户的用户名。(安全错误-不能访问用户邮箱。
  • 资源不找到
注意您会收到"访问被拒绝"错误消息或资源"从 Microsoft Outlook Web Access 作为登录时找不到"错误消息委派的帐户。

Ndr

  • 您没有向此收件人发送邮件的权限。对于要获取帮助,请与系统管理员联系。
  • 无法通过使用您的邮箱发送邮件。执行操作没有发送邮件所代表的指定用户权限。

受影响的产品

已知此问题会影响下列第三方产品:
  • 研究运动 (边缘) 黑莓企业服务器 (BE)
  • 好消息的技术 GoodLink 无线
此问题可能还会影响自定义 MAPI 或协作数据对象 (CDO)-基于发送电子邮件的程序。

其他此外可以使用服务帐户来发送电子邮件的第三方产品受到影响。如果您正在运行受此第三方产品问题,我们建议您与供应商联系以寻求帮助解决这问题。

但是,已确认的下列第三方产品不受此问题:
  • Cisco 集体统一邮件
  • 用于 Exchange 的追求迁移套件
  • Microsoft ExMerge 实用程序用于交换

原因

如果下列条件之一,则可能出现此问题true:
  • 您没有权限将作为电子邮件发送邮箱所有者发送电子邮件使用的帐户中消息。
  • 在运行 Microsoft Exchange 2000 服务器服务包连同 Store.exe 文件的版本等于或晚于版本 3 (SP3)6619.4 当第一次版本。 6619.4 是适用于以下知识文库文章:
    915358 修补程序是可用于更改 Exchange 2000 Server 中的邮箱完全控制权限的行为
  • 等于或晚于版本 Store.exe 文件版本一起运行 Microsoft Exchange Server 2003 SP17233.51。
  • 您正在运行与 Store.exe 一起 Exchange Server 2003 SP2等于或晚于版本 7650.23 的文件版本。版本 7650.23第一次进行以下 Microsoft 知识库中相应的可用文章:
    895949 更改在 Exchange 2003"代理发送"权限的行为。
    此更改不包括 Exchange Server 2003 sp2。如果您已运行的 Exchange Server 2003 SP1 版本 Store.exe 文件,它包含此更改,并在升级到 Exchange Server 2003 SP2,则必须安装此修补程序,以保留新行为的 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

值名称: 邮箱缓存老化限制
值类型: REG_DWORD
基数: 十进制
值数据: 以分钟为单位邮箱信息缓存老化限制.
该注册表项的默认值是 120 分钟 (两个小时为单位)。如果您修改此注册表项,您必须重新启动 MicrosoftExchange 信息存储服务。

注意如果超时值设置为一个非常低的值,则可以影响服务器的性能。

如何授予代理发送权限的多个帐户

将搜索 Active Directory 服务域的帐户具有邮箱完全控制权限而不具有邮箱的代理发送权限,这篇文章的结尾提供了一个示例脚本。它们的服务或资源的帐户将受此安全更改影响的特征。该脚本可以生成导出文件,您可以查看、 编辑和授予代理发送权限需要此权限的帐户然后重新导入。

您还可以通过在 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. 在上 视图 菜单中,请确保高级的功能 选择选项。如果此选项不是选中,安全页将不会显示为用户帐户对象。
  3. 创建普通用户帐户并充当邮箱所有者。
  4. 分配的普通用户帐户上的 Exchange 邮箱服务器。
  5. 打开新的邮箱所有者帐户的属性。
  6. 在中 Exchange 高级 框中,授予受保护的管理员有完全邮箱访问权限帐户。
  7. 在安全页中,授予代理发送权限才能受保护的管理员帐户。
  8. 单击 确定 若要退出的属性邮箱所有者对象。
  9. 邮箱所有者帐户对象,用鼠标右键单击,然后单击 禁用帐户 若要禁用的所有登录的帐户。
有关保护 adminSDHolder 详细信息帐户,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
907434"发送为"在 Active Directory 用户和计算机配置的"发送为"权限后从用户对象中删除权限管理单元在 Exchange Server
318180 AdminSDHolder 线程会影响可传递的通讯组的成员
817433 委派的权限不可用,将自动禁用继承
306398 AdminSDHolder 对象影响过去的管理员帐户的控制的委派

黑莓企业服务器的特殊任务

任务 1: 确保 BlackBerry 企业服务器作为一个单独的、 唯一的帐户运行

请确保正在作为黑莓企业服务器单独的专门为管理任务创建的帐户。通过默认情况下,此帐户被称为"BESAdmin"。

如果您有一个单独的帐户管理黑莓企业服务器,请转到任务 2。

如果您没有单独的帐户,创建单独的帐户。然后,使用此帐户执行管理任务。有关如何执行此操作,如果您正在运行黑莓企业服务器 4.0 或黑莓企业服务器 4.1 的说明,请参阅黑莓企业服务器安装指南 》。有关如何操作才运行黑莓企业服务器 3.6,请参阅黑莓企业 Server 2000/2003年安装和入门手册 》。

任务 2: 确保 BlackBerry 企业服务器服务帐户具有适当的权限

验证有黑莓企业服务器服务帐户适当的权限。

注意如果该帐户是域中,请确保该帐户是只有域用户组的成员。在域控制器上,该帐户应为内置管理员组的成员。
  1. 在黑莓企业服务器上,请执行以下步骤:
    1. 请确保该帐户是本地的成员管理员组。
    2. 指定"在本地登录"和"作为服务登录"该帐户的权限。
  2. 在授予 Exchange View-Only 管理员权限管理组级别。为此,请执行以下步骤:
    1. 在 Exchange 系统管理器中,右键单击第一个Exchange Server 的管理组名称,然后单击 委托控件.
    2. 请注意,黑莓企业服务器服务帐户被列为有 View-Only 的 Exchange 管理员的角色。
  3. 授予"代理发送,"",为接收"和"管理信息在服务器级别为每个 Exchange 服务器的存储区"权限。若要此操作,请按照下列步骤操作:
    1. 在 Exchange 系统管理器中,右键单击第一个Exchange Server 的管理组名称,然后展开 服务器 组。
    2. 用鼠标右键单击 Exchange 服务器,请单击 属性然后单击 安全.
    3. 在顶部窗格中,选择黑莓企业服务器服务帐户。在底部窗格中,确保选中"发送为""接收,"和"管理信息存储区"权限设置为 允许.
    4. 为每个 Exchange 重复步骤 3b 和 3c服务器。
  4. 授予"代理发送,"",为接收"和"管理信息存储"邮箱存储的权限。为此,请执行以下步骤:
    1. 在 Exchange 系统管理器中,右键单击第一个交换管理组名称,然后展开 服务器 组。
    2. 展开第一个邮箱存储组,右键单击每个邮箱存储区中,单击 属性然后单击 安全.
    3. 在顶部窗格中,选择黑莓企业服务器服务帐户。在底部窗格中,确保选中"发送为""接收,"和"管理信息存储区"权限设置为 允许.
    4. 每个邮箱存储上每个重复步骤 4b 和 4 个 cExchange 服务器。
  5. 在 Active Directory 用户和计算机管理单元中,请按照下列步骤:
    1. 用鼠标右键单击您想要添加的用户权限,然后单击 属性.
    2. 在上 安全 选项卡上,添加黑莓企业服务器服务帐户,然后单击以选中 作为发送 复选框。
如果您不运行 Exchange Server 2003年,请参阅任务 3。

任务 3: 清除黑莓企业服务器的缓存

要清除 Exchange 存储中的权限高速缓存,请重新启动。黑莓手机相关的服务,然后重新启动 Microsoft Exchange 信息存储区。之后重新启动 Exchange 存储,您必须重新启动以"BESAdmin"帐户授予新添加发送为边缘 Blackberry 相关的服务Exchange 存储的权限。

更多信息

Exchange 邮箱和文件夹的访问权限将被拆分之间活动目录和 Microsoft Exchange 数据库。但是,这两种在 Active Directory 用户管理控制台中设置的权限,但不同的权限存储在两个不同的位置。

通常情况下,如果某个对象的安全页面上设置权限,则活动目录的权限。如果在 Exchange 高级邮箱权限设置页面上,它是 Exchange 数据库的权限。

MsExchMailboxSecurityDescriptor Active Directory 属性是子集的有效的邮箱权限的备份副本。它是在内部 Exchange 使用的多种用途。此外, msExchMailboxSecurityDescriptor属性将更新以匹配 (如果当前有效权限管理员使用受支持的接口分配的权限。但是,如果msExchMailboxSecurityDescriptor属性被修改直接由管理员所做的更改将不会传播到 Exchange 存储中,而所做的更改将不会效果。不能保证与实际邮箱权限同步。您不应使用msExchMailboxSecurityDescriptor属性来读取或写入邮箱的权限。
有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
310866如何在信息存储中存在的邮箱设置 Exchange Server 2003年和 Exchange 2000 服务器的邮箱权限

邮箱完全控制权限是Exchange 数据库存储区的权限。代理发送权限是活动目录的权限。之前的 Exchange Store.exe 文件更改这篇文章中所述,在 Exchange 系统未参考的设置代理发送权限如果发件人已完全邮箱访问权限权限。

包含与代理发送权限让 Exchange 服务器管理员可以完全邮箱访问权限。为自己授予对服务器上任何邮箱的有效代理发送权限的其管理。通过将代理发送权限的完全邮箱访问权限,活动目录管理员可以立即阻止这一过程,因为发送为权限是活动目录的权限,并不是 Exchange 存储权限。因此,此过程并不一定是受控制的Exchange 管理员。

邮箱所有者

邮箱所有者被指在 Active Directory 用户帐户其msExchMailboxGUID属性不携带的全局唯一标识符 (GUID)为特定的邮箱。允许在整个目录林中只能有一个帐户执行特定的邮箱的 GUID。如果您试图设置与第二所有者相同的 GUID,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 配置文件打开您的邮箱的邮箱。电子邮件消息代理发送登录到此配置文件时,将自动从您发送。

查找具有邮箱完全控制权限,而不具有代理发送权限的帐户

这一节中所描述的示例脚本可以搜索一个活动目录域,每次用户帐户的邮箱的完全控制已到邮箱而无需将代理发送权限授予访问权限。

重要您可以更改权限之前,请参阅"关于具有代理的邮箱所有者"一节。

该脚本具有以下三种模式:
  • 导出您可以将输出具有完全邮箱访问权限的用户的列表权限而不是具有发送权限。然后,您可以查看此列表中记事本或其他编辑器中删除您不希望有任何帐户代理发送权限。
  • 导入您可以导入具有完全邮箱访问权限的用户的列表其代理发送权限也被授予的权限。请注意,您不能使用此脚本授予邮箱完全控制权限,代理发送权限。每个帐户必须已完全邮箱访问权限被授予代理发送权限的权限。
  • SetAll您可以在域中的所有用户授予代理发送权限已拥有特定邮箱的邮箱完全控制权限。A在导出文件的格式相同,将生成日志文件。这是等效于运行在导出和导入模式而无需编辑导出文件。
注意在此脚本中没有撤消函数。

所需的脚本的权限

您必须使用登录时运行脚本从同一个管理帐户目录林的邮箱所有者从帐户。该脚本可能无法使用具有的帐户跨目录林的管理权限。该脚本可能也不起作用时,从已加入到比林中不同的目录林的工作站上运行要联接的邮箱所有者帐户。

给出这些条件,您可以使用中的多个管理帐户运行脚本通过使用RunAs.exe命令的单个登录会话。此过程可能会如果分段后活动目录和 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 文本文件。

输出文件是以制表符分隔格式与三次每个字段的值两边的引号。三重引号要使导入和导出更具有确定性的 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 实用程序将创建该文件的顶部的标题行。

执行操作使用通配符的文件名 (*。 *) 使用 Findstr.exe 实用程序。如果您使用通配符字符将文件名前面的输出文件中的每一行上。您应该通过使用 Find.exe,筛选后,仔细检查输出文件或Findstr.exe 以验证您的筛选器捕获,或排除的帐户,您是的。

在下面的示例的用户的登录名"NoSendAs"具有邮箱完全控制权限,但不是发送为"邮箱所有者"邮箱的权限。
"""Mailbox Owner""" """Domain\NoSendAs""" """No Send As User""" """Has Delegates""" """Enabled""" [additional fields omitted] 

有关拥有代理的邮箱所有者

委托具有完全邮箱访问权限的用户 (也称为"超级代理") 通常不应该允许将代理发送权限。当直接到邮箱所有者的邮箱,该委托的超级代理日志可以作为所有者发送。当委托使用 Outlook 的委派功能 (其他要打开的邮箱打开其他用户的文件夹),代表的所有者发送邮件。

只有在需要超级代理授予代理发送权限委托始终作为邮箱所有者发送并永远不会为代表发送邮箱所有者。我们建议您搜索文本"已在导出文件"代理,然后确定是否任一超级代理的列出的是实际的邮箱所有者的委托。

仅在导出文件中列出了超级代理。普通代理不具有邮箱完全控制权限。此外,授予代理发送权限给普通代理,代理将始终作为邮箱所有者发送。即使该普通代理不具有邮箱完全控制权限时也是如此。如果您执行代理发送代理授予权限时,不希望您可以轻松地撤消的权限更高版本。

如何在 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 服务器上拥有邮箱,然后授予另一个测试帐户的完全邮箱访问权限。不要授予到其他测试帐户的代理发送权限。
  • 此脚本没有撤消模式。若要删除代理发送权限授予您使用此脚本,则必须生成另一个脚本或手动删除它们。若要避免不会撤消模式使用此脚本,以删除中的所有用户的代理发送权限组织。
  • 脚本无法正确处理具有的帐户被授予完全邮箱访问权限与用户对象的完全控制。完全控制包括代理发送权限,但该脚本将导出如果没有将代理发送权限的帐户。这可能会增加的大小导出文件中,但没有损害发生导入该文件,然后再以冗余方式授予向此类帐户的代理发送权限。
  • 有区别的活动目录用户帐户名称,包括选项卡或不匹配的双引号来找不到通过使用此脚本处理。脚本可以正确处理名称,包含匹配的双引号引起来,如下所示:
    "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 ;[行]。CNTACTMS
本文讨论的第三方产品是由与 Microsoft 无关的公司生产的。Microsoft 不担保,隐含的还是有关的性能或可靠性,这些产品。

属性

文章编号: 912918 - 最后修改: 2012年5月8日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft Exchange 2000 Server 标准版
  • Microsoft Exchange 2000 Enterprise Server
  • Microsoft Exchange Server 2003 Standard Edition
  • Microsoft Exchange Server 2003 Enterprise Edition
关键字:?
kbtshoot kbpending kbbug kbprb kbmt KB912918 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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