前言:
此刻姐妹们对“outlook脱机工作”大致比较重视,同学们都需要剖析一些“outlook脱机工作”的相关资讯。那么小编也在网络上收集了一些有关“outlook脱机工作””的相关资讯,希望你们能喜欢,看官们一起来学习一下吧!本章涵盖:如何构建一个我们可以在脚本中多次使用的函数。一种新型循环:Do-Until 循环非常适合状态更新。内置 Exchange 函数,允许我们创建、删除、备份和导入用户邮箱。
在撰写本文时,电子邮件一直是内部通信之王。随着社交媒体的兴起以及无处不在的文本和电话通信选项,电子邮件已经失去了一些骑行或死亡状态;然而,很明显,这种形式的沟通不会很快消失。作为系统管理员,您可能会承担一些常见的 Exchange 相关任务。
目前,向您的典型企业提供了三种主要类型的 Exchange 解决方案。
本地即服务混合
他们都有一个共同点?作为系统管理员,您将与他们进行交互。即使使用电子邮件即服务和使用 Office 365 的混合解决方案,电子邮件系统的管理也由你决定。
Exchange 服务的大多数系统管理都是通过 ECP(Exchange 控制面板)或 EAC(Exchange 管理中心)完成的,但还有第三个选项:PowerShell。
EAC 和 ECP 都是 Web 前端 GUI,但您可以通过基于 Windows PowerShell 构建的 Exchange 命令行管理程序完全控制 Exchange 系统的各个方面。这意味着通过使用PowerShell脚本,您可以更快,更轻松,更高效地管理整个Exchange环境。使用 GUI 的典型管理员将被迫一次修改一个邮箱。利用您已经学到的技能,例如变量数组,条件逻辑和循环,您可以使用脚本管理数百或数千个脚本,并让计算机完成工作。
损坏的 Exchange 邮箱最常见的修复方法之一是禁用并重新启用邮箱。这实质上是重新创建用户的邮箱,并修复了从邮箱损坏到数据库完整性问题的各种问题。然而,它并非没有缺点。其中最主要的是,完成此操作后,用户的旧电子邮件不再与新邮箱关联。
如果你的电子邮件用户和我一样,他们会把他们的邮箱当作他们自己的个人时间机器,回到十五年前的消息以太中取出一封重要的电子邮件。因此,失去他们的历史电子邮件存储的想法与最新的 13日星期五电影一样可怕;而且更真实。
解决此问题的最简单方法是备份用户的 .pst 文件(脱机 Outlook 数据文件)。这保存了用户的电子邮件、日历项目和其他内容。保存 .pst 文件后,我们可以安全地重新创建用户的邮箱并重新导入 .pst 并还原所有历史数据。
这样做的典型问题是备份 .pst 文件(尤其是对于大型邮箱)是一个漫长的过程。在某些情况下,依靠用户备份自己的 .pst 文件可以工作;但是,销毁用户的电子邮箱并依靠他们备份自己的消息可能会导致噩梦般的场景,即数据永远消失,而您正在与愤怒的用户打交道,该用户一心想让您感受到他们的痛苦。
这通常转化为:
系统管理员转到用户的计算机(或遥控器)启动 .pst 文件的备份过程等待几分钟到几个小时才能完成该过程通过 EAC 禁用用户的邮箱通过 EAC 启用用户的邮箱重新导入用户的 .pst 文件
但是,这对于个人用户来说可能很好,很耗时。但是,如果数据库严重损坏,影响了许多用户,则此过程可能需要几天时间才能还原用户。PowerShell来救援!
使用此脚本(图 7.1),您将能够:
键入用户的用户名。自动开始备份 .pst 文件在完成后的 5 秒内,我们禁用邮箱然后重新启用邮箱自动开始重新导入 .pst 文件。
不再浪费时间!在脚本运行时,系统管理员可以自由地解决与主要 Exchange 问题相关的许多其他问题,包括中断的通信和状态报告的发布,并且他/她能够向高层管理人员提供状态更新,而不会使 ETA 受到影响。
图 7.1 微型 PowerShell 项目代码
注意
在本书的后续章节中,我们将讨论如何连接到远程PSSession,并将模块,别名和函数导入到我们当前工作的PSSession中。这将使我们能够灵活地在域中的任何PC上运行Exchange cmdlet。但是,在本书的这一点上,除非您已经熟悉 PSSessions 和导入 PSSessions,否则建议您在远程访问域上的 Exchange 服务器时执行此脚本和相关 cmdlet。
7.1 函数
函数是可以调用的代码分组,非常类似于执行特定任务的 cmdlet。您需要编写的代码越少,您遇到错误的可能性就越小。通常,随着程序的进展,您会发现自己需要对代码进行细微的更改。将您反复使用的代码封装在函数中,因此您只需在一个位置对代码进行修改。
在上一章中,我们研究了如何对汽车进行编程以自动驾驶。但是驾驶的过程相当复杂。您必须踩下油门或刹车。您必须转向并使用转向信号灯。让我们快速看一下如何指示汽车行驶(图 7.2)。
图7.2 艰难地转动汽车
为了指示汽车踩下油门并转弯,我们必须创建两个新变量。$accelerator和$wheel。但是要指示汽车直行、向左或向右行驶,我们总共需要四个 if/else 语句。除此之外,我们还需要跟踪$wheel在三个不同位置的变量。如果您后来决定名称$wheel不够具体(因为您可能在脚本后面引用了汽车的车轮),并且想要将变量更改为 $steering_wheel,则现在必须在所有三个位置更改它,否则可能会在脚本中引入错误。
让我们看看向脚本添加转向信号灯需要什么(图 7.3)。
图7.3 为什么函数可以节省我们的时间和麻烦
简单地告诉汽车不是更容易吗:
右转左转转为无
我们可以使用一个名为“Turn”的函数(如图 7.4 所示)来做到这一点!
图7.4 函数示例
如您所见,在上面的例子中,我们实际上将函数 Turn 调用了三次。如果我们想对我们第一次使用的 If/Else 语句做同样的事情,我们必须键入所有这些 If/Else 语句三次,每次为驱动器提供不同的值。
我们能够使用 9 行代码完成与使用上面显示的 If/Else 语句的 48 行代码一样多的功能。
在我们的 Tiny PowerShell 项目中,我们将设置一个函数来检查用户邮箱的邮箱导入和导出的状态。只有当它完全备份/恢复时,代码才会继续。此函数可防止脚本在备份邮箱内容之前禁用邮箱。我将在图 7.5 中预览代码的截图。如果您此时不完全了解它在做什么,请不要担心;我们将在本章后面介绍要完成的其他事情。
图 7.5 微型 PowerShell 获取状态函数
7.2 更多循环
我们现在在许多脚本中看到了循环 a。除了第 4 章 Bugs 之外,没有解释循环,每次我们使用它们时,它们都是 foreach 循环。但是有许多类型的循环。
7.2.1 Foreach 循环
让我们快速回顾一下 foreach 循环中的步骤(图 7.6)。它们是:
我们在某种列表或数组中有许多项目。我们有指定数量的代码,我们希望应用于它们中的每一个我们遍历整个列表并将代码应用于每个项目。当我们的列表或数组中没有更多项目时,循环退出。图7.6 Foreach循环复查
在这个小项目的脚本中,我们使用了 Do-till 循环。“直到”循环在循环中运行,直到满足退出条件。如果我们遇到在检测到错误时想要退出循环的情况,则必须添加 IF 语句和 Break 命令以在检测到错误时退出循环。Do-till 循环内置了这个功能。它是循环和 If 语句的组合。
7.2.2 直到循环
当 foreach 循环对列表或数组中的每个项运行时,Do-till 循环将在循环的每次迭代后进行检查,以查看它是否应退出或继续。“直到”循环的工作方式如下:
对循环中的第一项运行代码检查退出条件如果满足退出条件,它将退出循环。否则,它将继续循环中的下一项此过程一直持续到满足退出条件。
在下面的示例(图 7.7)中,我们将获得系统时间,只需查看当前秒,然后休眠一秒。如果秒等于 15,则循环结束。这意味着如果我们在分钟顶部运行此循环,循环将运行 15 次,检查第一秒,然后是第二秒和第三秒,直到到达第 15 秒。如果在 16秒开始循环,它将运行 59 次。在每个循环之后,Do-till 循环将检查是否满足退出条件,如果没有,它将再次运行循环。
获取日期
为此,我们需要一种方法让 PowerShell 从系统时间获取当前秒数。幸运的是,已经为此功能构建了一个名为 Get-Date 的 cmdlet。获取日期 cmdlet 从系统中获取 DateTime 对象,并能够以多种方式设置其格式。
默认情况下,Get-Date 返回星期几、月、日、年、小时、分钟和秒。但是我们可以很容易地隔离这些元素中的任何一个,为了只检索当前秒,我们使用点表示法从返回的 DateTime 对象中仅请求秒参数。
图7.7 执行任务循环示例
“或”条件逻辑
有时在使用条件逻辑时,我们需要检查多个条件。我们尝试应用的逻辑可能有用,如果某些条件、没有条件或全部条件都为真。
让我们看一下用于结束 do 循环的条件逻辑,如图 7.8 所示。
图7.8 或比较运算符示例
这里有几种不同类型的状态可以返回:
排队进程内完成失败
在备份 .pst 的过程完成之前,我们不想退出 do 循环。但是,如果 .pst 备份失败,我们不希望继续禁用邮箱。因此,我们真正关心$status变量的四个可能结果中的两个(已完成和失败)。我们可以设置这些条件中的任何一个作为摆脱 do-till 循环的方法,方法是在我们的条件逻辑中包含 “-or” 语句。
现在我们了解了循环的结构,让我们看看可以使用循环来执行什么。在我们的 Tiny PowerShell 项目代码中,我们使用 do-till 循环来等待 ImportMailbox 或 ExportMailbox 命令的状态完成。但是我们如何检查状态以查看是否满足条件?我们可以使用 PowerShell 查询 Exchange 服务器并进行检查。
我们可以编写多个函数来执行非常具体的事情。或者我们可以尝试制作一个更加动态和通用的函数,允许我们根据调用函数时传递的参数类型执行不同的函数。使用这些参数和条件逻辑,我们可以构造一个非常具体的Exchange服务器命令。
7.3 选择对象
选择对象是一个 cmdlet,允许我们选择一个对象或对象的一部分并返回该值。PowerShell和PowerShell中的脚本都是关于学习如何管理你关心的对象。Select-Object可用于选择对象的特定数量,类型和部分,所有这些都使我们作为PowerShell脚本编写者的生活更轻松。
选择对象属性
很多时候,命令的结果比我们关心的要多。例如,如果我们只对 Active Directory 数据库中的电子邮件地址的完整列表感兴趣,那么运行 Get-ADUser cmdlet 并具有用户的名称、SamAccountName、DistinctedName 以及默认情况下从该 cmdlet 返回的所有其他值(图 7.9)将是我们需要过滤掉的内容。
图7.9 Get-ADUser的默认输出
我们已经在PowerShell中使用点表示法看到了这种类型的过滤。但这受到以下事实的限制:我们一次只能使用 cmdlet 上的点表示法选择一个参数。例如,如果我们想创建一个包含用户电子邮件地址和全名的列表,我们就不能使用点表示法(图 7.10)。因为当我们使用点表示法时,返回的对象不再包含任何其他 Active Directory 属性。
图 7.10 尝试使用点表示法过滤多个属性。
但是,利用选择对象,我们可以使用 -Property 参数选择多个 Active Directory 属性(图 7.11)。在这里,我们可以轻松地选择对象的一个或多个属性。
图 7.11 使用选择对象从返回的 cmdlet 中选择多个属性。
选择对象 - 展开属性
某些对象属性是值或嵌套对象的集合。当您尝试显示它们时,它们可能无法正确显示。我们可以利用我们的 MemberOf Active Directory 属性作为示例。Get-ADUser cmdlet 中的 MemberOf 参数返回用户所属的组。但这些可能是很多很多的群体。选择对象 cmdlet 的 -属性参数不会返回所有内容。相反,它将截断输出以指示有更多对象未显示。但是,使用 -ExpandProperty 参数将返回所有这些值(图 7.12)。
图 7.12 - 具有 Get-ADUser MemberOf 属性的扩展属性示例。
使用选择对象 cmdlet 的 -ExpandProperty 参数的缺点是,与点表示法一样,我们只能展开单个属性。那么,您可能想知道,如果我们仅限于单个属性,为什么我们会使用 Select-Object 而不是点表示法。两者都只是在字符串(纯文本)中输出属性的值,选择使用哪一个在很大程度上取决于您的首选项和样式选择。
在我们的脚本中使用它
利用我们的函数,我们将运行 Get-MailboxImportRequest 或 Get-MailboxExportRequest cmdlet,具体取决于我们传递给函数的参数。然后,我们利用 Select-Object 和 -ExpandProperty 参数只拉回 Exchange cmdlet 的状态参数。让我们看一下我们的 Tiny PowerShell 代码,如图 7.13 所示。
图 7.13 Tiny PowerShell 代码函数捕获的状态。
注意到我们的 Get-MailboxExportRequestStatus 函数的 Where-Object 部分中有几个奇怪的字符吗?$前面有小反引号和两个引号。这些字符称为转义字符。如果您不熟悉转义字符的工作原理,请参阅下面的边栏,了解有关转义字符的更多信息。
转义字符
由于特定特殊字符在 PowerShell 语言中具有唯一含义,因此有时我们需要使用转义字符。转义字符只是告诉 PowerShell 将该字符视为普通字符而不是特殊字符的一种方式(图 7.14)。PowerShell 的转义字符是反引号 ( ' ) 字符。这可能看起来像单引号或撇号。但它是标准QWERTY键盘上数字“1”键左侧的字符。
请注意,有时反引号是特殊字符的一部分。
'n,例如,我们之前曾使用它来向PowerShell指示我们要在字符串中开始一个新行。在这些情况下,反引号不会告诉 PowerShell 将字符视为普通字符,而是执行特殊功能。
图7.14 转义字符示例
7.4 交换特定组件
Microsoft Exchange建立在PowerShell后端之上。有数十个与 Exchange 相关的 cmdlet 可帮助您管理电子邮件服务。但是,因为这是PowerShell语言的一个相当特殊的应用程序;这些 cmdlet 在与典型 PowerShell 7 下载捆绑在一起的 cmdlet 中不是标准配置。
与在域控制器上本机工作的Active Directory非常相似,Exchange cmdlet在Exchange Server上最易于访问。因此,在我们介绍如何在桌面上访问联合服务(如 exchange)之前,最好在 Exchange Server 或 Exchange 管理工作站上运行大多数 Exchange 脚本。
我们将重点介绍一些与 Exchange 相关的 cmdlet:
新建邮箱导出请求获取邮箱导出请求禁用邮箱启用邮箱新建邮箱导入请求获取邮箱导入请求
我们将介绍如何使用这些脚本来执行邮箱修复。但是我们的用例只会触及 Exchange 模块功能的表面。让我们看看如何利用这些特定的 Exchange cmdlet 来修复具有单个脚本的用户邮箱。然后,如果您有兴趣了解更多信息,可以在 查看 Exchange 模块的更多详细信息。
7.4.1 新建邮箱导出请求
New-MailboxExportRequest 使用本机 PowerShell 后端创建用户邮箱的 .pst 副本。这只是备份现有用户的邮箱/日历/联系人和文件夹的一种方法(图 7.15)。
图 7.15 新建邮箱导出请求示例。
7.4.2 获取邮箱导出请求
现在我们已经向 Exchange Server 发送了备份用户邮箱的请求,我们可以利用 Get-MailBoxExportRequest 检查请求的状态。这将为您提供有关导出请求在流程中的位置的详细信息。(平均邮箱完成此步骤大约需要 5 分钟。但是非常大的邮箱可能需要更长的时间)。
此 cmdlet 可以返回许多状态。您可能期望看到的典型状态包括:
排队进行中完成失败
可以返回其他状态 每个状态都可以在 cmdlet 的帮助文件或联机帮助部分中找到。由于本书不打算深入探讨 Exchange 特定的故障排除问题,因此上面列出的四个状态是我们将重点介绍的状态。
我们对脚本感兴趣的两种状态是“已完成”和“失败”。我们在函数中有 do-till 循环来检查这两个关键状态。如果导出是排队的,我们将简单地等待,我们的 do-till 循环做得很好。如果是进行中,我们再次等待。
我们只想在状态为“完成”时继续;但是,总有可能出错。因为我们的脚本会自动禁用用户的邮箱,所以我们要非常小心,我们不会在没有备份旧 .pst 的情况下完成此步骤。
因此,如果循环返回“失败”状态,我们也将终止循环。我们的脚本正在查找此值,并将向用户写入错误消息,并在造成任何损坏之前结束脚本。
7.4.3 禁用邮箱
禁用邮箱(图 7.16)cmdlet 禁用当前用户的邮箱。用户帐户仍然存在,但邮箱不再与用户的 Active Directory 属性关联。邮箱仍然存在,可以使用连接邮箱 cmdlet 重新连接。
图 7.16 禁用邮箱 cmdlet
7.4.4 启用邮箱
启用邮箱 cmdlet 为没有关联邮箱的现有用户启用 Exchange 邮箱(图 7.17)。该 cmdlet 将所有与 Active Directory Exchange 相关的属性添加到 Active Directory 帐户,但在 Exchange 数据库中会创建一个新邮箱(因此它经常修复与 Exchange 数据库问题相关的损坏电子邮件框)。
图 7.17 启用邮箱 cmdlet
7.4.5 新建邮箱导入请求
New-MailboxImportRequest 命令启动将 .pst 文件导入现有邮箱的过程(图 7.18)。在禁用和启用新邮箱之前将旧邮箱导出到 .pst 文件后,我们现在可以复制 .pst 文件的内容,将旧邮箱的所有电子邮件、文件夹、日历和联系人无缝地导入新邮箱。
图 7.18 新建邮箱导入请求 cmdlet
7.4.6 获取邮箱导入请求
就像我们使用MailboxExportRequest时一样,我们需要一种方法来监视导入请求的状态。通常,此步骤中的故障比自动备份过程中的故障问题要小。由于 .pst 文件已经备份,如果由于某种原因自动导入失败,我们可以手动导入。
Get-MailboxImportRequest 允许我们监控 ImportRequest 的状态。和以前一样,有许多不同的状态可以返回。但总的来说,我们只关心与以前相同的四个。
排队进行中完成失败。
如果我们返回失败状态,我们的代码设置为通知我们失败并告诉我们创建的 .pst 的位置,以便系统管理员可以手动将 .pst 文件重新导入新邮箱。
7.5 把所有东西放在一起
下面介绍了所有工具如何协同工作,使我们能够使用脚本自动修复用户的 Exchange 数据库损坏。
7.5.1 创建函数
我们创建了一个名为“Get-Status”的函数(图 7.19)。此函数接受$user和$type的输入。
根据提供的$type,它将运行 Get-MailboxImportRequest 或 Get-MailboxExportRequest 来自动检查导入/导出尝试的状态。
它利用了一个称为 do-till 循环的新循环函数。循环检查状态,然后等待状态为“已完成”或“失败”。备份/导入完成后,该函数将返回“已完成”或“失败”结果。
使用函数使我们不必键入两次代码(一次用于备份,一次用于导入)。它还使脚本更容易更新,因为如果我们稍后对此进行更改;我们只需要更改一次即可影响我们以后使用该功能的任意次数。
由于PowerShell是一种解释型语言,因此在尝试使用它之前需要定义我们的函数。因此,最好在脚本开头编写所有函数,而不管以后何时在实际脚本中使用它们。
图 7.19 微型 PowerShell 代码获取状态函数。
7.5.2 获取用户信息
利用读取主机 cmdlet,我们提示脚本的操作员向我们提供要修复的用户的登录名。通过使用 Get-ADUser cmdlet,我们能够确保修复正确的电子邮件地址(图 7.20)。电子邮件地址往往很长,具有相似名称的用户可能具有非常相似的电子邮件地址。包含用户名有助于向操作员保证我们正在修复正确的邮箱。
图7.20 从Tiny PowerShell项目代码中获取用户信息
7.5.3 备份用户的邮箱
使用 Exchange 特定的 cmdlet,我们能够为提供的用户向 Exchange 服务器发出 New-MailboxExportRequest (图 7.21)。这将创建一个备份 .pst 文件,将用户的收件箱/文件夹、日历和联系人保存到 .pst 文件夹中。
图 7.21 来自 Tiny PowerShell 项目代码的新邮箱导出请求
7.5.4 等待备份完成
通过我们创建的函数,我们现在能够让 PowerShell 使用 Get-MailboxExportRequest 监视导出请求的状态(图 7.22),并等待状态读取已完成或失败。PowerShell 将每 5 秒自动重新检查一次此状态,无需操作员进一步交互。一旦返回其中一个状态,脚本就会自动继续(图 7.23、7.24 和 7.25)。
图 7.22 获取邮箱导出请求过程详解(第 1 部分)
图 7.23 获取邮箱导出请求过程详解(第 2 部分)
图 7.24 获取邮箱导出请求过程详解(第 3 部分)
图 7.25 获取邮箱导出请求过程详解(第 4 部分)
如果 Get-MailboxExportRequest 返回失败状态,脚本会检测到这种情况,并向操作员显示一条消息,指出它无法在任何数据丢失之前备份用户的邮箱(图 7.26)。
图 7.26 获取邮箱导出请求过程详解(第 5 部分)
7.5.5 禁用坏邮箱
安全备份旧邮箱后,脚本随后使用禁用邮箱 cmdlet 禁用错误邮箱(图 7.27)。这不会影响用户帐户,但会删除帐户与邮箱之间的任何关联。邮箱将断开连接,并且所有与 Exchange 相关的属性都将从 Active Directory 中的用户帐户中删除。
图 7.27 从小型 PowerShell 项目代码禁用邮箱
7.5.6 启用新邮箱
然后在 Exchange 数据库中为现有用户创建一个新邮箱(图 7.28)。然后,新邮箱将与用户的 Active Directory 帐户相关联,并自动为此新邮箱设置所有 Exchange 属性。
图 7.28 从小型 PowerShell 项目代码启用邮箱
7.5.7 从旧邮箱导入备份
然后,使用 New-MailboxImportRequest cmdlet 将旧邮箱中的 .pst 文件导入到新邮箱中(图 7.29)。这可确保新邮箱现在包含旧邮箱的所有电子邮件、文件夹、日历和联系人,以实现无缝过渡。
图 7.29 来自 Tiny PowerShell 项目代码的新邮箱导入请求
7.5.8 等待导入完成
再次利用我们创建的函数,我们能够使用 Get-MailboxImportRequest 监控邮箱导入请求的状态。该函数再次每五秒检查一次状态是否更改为“已完成”或“失败”(图 7.30、7.31 和 7.32)。
图 7.30 获取邮箱导入请求过程详解(第 1 部分)
图 7.31 获取邮箱导入请求过程详解(第 2 部分)
图 7.32 获取邮箱导入请求过程详解(第 3 部分)
如果返回“失败”消息,脚本会通知操作员导入失败,并为操作员提供之前创建的 .pst 的路径,以便更轻松地手动尝试导入 .pst 文件(图 7.33)。
图 7.33 获取邮箱导入请求过程详解(第 4 部分)
7.6 小结函数是分配有名称的 PowerShell 语句的列表。然后,可以在主脚本中调用这些代码行一次或多次。函数可以在脚本中保存大量重复代码,只需编写一次并在每次要执行这些语句时调用它。函数可以是简单的,也可以是非常动态的;能够使用循环和条件逻辑,帮助您对代码进行分支,使单个函数执行各种操作。PowerShell 中使用了多种类型的循环。虽然循环都执行相同的操作,在一个或多个目标上重复运行 PowerShell 语句,但可以运行不同类型的循环来确定目标和退出条件。一种新型循环称为 do-till 循环,其中语句在目标上执行,直到通过条件逻辑的评估实现指定的退出条件。条件逻辑不需要是单数语句,但可以在条件中包含使用 -or 的多个计算。有时,在构造复杂字符串时,需要忽略特定的键字符。您可以使用转义字符执行此操作。PowerShell 使用反引号 (') 作为转义字符。在 PowerShell 会话中加载 Exchange 模块时,可以访问许多与 Exchange 相关的 cmdlet。我们使用 New-ExportMailboxRequest、New-ImportMailboxRequest、Get-MailboxImportRequest、Get-MailboxExportRequest、Disable-Mailbox 和 Enable-Mailbox cmdlet 来备份用户的邮箱信息,修复旧数据,然后将其导入回去。“新建导出邮箱请求”和“新建导入邮箱请求”cmdlet 将用户的邮箱信息导出到 .pst 文件中,然后将此 .pst 文件分别导入到新邮箱。Get-MailboxImportRequest 和 Get-MailboxExportRequest cmdlet 分别检查邮箱导入请求和导出请求的当前状态。它们返回许多状态之一,包括但不限于“已排队”、“正在进行”、“已完成”或“失败”。禁用邮箱 cmdlet 从用户的 Active Directory 用户帐户和数据库中删除与 Exchange 邮箱和数据库的关联。启用邮箱 cmdlet 在 Exchange 中创建并启用邮箱,并在 Active Directory 用户帐户和数据库中建立所有关联以在域中使用。
标签: #outlook脱机工作