2016-09-14 3 views
1

Wir haben zwei PSSessions, die eingerichtet und in die aktuelle Sitzung importiert werden müssen, bevor unser Skript fortfahren kann. Beide Schritte benötigen jeweils etwa 10 - 15 Sekunden für insgesamt 20 - 30 Sekunden, wenn sie in Serie laufen.New-PSSession Parellel Ausführung

Ist es möglich, New-PSSession in einem separaten Runspace auszuführen und diese erstellte Sitzung dann irgendwie in den übergeordneten Prozess zu importieren?

Zum Beispiel ändern sich daraus:

New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri ("https://$($service)/PowerShell/") -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop 

New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop 

Um möglicherweise so etwas wie dieses (Warnung dies nicht funktioniert):

$credential = Get-Credential 

$scriptblock = 
{ 
     param ([string]$Credential) 

     $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop 
     return $session 
} 


$shell = [PowerShell]::Create().AddScript($scriptblock).AddParameter($credential) 

$job = $shell.BeginInvoke() 
$result = $shell.EndInvoke($job) 

Import-PSSession $result 

Das ultimative Ziel ist es, weniger Zeit in Anspruch nehmen zu machen, die Wenn wir New-PSSession parallel verwenden, dauert es 10 - 15 Sekunden statt 20 - 30 Sekunden in Serie. Ich wäre glücklich mit jeder Antwort, die dies bewirkt, es muss keine Runspaces verwenden.

EDIT: Hinzugefügt Ziele

+1

Blick in diese Webseite. https://technet.microsoft.com/en-us/library/hh849717.aspx Sie können mehrere ConnectionURI erstellen und an anderen Objekten zuweisen und dann die Ausführung fortzusetzen. –

+2

Oder sonst können Sie Invoke-Command Skriptblock verwenden –

+0

Hi @ShankarShastri, ich bin nicht sicher, ob ich Ihre Vorschläge vollständig verstanden habe. Macht es Ihnen etwas aus, ein Beispiel zu geben? –

Antwort

2

Kredit geht an @ShankarShastri für uns in die richtige Richtung. Das New-PSSession-Commandlet unterstützt die Eingabe eines Arrays von URIs oder ComputerNames. Ich hatte Server gegen anstelle von URIs zu testen, aber einen Blick auf diese:

$cred = Get-Credential DOMAIN\user 

$servers = 
"server1.domain.company.com", 
"server2.domain.company.com", 
"server3.domain.company.com", 
"server4.domain.company.com", 
"server5.domain.company.com", 
"server6.domain.company.com", 
"server7.domain.company.com" 

(Measure-Command { 
    foreach($s in $servers) { $temp = New-PSSession -ComputerName $s -Authentication Negotiate -Credential $cred } 
}).TotalSeconds 

# 2.987739 

(Measure-Command { 
    $s1, $s2, $s3, $s4, $s5, $s6, $s7 = New-PSSession -ComputerName $servers -Authentication Negotiate -Credential $cred 
}).TotalSeconds 

# 0.5793281 

Das New-PSSession Lauf 7 mal zeigt vs New-PSSession einmal ausgeführt und liefert 7 ComputerNames. Der Unterschied ist ungefähr 6 mal schneller, was bedeutet, dass die Verbindungen asynchron hergestellt werden.

Also in Ihrem Fall, können Sie wahrscheinlich erreichen, was Sie wollen, indem etwas wie Laufen:

$sessions1, $sessions2 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri ("https://$($service)/PowerShell/"),"https://outlook.office365.com/powershell-liveid/" -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop