自从Exchange 2013管理Shell命令是通过远程PowerShell会话执行,导入和导出文件需要一个新的特定参数。大概有上百个Shell命令需要用到,那么这一小节,我们就看看如何使用这些参数通过远程Shell连接进行传输文件的。

传输文件工作方式:

假如你正在当前活动目录站点中创建一个边缘订阅中心到传输服务器。当你在边缘服务器上生成了xml文件后,你可以通过New-EdgeSubscription命令,具体语法如下:

[byte[]]$data = Get-Content -Path "C:\certificates\ExportedCert.pfx" `

-Encoding Byte `

-ReadCount 0

$password = Get-Credential

Import-ExchangeCertificate –FileData $data –Password $password

在这个示例中,首先文件被读入到变量$data中。而证书的导入是使用命令import-ExchangeCertificate命令,通过分配$data变量作为-FileData参数的值。

有很多的Exchange Management Shell需要用到-FileData参数,例如:

Import-DlpPolicyCollection: 用于导入DLP策略集合到组织

Import-DlpPolicyTemplate: 用于导入DLP策略模板到组织

Import-ExchangeCertificate:用于导入证书

Import-JournalRuleCollection: 用于导入Journal规则

Import-RecipientDataProperty: 用于导入图片或音频到活动目录

Import-TransportRuleCollection: 用于导入传输规则

Import-UMPrompt: 用于导入自定义音频文件到UM

下面看一个例子,假设我们需要导出活动目录中用户的照片,关联到邮箱,那么命令如下:

Export-RecipientDataProperty -Identity dsmith -Picture | %{

$_.FileData | Add-Content C:\pics\dsmith.jpg -Encoding Byte

}

当我们通过参数-Picture使用Export-RecipientDataProperty命令时,照片通过FileData属性被重新取回。照片被存储在这个属性中并作为一个Bytes array.为了导出这些数据,我们需要使用循环每个存储在FileData属性中的元素,然后通过使用Add-Content命令重构图像到外部文件中。

处理远程PowerShell并行管道

当使用远程PowerShell会话时,你可能会遇到一个问题,那就是并行管道错误。这对于很多管理员来说可能是一种常见的错误,但是你要知道,所有的Exchange Management Shell都是通过远程PowerShell完成。并行管道错误往往是反直觉的,因为相同的命令语法在一个标准的PowerShell能够正常运行。这一节,我么将看看当并行管道错误时,我们如何避免它。

远程PowerShell是不支持在同一时间执行多个管道的。当你想在一个管道中执行多条命令时,你需要把输出结果保存在变量中,然后通过管道传递到其它命令。例如,我们需要把邮箱集合通过管道传递給New-InboxRule命令,使用如下的语法避免并行管道错误:

$mailboxes = Get-Mailbox -Database “Mailbox Database 1014271532”

$mailboxes | %{

New-InboxRule -Name Attach `

-Mailbox $_ `

-HasAttachment $true `

-MarkImportance High

}

Exchange 2013 PowerShell 传输文件及并行管道_第1张图片

在上面的例子中,首先我们使用了变量$mailboxes存储了属于邮箱数据库Mailbox Database 1014271532中的邮箱集合。紧接着通过循环针对每个邮箱对象,通过管道传输$mailboxexForEach-Object命令,上面的示例中使用了%别名替代。然后,针对集合中的每个项目,只要信息中包含附件的邮件我们将它标记为重要。

一些Exchange Management Shell命令是特别设计为接受从其它命令的输出。一个很好的例子就是Get-MailboxSet-Mailbox。你可以很简单的通过管道将Get-Mailbox命令直接传递給Set-Mailbox命令,而且一些参数被自动绑定。你应该注意到,Get-MailboxNew-InboxRule没有被特别设计,那么就需要使用ForEach-Object命令,或者foreach循环语句去传递输出信息。

在一个常规的PowerShell会话中,你可以正常的通过管道将一个命令传递到另外一个命令,但是在远程PowerShell会话中,PowerShell是不支持同时执行多个管道的。

我们尝试通过管道将Get-Mailbox直接传递到ForEach-Object,会出现如下的错误:

wKiom1TSER-RStvVAAEEifMZFmQ690.jpg

但是这个在Exchange 2013 SP1后修复了,你看看如下的结果:

Exchange 2013 PowerShell 传输文件及并行管道_第2张图片

在上面的示例中,我们也可以使用如下的语法:

foreach($i in Get-Mailbox –Database ‘Mailbox Database 1014271532’) {

New-InboxRule -Name Attach `

-Mailbox $i `

-HasAttachment $true `

-MarkImportance High

}

Exchange 2013 PowerShell 传输文件及并行管道_第3张图片