2016-09-14 2 views
1

Nous avons deux sessions PSSession qui doivent être établies et importées dans la session en cours avant que notre script puisse continuer. Les deux étapes nécessitent environ 10 à 15 secondes pour un total de 20 à 30 secondes en série.Nouvelle exécution de Parallels PSSession

Est-il possible d'exécuter New-PSSession dans un espace d'exécution distinct, puis d'importer en quelque sorte cette session établie dans le processus parent?

Par exemple le changement de ceci:

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 

Pour peut-être quelque chose comme ça (avertissement cela ne fonctionne pas):

$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 

Le but ultime est de faire prendre ce moins de temps, la idée étant si nous utilisons New-PSSession en parallèle il se termine en 10 - 15 secondes au lieu de 20 - 30 secondes en série. Je serais heureux avec toute réponse qui accomplit cela, il n'a pas besoin d'utiliser des espaces de course.

EDIT: Ajout des objectifs

+1

regard vers ce site web. https://technet.microsoft.com/en-us/library/hh849717.aspx Vous pouvez créer plusieurs URL de connexion et l'affecter à d'autres objets, puis poursuivre l'exécution. –

+2

Ou sinon, vous pouvez utiliser le bloc de script Invoke-Command –

+0

Salut @ShankarShastri, je ne suis pas sûr d'avoir bien compris vos suggestions, cela vous dérange-t-il de donner un exemple? –

Répondre

2

de crédit va à @ShankarShastri pour nous pointer dans la bonne direction. Le commandlet New-PSSession prend en charge la prise d'un tableau d'URI ou de ComputerNames en entrée. J'ai eu des serveurs pour effectuer le test au lieu de URIs, mais jetez un oeil à cette:

$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 

Cela montre New-PSSession course 7 fois contre l'exécution New-PSSession une fois et la fourniture de 7 computernames. La différence est environ 6 fois plus rapide, ce qui implique que les connexions sont effectuées de manière asynchrone.

Donc dans votre cas, vous pouvez probablement accomplir ce que vous voulez en exécutant quelque chose comme:

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