PowerShell工作流Exchange Remoting

时间:2013-06-18 20:34:35

标签: powershell workflow powershell-v3.0 office365 powershell-remoting

我正在尝试从Office 365 Exchange Online并行提取数据以节省时间。我无法完成我想要做的事情,以下代码是我到目前为止“最接近”的代码。

Workflow Get-MailboxStatisticsParallel{
    param ($o365cred)

    $session = InlineScript {
        New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://ps.outlook.com/powershell/" -Credential $using:o365cred -Authentication Basic -AllowRedirection
    }

    InlineScript {
        Invoke-Command -Session $session -ScriptBlock {Get-Mailbox "Firstname Middleinitial. Lastname"}
    }
}

我定义了两个内联脚本,因为我想设置一次远程会话,然后并行调用Get-Mailbox命令以加快进程。以下是我希望工作流程看起来像的示例。

Workflow Get-MailboxStatisticsParallel{
    param ($o365cred, $mailboxes)

    $session = InlineScript {
        New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://ps.outlook.com/powershell/" -Credential $using:o365cred -Authentication Basic -AllowRedirection
    }

    ForEach -Parallel ($mailbox in $mailboxes){
        InlineScript {
            Invoke-Command -Session $using:session -ScriptBlock {param ($mailbox); Get-MailboxStatistics $mailbox.UserPrincipalName} -ArgumentList $mailbox
        }
    }

}

示例运行将如下所示。

$cred = Get-Credential

$mailboxes = Get-Mailbox -ResultSize Unlimited

Get-MailboxStatisticsParallel -o365cred $cred -mailboxes $mailboxes

以下是典型结果。

Invoke-Command : Cannot validate argument on parameter 'Session'. The argument is null or empty. Supply an argument that is not null or empty and then try 
the command again.
At Get-MailboxStatisticsParallel:7 char:7
+ 
    + CategoryInfo          : InvalidData: (:) [Invoke-Command], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand
    + PSComputerName        : [localhost]

我可以看到$ session对象正在被反序列化,我猜这是我的问题。问题是如何使用特定的Uri和ConfigurationName建立远程PowerShell会话并利用工作流程提供的功能?

2 个答案:

答案 0 :(得分:5)

我已经尝试过这项工作,但还没找到方法。

查看Running Windows PowerShell Commands in a Workflow,它说,“要在远程计算机上运行inlinescript活动中的命令,您需要在inlinescript块内建立和管理与远程计算机的连接,然后运行远程命令。“

假设我正确理解了该语句,我认为您不能在InlineScript块之外建立会话,然后在块内使用它。我尝试了几种尝试将$ session传递给InlineScript的方法,但它总是$ null。这个限制对我来说很有意义,因为我没有看到工作流如何使用一个远程会话或连接来同时在远程服务器上执行多个命令。我认为您将需要多个远程连接来执行多个远程命令。

我的猜测是,您最好的办法是建立一系列与Office 365的连接,然后使用作业并行使用每个会话执行命令。

答案 1 :(得分:2)

$using:sesssion has 3 s

将其更改为

$using:session