Condividi tramite


Invoke-Command

Esegue comandi in computer locali e remoti.

Sintassi

Invoke-Command
      [-ScriptBlock] <ScriptBlock>
      [-NoNewScope]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <String[]>]
      [-Credential <PSCredential>]
      [-Port <Int32>]
      [-UseSSL]
      [-ConfigurationName <String>]
      [-ApplicationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <String[]>]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <String[]>]
      [-Credential <PSCredential>]
      [-Port <Int32>]
      [-UseSSL]
      [-ConfigurationName <String>]
      [-ApplicationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <String[]>]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <String>]
      [<CommonParameters>]
Invoke-Command
      [-Credential <PSCredential>]
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [[-ConnectionUri] <Uri[]>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <String>]
      [<CommonParameters>]
Invoke-Command
      [-Credential <PSCredential>]
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [[-ConnectionUri] <Uri[]>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMGuid] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMGuid] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]

Descrizione

Il Invoke-Command cmdlet esegue comandi in un computer locale o remoto e restituisce tutti gli output dei comandi, inclusi gli errori. Usando un singolo Invoke-Command comando, è possibile eseguire comandi in più computer.

Per eseguire un singolo comando in un computer remoto, usare il parametro ComputerName. Per eseguire una serie di comandi correlati che condividono dati, usare il New-PSSession cmdlet per creare una sessione PSSession (una connessione permanente) nel computer remoto e quindi usare il parametro Session di per Invoke-Command eseguire il comando in PSSession. Per eseguire un comando in una sessione disconnessa, usare il parametro InDisconnectedSession. Per eseguire un comando in un processo in background, usare il parametro AsJob.

È anche possibile usare Invoke-Command in un computer locale per un blocco di script come comando. PowerShell esegue immediatamente il blocco di script in un ambito figlio dell'ambito corrente.

Prima di usare Invoke-Command per eseguire i comandi in un computer remoto, leggere about_Remote.

Alcuni esempi di codice usano lo splatting per ridurre la lunghezza della riga. Per altre informazioni, vedere about_Splatting.

Esempio

Esempio 1: Eseguire uno script in un server

In questo esempio viene eseguito lo Test.ps1 script nel computer Server01.

Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01

Il parametro FilePath specifica uno script che si trova nel computer locale. Lo script viene eseguito nel computer remoto e i risultati vengono restituiti al computer locale.

Esempio 2: Eseguire un comando in un server remoto

In questo esempio viene eseguito un Get-Culture comando nel computer remoto Server01.

Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }

Il parametro ComputerName specifica il nome del computer remoto. Il parametro Credential viene usato per eseguire il comando nel contesto di sicurezza di Domain01\User01, un utente che dispone dell'autorizzazione per eseguire i comandi. Il parametro ScriptBlock specifica il comando da eseguire nel computer remoto.

In risposta, PowerShell richiede la password e un metodo di autenticazione per l'account User01. Esegue quindi il comando nel computer Server01 e restituisce il risultato.

Esempio 3: Eseguire un comando in una connessione permanente

Questo esempio esegue lo stesso Get-Culture comando in una sessione, usando una connessione permanente, nel computer remoto denominato Server02.

$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01
Invoke-Command -Session $s -ScriptBlock {Get-Culture}

Il New-PSSession cmdlet crea una sessione nel computer remoto Server02 e la salva nella $s variabile . In genere, si crea una sessione solo quando si esegue una serie di comandi nel computer remoto.

Il Invoke-Command cmdlet esegue il Get-Culture comando in Server02. Il parametro Session specifica la sessione salvata nella $s variabile .

In risposta, PowerShell esegue il comando nella sessione nel computer Server02.

Esempio 4: Usare una sessione per eseguire una serie di comandi che condividono dati

In questo esempio vengono confrontati gli effetti dell'utilizzo dei parametri ComputerName e Session di Invoke-Command. Mostra come usare una sessione per eseguire una serie di comandi che condividono gli stessi dati.

Invoke-Command -ComputerName Server02 -ScriptBlock {$p = Get-Process PowerShell}
Invoke-Command -ComputerName Server02 -ScriptBlock {$p.VirtualMemorySize}
$s = New-PSSession -ComputerName Server02
Invoke-Command -Session $s -ScriptBlock {$p = Get-Process PowerShell}
Invoke-Command -Session $s -ScriptBlock {$p.VirtualMemorySize}

17930240

I primi due comandi usano il parametro ComputerName di Invoke-Command per eseguire i comandi nel computer remoto Server02. Il primo comando usa il Get-Process cmdlet per ottenere il processo di PowerShell nel computer remoto e salvarlo nella $p variabile. Il secondo comando ottiene il valore della proprietà VirtualMemorySize del processo di PowerShell.

Quando si usa il parametro ComputerName , PowerShell crea una nuova sessione per eseguire il comando. La sessione viene chiusa al termine del comando. La $p variabile è stata creata in una connessione, ma non esiste nella connessione creata per il secondo comando.

Il problema viene risolto creando una sessione permanente nel computer remoto, quindi eseguendo entrambi i comandi nella stessa sessione.

Il New-PSSession cmdlet crea una sessione permanente nel computer Server02 e salva la sessione nella $s variabile . Le Invoke-Command righe che seguono usano il parametro Session per eseguire entrambi i comandi nella stessa sessione. Poiché entrambi i comandi vengono eseguiti nella stessa sessione, il $p valore rimane attivo.

Esempio 5: immettere un comando archiviato in una variabile locale

In questo esempio viene illustrato come creare un comando archiviato come blocco di script in una variabile locale. Quando il blocco di script viene salvato in una variabile locale, è possibile specificare la variabile come valore del parametro ScriptBlock .

$command = { Get-EventLog -LogName "Windows PowerShell" |
  Where-Object {$_.Message -like "*certificate*"} }
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command

La $command variabile archivia il Get-EventLog comando formattato come blocco di script. Invoke-Command Esegue il comando archiviato nei $command computer remoti S1 e S2.

Esempio 6: Eseguire un singolo comando in diversi computer

In questo esempio viene illustrato come usare Invoke-Command per eseguire un singolo comando in più computer.

$parameters = @{
  ComputerName = "Server01", "Server02", "TST-0143", "localhost"
  ConfigurationName = 'MySession.PowerShell'
  ScriptBlock = { Get-EventLog "Windows PowerShell" }
}
Invoke-Command @parameters

Il parametro ComputerName consente di specificare un elenco delimitato da virgole di nomi di computer. L'elenco dei computer include il valore localhost, che rappresenta il computer locale. Il parametro ConfigurationName specifica una configurazione di sessione alternativa. Il parametro ScriptBlock viene eseguito Get-EventLog per ottenere i registri eventi Windows PowerShell da ogni computer.

Esempio 7: Ottenere la versione del programma host in più computer

Questo esempio ottiene la versione del programma host di PowerShell in esecuzione su 200 computer remoti.

$version = Invoke-Command -ComputerName (Get-Content Machines.txt) -ScriptBlock {(Get-Host).Version}

Poiché viene eseguito un solo comando, non è necessario creare connessioni persistenti a ognuno dei computer. Il comando usa invece il parametro ComputerName per indicare i computer. Per specificare i computer, usa il Get-Content cmdlet per ottenere il contenuto del file Machine.txt, un file di nomi computer.

Il Invoke-Command cmdlet esegue un Get-Host comando nei computer remoti. Usa la notazione punto per ottenere la proprietà Version dell'host di PowerShell.

Questi comandi eseguono uno alla volta. Al termine dei comandi, l'output dei comandi di tutti i computer viene salvato nella $version variabile . L'output include il nome del computer da cui hanno origine i dati.

Esempio 8: Eseguire un processo in background in diversi computer remoti

In questo esempio viene eseguito un comando in due computer remoti. Il Invoke-Command comando usa il parametro AsJob in modo che il comando venga eseguito come processo in background. I comandi vengono eseguiti nei computer remoti, ma il processo esiste nel computer locale. I risultati vengono trasmessi al computer locale.

$s = New-PSSession -ComputerName Server01, Server02
Invoke-Command -Session $s -ScriptBlock {Get-EventLog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        ---------------
1    Job1    Running    True          Server01,Server02  Get-EventLog system

$j = Get-Job
$j | Format-List -Property *

HasMoreData   : True
StatusMessage :
Location      : Server01,Server02
Command       : Get-EventLog system
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : e124bb59-8cb2-498b-a0d2-2e07d4e030ca
Id            : 1
Name          : Job1
ChildJobs     : {Job2, Job3}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

$results = $j | Receive-Job

Il New-PSSession cmdlet crea sessioni nei computer remoti Server01 e Server02. Il Invoke-Command cmdlet esegue un processo in background in ognuna delle sessioni. Il comando usa il parametro AsJob per eseguire il comando come processo in background. Questo comando restituisce un oggetto processo che contiene due oggetti processo figlio, uno per ogni processo eseguito nei due computer remoti.

Il Get-Job comando salva l'oggetto processo nella $j variabile . La $j variabile viene quindi inviata tramite pipe al Format-List cmdlet per visualizzare tutte le proprietà dell'oggetto processo in un elenco. L'ultimo comando ottiene i risultati dei processi. Invia tramite pipe l'oggetto processo in $j al Receive-Job cmdlet e archivia i risultati nella $results variabile .

Esempio 9: Includere variabili locali in un comando eseguito in un computer remoto

Questo esempio mostra come includere i valori delle variabili locali in un comando eseguito in un computer remoto. Il comando usa il Using modificatore di ambito per identificare una variabile locale in un comando remoto. Per impostazione predefinita, si suppone che tutte le variabili siano definite nella sessione remota. Il Using modificatore di ambito è stato introdotto in PowerShell 3.0. Per altre informazioni sul modificatore di Using ambito, vedere about_Remote_Variables e about_Scopes.

$Log = "Windows PowerShell"
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-EventLog -LogName $Using:Log -Newest 10 }

La $Log variabile archivia il nome del registro eventi Windows PowerShell. Il Invoke-Command cmdlet viene eseguito Get-EventLog in Server01 per ottenere i dieci eventi più recenti dal registro eventi. Il valore del parametro LogName è la $Log variabile , preceduta dal modificatore dell'ambito Using per indicare che è stata creata nella sessione locale, non nella sessione remota.

Esempio 10: Nascondere il nome del computer

In questo esempio viene illustrato l'effetto dell'utilizzo del parametro HideComputerName di Invoke-Command. HideComputerName non modifica l'oggetto restituito da questo cmdlet. Cambia solo lo schermo. È comunque possibile utilizzare i cmdlet Format per visualizzare la proprietà PsComputerName di uno qualsiasi degli oggetti interessati.

Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell}

PSComputerName    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
--------------    -------  ------    -----      ----- -----   ------     --   -----------
S1                575      15        45100      40988   200     4.68     1392 PowerShell
S2                777      14        35100      30988   150     3.68     67   PowerShell

Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell} -HideComputerName

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
-------  ------    -----      ----- -----   ------     --   -----------
575      15        45100      40988   200     4.68     1392 PowerShell
777      14        35100      30988   150     3.68     67   PowerShell

I primi due comandi usano Invoke-Command per eseguire un Get-Process comando per il processo di PowerShell. L'output del primo comando include la proprietà PsComputerName, che contiene il nome del computer in cui è stato eseguito il comando. L'output del secondo comando, che usa HideComputerName, non include la colonna PsComputerName .

Esempio 11: Usare la parola chiave Param in un blocco di script

La Param parola chiave e il parametro ArgumentList vengono usati per passare i valori delle variabili ai parametri denominati in un blocco di script. In questo esempio vengono visualizzati i nomi di file che iniziano con la lettera a e hanno l'estensione .pdf .

Per altre informazioni sulla Param parola chiave, vedere about_Language_Keywords.

$parameters = @{
    ComputerName = "Server01"
    ScriptBlock = { Param ($param1,$param2) Get-ChildItem -Name $param1 -Include $param2 }
    ArgumentList = "a*", "*.pdf"
}
Invoke-Command @parameters

aa.pdf
ab.pdf
ac.pdf
az.pdf

Invoke-Command usa il parametro ScriptBlock che definisce due variabili, $param1 e $param2. Get-ChildItem usa i parametri denominati, Name e Include con i nomi delle variabili. ArgumentList passa i valori alle variabili.

Esempio 12: Usare la variabile automatica $args in un blocco di script

La $args variabile automatica e il parametro ArgumentList vengono usati per passare i valori della matrice alle posizioni dei parametri in un blocco di script. In questo esempio viene visualizzato il contenuto della directory di un server dei .txt file. Il Get-ChildItem parametro Path è posizione 0 e il parametro Filter è posizione 1.

Per altre informazioni sulla $args variabile, vedere about_Automatic_Variables

$parameters = @{
    ComputerName = "Server01"
    ScriptBlock = { Get-ChildItem $args[0] $args[1] }
    ArgumentList = "C:\Test", "*.txt*"
}
Invoke-Command @parameters

Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           6/12/2019    15:15            128 alog.txt
-a---           7/27/2019    15:16            256 blog.txt
-a---           9/28/2019    17:10             64 zlog.txt

Invoke-Command usa un parametro ScriptBlock e Get-ChildItem specifica i $args[0] valori e $args[1] della matrice. ArgumentList passa i valori della $args matrice alle posizioni dei Get-ChildItem parametri per Path e Filter.

Esempio 13: Eseguire uno script in tutti i computer elencati in un file di testo

In questo esempio viene usato il cmdlet per eseguire lo Invoke-CommandSample.ps1 script in tutti i computer elencati nel Servers.txt file. Il comando usa il parametro FilePath per specificare il file di script. Questo comando consente di eseguire lo script nei computer remoti, anche se il file di script non è accessibile ai computer remoti.

Invoke-Command -ComputerName (Get-Content Servers.txt) -FilePath C:\Scripts\Sample.ps1 -ArgumentList Process, Service

Quando si invia il comando, il contenuto del Sample.ps1 file viene copiato in un blocco di script e il blocco di script viene eseguito in ognuno dei computer remoti. Questa procedura equivale all'uso del parametro ScriptBlock per inviare il contenuto dello script.

Esempio 14: Eseguire un comando in un computer remoto usando un URI

In questo esempio viene illustrato come eseguire un comando in un computer remoto identificato da un URI (Uniform Resource Identifier). Questo esempio specifico esegue un Set-Mailbox comando in un server Exchange remoto.

$LiveCred = Get-Credential
$parameters = @{
  ConfigurationName = 'Microsoft.Exchange'
  ConnectionUri = 'https://ps.exchangelabs.com/PowerShell'
  Credential = $LiveCred
  Authentication = 'Basic'
  ScriptBlock = {Set-Mailbox Dan -DisplayName "Dan Park"}
}
Invoke-Command @parameters

La prima riga usa il Get-Credential cmdlet per archiviare le credenziali di Windows Live ID nella $LiveCred variabile. PowerShell richiede all'utente di immettere le credenziali di Windows Live ID.

La $parameters variabile è una tabella hash contenente i parametri da passare al Invoke-Command cmdlet. Il Invoke-Command cmdlet esegue un Set-Mailbox comando usando la configurazione della sessione di Microsoft.Exchange . Il parametro ConnectionURI specifica l'URL dell'endpoint del server di Exchange. Il parametro Credential specifica le credenziali archiviate nella $LiveCred variabile. Il parametro AuthenticationMechanism specifica l'uso dell'autenticazione di base. Il parametro ScriptBlock specifica un blocco di script che contiene il comando.

Esempio 15: Usare un'opzione di sessione

In questo esempio viene illustrato come creare e usare un parametro SessionOption .

$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Invoke-Command -ComputerName server01 -UseSSL -ScriptBlock { Get-HotFix } -SessionOption $so -Credential server01\user01

Il New-PSSessionOption cmdlet crea un oggetto opzione sessione che causa la mancata verifica dell'autorità di certificazione, del nome canonico e della revoca Elenchi durante la valutazione della connessione HTTPS in ingresso. L'oggetto SessionOption viene salvato nella $so variabile.

Nota

La disabilitazione di questi controlli è utile per la risoluzione dei problemi, ma ovviamente non è sicura.

Il Invoke-Command cmdlet esegue un Get-HotFix comando in remoto. Il parametro SessionOption viene assegnato alla $so variabile.

Esempio 16: Gestire il reindirizzamento URI in un comando remoto

In questo esempio viene illustrato come usare i parametri AllowRedirection e SessionOption per gestire il reindirizzamento URI in un comando remoto.

$max = New-PSSessionOption -MaximumRedirection 1
$parameters = @{
  ConnectionUri = "https://ps.exchangelabs.com/PowerShell"
  ScriptBlock = { Get-Mailbox dan }
  AllowRedirection = $true
  SessionOption = $max
}
Invoke-Command @parameters

Il New-PSSessionOption cmdlet crea un oggetto PSSessionOption salvato nella $max variabile. Il comando usa il parametro MaximumRedirection per impostare la proprietà MaximumConnectionRedirectionCount dell'oggetto PSSessionOption su 1.

Il Invoke-Command cmdlet esegue un Get-Mailbox comando in un Microsoft Exchange Server remoto. Il parametro AllowRedirection fornisce autorizzazioni esplicite per reindirizzare la connessione a un endpoint alternativo. Il parametro SessionOption usa l'oggetto sessione archiviato nella $max variabile.

Di conseguenza, se il computer remoto specificato da ConnectionURI restituisce un messaggio di reindirizzamento, PowerShell reindirizza la connessione, ma se la nuova destinazione restituisce un altro messaggio di reindirizzamento, il valore del conteggio di reindirizzamento di 1 viene superato e Invoke-Command restituisce un errore non terminante.

Esempio 17: Accedere a una condivisione di rete in una sessione remota

In questo esempio viene illustrato come accedere a una condivisione di rete da una sessione remota. Tre computer vengono usati per illustrare l'esempio. Server01 è il computer locale, Server02 è il computer remoto e Net03 contiene la condivisione di rete. Server01 si connette a Server02 e server02 esegue un secondo hop a Net03 per accedere alla condivisione di rete. Per altre informazioni sul modo in cui PowerShell Remoting supporta gli hop tra i computer, vedere Creazione del secondo hop nella comunicazione remota di PowerShell.

La delega del provider di supporto per la sicurezza delle credenziali (CredSSP) richiesta è abilitata nelle impostazioni client nel computer locale e nelle impostazioni del servizio nel computer remoto. Per eseguire i comandi in questo esempio, è necessario essere un membro del gruppo Administrators nel computer locale e nel computer remoto.

Enable-WSManCredSSP -Role Client -DelegateComputer Server02
$s = New-PSSession Server02
Invoke-Command -Session $s -ScriptBlock {Enable-WSManCredSSP -Role Server -Force}
$parameters = @{
  Session = $s
  ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }
  Authentication = "CredSSP"
  Credential = "Domain01\Admin01"
}
Invoke-Command @parameters

Il Enable-WSManCredSSP cmdlet abilita la delega CredSSP dal computer locale Server01 al computer remoto Server02. Il parametro Role specifica client per configurare l'impostazione client CredSSP nel computer locale.

New-PSSession crea un oggetto PSSession per Server02 e archivia l'oggetto nella $s variabile.

Il Invoke-Command cmdlet usa la $s variabile per connettersi al computer remoto Server02. Il parametro ScriptBlock viene eseguito Enable-WSManCredSSP nel computer remoto. Il parametro Role specifica server per configurare l'impostazione del server CredSSP nel computer remoto.

La $parameters variabile contiene i valori dei parametri da connettere alla condivisione di rete. Il Invoke-Command cmdlet esegue un Get-Item comando nella sessione in $s. Questo comando ottiene uno script dalla \\Net03\Scripts condivisione di rete. Il comando usa il parametro Authentication con un valore credSSP e il parametro Credential con un valore Domain01\Admin01.

Esempio 18: Avviare script in molti computer remoti

In questo esempio viene eseguito uno script su più di cento computer. Per ridurre al minimo l'impatto sul computer locale, si connette a ogni computer, avvia lo script e quindi si disconnette da ogni computer. L'esecuzione dello script continua nelle sessioni disconnesse.

$parameters = @{
  ComputerName = (Get-Content -Path C:\Test\Servers.txt)
  InDisconnectedSession = $true
  FilePath = "\\Scripts\Public\ConfigInventory.ps1"
  SessionOption = @{OutputBufferingMode="Drop";IdleTimeout=43200000}
}
Invoke-Command @parameters

Il comando usa Invoke-Command per eseguire lo script. Il valore del parametro ComputerName è un Get-Content comando che ottiene i nomi dei computer remoti da un file di testo. Il parametro InDisconnectedSession disconnette le sessioni non appena viene avviato il comando. Il valore del parametro FilePath è lo script Invoke-Command eseguito in ogni computer.

Il valore di SessionOption è una tabella hash. Il valore OutputBufferingMode è impostato su Drop e il valore IdleTimeout è impostato su 43200000 millisecondi (12 ore).

Per ottenere i risultati dei comandi e degli script eseguiti nelle sessioni disconnesse, usare il Receive-PSSession cmdlet.

Parametri

-AllowRedirection

Consente il reindirizzamento della connessione a un URI (Uniform Resource Identifier) alternativo.

Quando si usa il parametro ConnectionURI, la destinazione remota può restituire un'istruzione per il reindirizzamento a un URI diverso. Per impostazione predefinita, PowerShell non reindirizza le connessioni, ma è possibile usare questo parametro per consentire il reindirizzamento della connessione.

È anche possibile limitare il numero di reindirizzamenti della connessione modificando il valore di opzione della sessione MaximumConnectionRedirectionCount. Utilizzare il parametro MaximumRedirection del New-PSSessionOption cmdlet o impostare la proprietà MaximumConnectionRedirectionCount della $PSSessionOption variabile di preferenza. Il valore predefinito è 5.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ApplicationName

Specifica il segmento dell'URI di connessione corrispondente al nome dell'applicazione. Usare questo parametro per specificare il nome dell'applicazione quando non si usa il parametro ConnectionURI nel comando.

Il valore predefinito è il valore della $PSSessionApplicationName variabile di preferenza nel computer locale. Se questa variabile di preferenza non è definita, il valore predefinito è WSMAN. Questo valore è appropriato per la maggior parte degli utilizzi. Per altre informazioni, vedere about_Preference_Variables.

Il servizio Gestione remota Windows usa il nome dell'applicazione per selezionare un listener per soddisfare la richiesta di connessione. Il valore di questo parametro deve corrispondere al valore della proprietà URLPrefix di un listener nel computer remoto.

Type:String
Position:Named
Default value:$PSSessionApplicationName if set on the local computer, otherwise WSMAN
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ArgumentList

Fornisce i valori delle variabili locali nel comando. Le variabili nel comando vengono sostituite da questi valori prima dell'esecuzione del comando nel computer remoto. Immettere i valori in un elenco delimitati da virgole. I valori sono associati alle variabili nell'ordine in cui sono elencati. L'alias per ArgumentList è Args.

I valori del parametro ArgumentList possono essere valori effettivi, ad esempio 1024, oppure possono essere riferimenti a variabili locali, ad esempio $max.

Per usare variabili locali in un comando, usare il formato seguente:

{param($<name1>[, $<name2>]...) <command-with-local-variables>} -ArgumentList <value> -oppure- <local-variable>

La parola chiave param elenca le variabili locali usate nel comando. ArgumentList fornisce i valori delle variabili, nell'ordine in cui sono elencati.

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-AsJob

Indica che questo cmdlet esegue il comando come processo in background in un computer remoto. Usare questo parametro per eseguire i comandi che richiedono molto tempo per completare.

Quando si usa il parametro AsJob , il comando restituisce un oggetto che rappresenta il processo e quindi visualizza il prompt dei comandi. È possibile continuare a lavorare nella sessione mentre il processo viene completato. Per gestire il processo, usare i *-Job cmdlet. Per ottenere i risultati del processo, usare il Receive-Job cmdlet.

Il parametro AsJob è simile all'uso del Invoke-Command cmdlet per eseguire un Start-Job cmdlet in remoto. Tuttavia, con AsJob, il processo viene creato nel computer locale, anche se il processo viene eseguito in un computer remoto. I risultati del processo remoto vengono restituiti automaticamente al computer locale.

Per altre informazioni sui processi in background di PowerShell, vedere about_Jobs e about_Remote_Jobs.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Authentication

Specifica il meccanismo usato per autenticare le credenziali dell'utente. L'autenticazione CredSSP è disponibile solo in Windows Vista, Windows Server 2008 e versioni successive del sistema operativo Windows.

I valori accettabili per questo parametro sono i seguenti:

  • Default
  • Basic
  • Credssp
  • Digest
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

Il valore predefinito è Default.

Per altre informazioni sui valori di questo parametro, vedere Enumerazione AuthenticationMechanism.

Attenzione

l'autenticazione CredSSP (Credential Security Support Provider), in cui le credenziali dell'utente vengono passate a un computer remoto per l'autenticazione, è progettata per i comandi che richiedono l'autenticazione in più di una risorsa, come nel caso dell'accesso a una condivisione di rete remota. Questo meccanismo aumenta il rischio per la sicurezza dell'operazione remota. Se infatti il computer remoto viene compromesso, le credenziali che gli vengono passate possono essere usate per controllare la sessione di rete. Per altre informazioni, vedere Provider di supporto per la sicurezza delle credenziali.

Type:AuthenticationMechanism
Accepted values:Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos
Position:Named
Default value:Default
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CertificateThumbprint

Specifica il certificato di chiave pubblica digitale (X509) di un account utente che dispone dell'autorizzazione per la connessione alla sessione disconnessa. Immettere l'identificazione personale del certificato.

I certificati vengono usati nell'autenticazione basata sui certificati client. Possono essere mappati solo agli account utente locali e non funzionano con gli account di dominio.

Per ottenere un'identificazione personale del certificato, usare un Get-Item comando o Get-ChildItem nell'unità Cert di PowerShell.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ComputerName

Specifica i computer in cui viene eseguito il comando. Il valore predefinito è il computer locale.

Quando si usa il parametro ComputerName , PowerShell crea una connessione temporanea usata solo per eseguire il comando specificato e quindi viene chiusa. Se è necessaria una connessione persistente, usare il parametro Session .

Digitare il nome NETBIOS, un indirizzo IP o un nome di dominio completo di uno o più computer in un elenco delimitato da virgole. Per specificare il computer locale, digitare il nome del computer, localhost o un punto (.).

Per usare un indirizzo IP nel valore computerName, il comando deve includere il parametro Credential . Il computer deve essere configurato per il trasporto HTTPS o l'indirizzo IP del computer remoto deve essere incluso nell'elenco WinRM TrustedHosts del computer locale. Per istruzioni per aggiungere un nome computer all'elenco TrustedHosts , vedere Come aggiungere un computer all'elenco host attendibile.

In Windows Vista e versioni successive del sistema operativo Windows, per includere il computer locale nel valore di ComputerName, è necessario eseguire PowerShell usando l'opzione Esegui come amministratore .

Type:String[]
Aliases:Cn
Position:0
Default value:Local computer
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ConfigurationName

Specifica la configurazione della sessione usata per la nuova sessione PSSession.

Immettere un nome di configurazione o l'URI di risorsa completo per una configurazione di sessione. Se si specifica solo il nome di configurazione, l'URI dello schema seguente viene prependato: https://schemas.microsoft.com/PowerShell.

La configurazione di sessione per una sessione si trova nel computer remoto. Se la configurazione della sessione specificata non esiste nel computer remoto, il comando ha esito negativo.

Il valore predefinito è il valore della $PSSessionConfigurationName variabile di preferenza nel computer locale. Se questa variabile di preferenza non è impostata, il valore predefinito è Microsoft.PowerShell. Per altre informazioni, vedere about_Preference_Variables.

Type:String
Position:Named
Default value:$PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ConnectionUri

Specifica un URI (Uniform Resource Identifier) che definisce l'endpoint di connessione della sessione. L'URI deve essere completo.

Il formato di questa stringa è il seguente:

<Transport>://<ComputerName>:<Port>/<ApplicationName>

Il valore predefinito è il seguente:

https://localhost:5985/WSMAN

Se non si specifica un URI di connessione, è possibile usare i parametri UseSSL e Port per specificare i valori dell'URI di connessione.

I valori validi per il segmento Transport dell'URI sono HTTP e HTTPS. Se si specifica un URI di connessione con un segmento di trasporto, ma non si specifica una porta, la sessione viene creata con le porte standard: 80 per HTTP e 443 per HTTPS. Per usare le porte predefinite per la comunicazione remota di PowerShell, specificare la porta 5985 per HTTP o 5986 per HTTPS.

Se il computer di destinazione reindirizza la connessione a un URI diverso, PowerShell impedisce il reindirizzamento a meno che non si usi il parametro AllowRedirection nel comando.

Type:Uri[]
Aliases:URI, CU
Position:0
Default value:https://localhost:5985/WSMAN
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Credential

Specifica un account utente che dispone delle autorizzazioni per eseguire questa azione. Il valore predefinito è l'utente corrente.

Digitare un nome utente, ad esempio User01 o Domain01\User01, In alternativa, immettere un oggetto PSCredential , ad esempio uno generato dal Get-Credential cmdlet. Se si digita un nome utente, questo cmdlet richiede una password.

Type:PSCredential
Position:Named
Default value:Current user
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-EnableNetworkAccess

Indica che questo cmdlet aggiunge un token di sicurezza interattivo alle sessioni di loopback. Il token interattivo consente di eseguire comandi nella sessione di loopback che ottengono dati da altri computer. Ad esempio, è possibile eseguire un comando nella sessione che copia file XML da un computer remoto al computer locale.

Una sessione di loopback è una sessione PSSession che ha origine e termina nello stesso computer. Per creare una sessione di loopback, omettere il parametro ComputerName o impostarne il valore su dot (.), localhost o il nome del computer locale.

Per impostazione predefinita, le sessioni di loopback vengono create usando un token di rete, che potrebbe non fornire autorizzazioni sufficienti per l'autenticazione ai computer remoti.

Il parametro EnableNetworkAccess è efficace solo nelle sessioni di loopback. Se si usa EnableNetworkAccess quando si crea una sessione in un computer remoto, il comando ha esito positivo, ma il parametro viene ignorato.

È possibile consentire l'accesso remoto in una sessione di loopback usando il valore CredSSP del parametro Authentication , che delega le credenziali di sessione ad altri computer.

Per proteggere il computer da accessi dannosi, le sessioni di loopback disconnesse con token interattivi, che sono quelle create tramite EnableNetworkAccess, possono essere riconnesse solo dal computer in cui è stata creata la sessione. Le sessioni disconnesse che usano l'autenticazione CredSSP possono essere riconnesse da altri computer. Per altre informazioni, vedere Disconnect-PSSession.

Questo parametro è stato introdotto in PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

Specifica uno script locale eseguito da questo cmdlet in uno o più computer remoti. Immettere il percorso e il nome file dello script oppure inviare tramite pipe un percorso di script a Invoke-Command. Lo script deve trovarsi nel computer locale o in una directory a cui il computer locale può accedere. Usare ArgumentList per specificare i valori dei parametri nello script.

Quando si usa questo parametro, PowerShell converte il contenuto del file di script specificato in un blocco di script, trasmette il blocco di script al computer remoto ed esegue il file nel computer remoto.

Type:String
Aliases:PSPath
Position:1
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-HideComputerName

Indica che questo cmdlet omette il nome computer di ogni oggetto dalla visualizzazione dell'output. Per impostazione predefinita, il nome del computer che ha generato l'oggetto appare nella visualizzazione.

Questo parametro ha effetto solo sulla visualizzazione di output. Non modifica l'oggetto.

Type:SwitchParameter
Aliases:HCN
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InDisconnectedSession

Indica che questo cmdlet esegue un comando o uno script in una sessione disconnessa.

Quando si usa il parametro InDisconnectedSession , Invoke-Command crea una sessione permanente in ogni computer remoto, avvia il comando specificato dal parametro ScriptBlock o FilePath e quindi si disconnette dalla sessione. I comandi continuano a essere eseguiti nelle sessioni disconnesse. InDisconnectedSession consente di eseguire comandi senza mantenere una connessione alle sessioni remote. Inoltre, poiché la sessione viene disconnessa prima che vengano restituiti i risultati, InDisconnectedSession assicura che tutti i risultati del comando vengano restituiti alla sessione riconnessa, invece di essere suddivisi tra le sessioni.

Non è possibile usare InDisconnectedSession con il parametro Session o il parametro AsJob .

I comandi che usano InDisconnectedSession restituiscono un oggetto PSSession che rappresenta la sessione disconnessa. Non restituiscono l'output del comando. Per connettersi alla sessione disconnessa, usare i Connect-PSSession cmdlet o Receive-PSSession . Per ottenere i risultati dei comandi eseguiti nella sessione, usare il Receive-PSSession cmdlet . Per eseguire comandi che generano l'output in una sessione disconnessa, impostare il valore dell'opzione Di sessione OutputBufferingMode su Elimina. Se si intende connettersi alla sessione disconnessa, impostare il timeout di inattività nella sessione in modo che fornisca tempo sufficiente per connettersi prima di eliminare la sessione.

È possibile impostare la modalità di buffering di output e il timeout di inattività nel parametro SessionOption o nella $PSSessionOption variabile di preferenza. Per altre informazioni sulle opzioni di sessione, vedere New-PSSessionOption e about_Preference_Variables.

Per altre informazioni sulla funzionalità relativa alle sessioni disconnesse, vedere about_Remote_Disconnected_Sessions.

Questo parametro è stato introdotto in PowerShell 3.0.

Type:SwitchParameter
Aliases:Disconnected
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Specifica l'input del comando. Immettere una variabile che contiene gli oggetti oppure digitare un comando o un'espressione che ottiene gli oggetti.

Quando si usa il parametro InputObject , usare la $Input variabile automatica nel valore del parametro ScriptBlock per rappresentare gli oggetti di input.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-JobName

Specifica un nome descrittivo per il processo in background. Per impostazione predefinita, i processi sono denominati Job<n>, dove <n> è un numero ordinale.

Se si usa il parametro JobName in un comando, il comando viene eseguito come processo e Invoke-Command restituisce un oggetto processo, anche se non si include AsJob nel comando.

Per altre informazioni sui processi in background di PowerShell, vedere about_Jobs.

Type:String
Position:Named
Default value:Job<n>
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-NoNewScope

Indica che questo cmdlet esegue il comando specificato nell'ambito corrente. Per impostazione predefinita, Invoke-Command esegue i comandi nel proprio ambito.

Questo parametro è valido solo nei comandi eseguiti nella sessione corrente, ovvero comandi che omettono entrambi i parametri ComputerName e Session.

Questo parametro è stato introdotto in PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Port

Specifica la porta di rete nel computer remoto utilizzato per questo comando. Per connettersi a un computer remoto, è necessario che il computer remoto sia in attesa sulla porta usata dalla connessione. Le porte predefinite sono 5985, ovvero la porta WinRM per HTTP e 5986, ovvero la porta WinRM per HTTPS.

Prima di usare una porta alternativa, configurare il listener di Gestione remota Windows nel computer remoto per l'ascolto su tale porta. Per configurare il listener, digitare i due comandi seguenti al prompt di PowerShell:

Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse

New-Item -Path WSMan:\Localhost\listener -Transport http -Address * -Port \<port-number\>

Non usare il parametro Port a meno che non sia necessario. La porta impostata nel comando si applica a tutti i computer o tutte le sessioni in cui viene eseguito il comando. Un'impostazione di porta alternativa potrebbe impedire l'esecuzione del comando in tutti i computer.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Specifica i comandi da eseguire. Racchiudere i comandi tra parentesi graffe { } per creare un blocco di script. Questo parametro è obbligatorio.

Per impostazione predefinita, tutte le variabili nel comando vengono valutate nel computer remoto. Per includere variabili locali nel comando, usare ArgumentList.

Type:ScriptBlock
Aliases:Command
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Session

Specifica una matrice di sessioni in cui questo cmdlet esegue il comando . Immettere una variabile contenente oggetti PSSession o un comando che crea o ottiene gli oggetti PSSession , ad esempio un New-PSSession comando o Get-PSSession .

Quando si crea una sessione PSSession, PowerShell stabilisce una connessione permanente al computer remoto. Usare una sessione PSSession per eseguire una serie di comandi correlati che condividono dati. Per eseguire un singolo comando o una serie di comandi non correlati, usare il parametro ComputerName . Per altre informazioni, vedere about_PSSessions.

Type:PSSession[]
Position:0
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SessionName

Specifica un nome descrittivo per la sessione disconnessa. È possibile usare il nome per fare riferimento alla sessione nei comandi successivi, ad esempio un Get-PSSession comando. Questo parametro è valido solo con il parametro InDisconnectedSession.

Questo parametro è stato introdotto in PowerShell 3.0.

Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SessionOption

Specifica le opzioni avanzate per la sessione. Immettere un oggetto SessionOption , ad esempio quello creato usando il New-PSSessionOption cmdlet o una tabella hash in cui le chiavi sono nomi di opzioni di sessione e i valori sono valori delle opzioni di sessione.

I valori predefiniti per le opzioni sono determinati dal valore della $PSSessionOption variabile preferenza, se impostato. In caso contrario, i valori predefiniti vengono stabiliti dalle opzioni impostate nella configurazione di sessione.

I valori delle opzioni di sessione hanno la precedenza sui valori predefiniti per le sessioni impostate nella $PSSessionOption variabile di preferenza e nella configurazione della sessione. Tuttavia, non hanno la precedenza sui valori massimi, sulle quote o sui limiti impostati nella configurazione della sessione.

Per una descrizione delle opzioni di sessione che includono i valori predefiniti, vedere New-PSSessionOption. Per informazioni sulla $PSSessionOption variabile di preferenza, vedere about_Preference_Variables. Per altre informazioni sulle configurazioni di sessione, vedere about_Session_Configurations.

Type:PSSessionOption
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

Specifica il numero massimo di connessioni simultanee che è possibile stabilire per eseguire il comando. Se si omette questo parametro o si immette un valore pari a 0, viene usato il valore predefinito 32.

Questo valore limite si applica solo al comando corrente, non alla sessione o al computer.

Type:Int32
Position:Named
Default value:32
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseSSL

Indica che questo cmdlet usa il protocollo SSL (Secure Sockets Layer) per stabilire una connessione al computer remoto. Per impostazione predefinita, SSL non viene usato.

WS-Management crittografa tutto il contenuto di PowerShell trasmesso in rete. Il parametro UseSSL è una protezione aggiuntiva che invia i dati tramite HTTPS, anziché HTTP.

Se si usa questo parametro, ma SSL non è disponibile sulla porta usata per il comando, il comando ha esito negativo.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-VMId

Specifica una matrice di ID di macchine virtuali.

Type:Guid[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-VMName

Specifica una matrice di nomi di macchine virtuali.

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

Input

ScriptBlock

È possibile eseguire la pipe di un comando in un blocco di script in Invoke-Command. Usare la $Input variabile automatica per rappresentare gli oggetti di input nel comando.

Output

System.Management.Automation.PSRemotingJob, System.Management.Automation.Runspaces.PSSession, or the output of the invoked command

Questo cmdlet restituisce un oggetto processo, se si usa il parametro AsJob . Se si specifica il parametro InDisconnectedSession , Invoke-Command restituisce un oggetto PSSession . In caso contrario, restituisce l'output del comando richiamato, ovvero il valore del parametro ScriptBlock .

Note

In Windows Vista e versioni successive del sistema operativo Windows, per usare il parametro ComputerName di Invoke-Command per eseguire un comando nel computer locale, è necessario eseguire PowerShell usando l'opzione Esegui come amministratore .

Quando si eseguono comandi in più computer, PowerShell si connette ai computer nell'ordine in cui vengono visualizzati nell'elenco. Tuttavia, l'output del comando viene visualizzato nell'ordine ricevuto dai computer remoti, che potrebbe essere diverso.

Errori che derivano dal comando eseguito Invoke-Command sono inclusi nei risultati del comando. Gli errori che sarebbero irreversibili in un comando locale sono considerati come errori non irreversibili in un comando remoto. Questa strategia assicura che gli errori di terminazione in un computer non chiudano il comando in tutti i computer in cui viene eseguito. Questa pratica viene usata anche quando un comando remoto viene eseguito in un singolo computer.

Se il computer remoto non è in un dominio attendibile dal computer locale, il computer potrebbe non essere in grado di autenticare le credenziali dell'utente. Per aggiungere il computer remoto all'elenco di host attendibili in WS-Management, usare il comando seguente nel WSMAN provider, dove <Remote-Computer-Name> è il nome del computer remoto:

Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>

Quando si disconnette un PSSession, usando il parametro InDisconnectedSession , lo stato della sessione viene Disconnesso e la disponibilità è Nessuno. Il valore della proprietà State è relativo alla sessione corrente. Un valore disconnesso indica che la sessione PSSession non è connessa alla sessione corrente. Tuttavia, non significa che la sessione PSSession viene disconnessa da tutte le sessioni. È possibile che sia connessa a una sessione diversa. Per stabilire se è possibile connettersi o riconnettersi alla sessione, usare la proprietà Availability.

Se il valore di Availability è None, è possibile connettersi alla sessione. Un valore occupato indica che non è possibile connettersi a PSSession perché è connesso a un'altra sessione. Per altre informazioni sui valori della proprietà State delle sessioni, vedere RunspaceState. Per altre informazioni sui valori della proprietà Availability delle sessioni, vedere RunspaceAvailability.