3

我試圖從Office 365 Exchange Online中並行提取數據以節省時間。我無法完成我期望做的事情,下面的代碼是我迄今爲止「最接近」的代碼。PowerShell工作流Exchange Remoting

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會話,並利用工作流提供的功能?

回答

5

我試過做這個工作,但還沒找到辦法。

考慮看看Running Windows PowerShell Commands in a Workflow,它說,「在遠程計算機上運行將InlineScript活動的命令,你需要建立從將InlineScript塊內管理到遠程計算機連接,然後遠程運行的命令。」

假設我正確理解該語句,我認爲您不能在InlineScript塊之外建立會話,然後在塊內部使用它。我嘗試了幾種嘗試將$ session傳入InlineScript的方法,但它總是$ null。這個限制對我來說很有意義,因爲我看不到Workflow如何使用一個遠程會話或連接來同時在遠程服務器上執行多個命令。我認爲你將需要多個遠程連接來執行多個遠程命令。

我的猜測是,您最好打賭的是建立一系列與Office 365的連接,然後使用作業以並行方式使用每個會話執行命令。

+0

我想你是對這個,我一直沒能找到一個解決辦法。這是我嘗試使用$ session變量時看到的。 Invoke-Command:無法綁定參數'Session'。無法將類型爲 「Deserialized.System.Management.Automation.Runspaces.PSSession」的「[PSSession] Session1」值轉換爲鍵入「System.Management.Automation.Runspaces.PSSession」。 –

2
$using:sesssion has 3 s 

將其更改爲

$using:session 
+0

謝謝你指出,我做了更正。不幸的是這不是問題。 –