Esegue i comandi nei computer locali e remoti.

Sintassi

Invoke-Command [-ScriptBlock] <scriptblock> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Descrizione

Il cmdlet Invoke-Command esegue comandi in un computer locale o remoto e restituisce tutto l'output dei comandi, compresi gli errori. Con un solo comando Invoke-Command è possibile eseguire comandi in più computer.

Per eseguire un solo comando in un computer remoto, utilizzare il parametro ComputerName. Per eseguire una serie di comandi correlati che condividono dati, creare una sessione PSSession (connessione permanente) nel computer remoto, quindi utilizzare il parametro Session di Invoke-Command per eseguire il comando nella sessione PSSession.

È inoltre possibile utilizzare Invoke-Command in un computer locale per valutare o eseguire una stringa in un blocco di script come comando. Windows PowerShell converte il blocco di script in un comando, il quale viene immediatamente eseguito nell'ambito corrente anziché ripetere a video la stringa nella riga di comando.

Prima di utilizzare Invoke-Command per eseguire comandi in un computer remoto, vedere l'argomento about_Remote.

Parametri

-AllowRedirection

Consente il reindirizzamento di questa connessione a un URI alternativo.

Quando si utilizza il parametro ConnectionURI, la destinazione remota può restituire un'istruzione di reindirizzamento a un altro URI. Per impostazione predefinita in Windows PowerShell le connessioni non vengono reindirizzate, ma è possibile utilizzare il parametro AllowRedirection per consentire il reindirizzamento della connessione.

È inoltre possibile limitare il numero di volte in cui la connessione viene reindirizzata impostando la proprietà MaximumConnectionRedirectionCount della variabile di preferenza $PSSessionOption o la proprietà MaximumConnectionRedirectionCount del valore del parametro SessionOption. Il valore predefinito è 5. Per ulteriori informazioni, vedere la descrizione del parametro SessionOption e l'argomento della Guida relativo al cmdlet New-PSSessionOption.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-ApplicationName <string>

Specifica il segmento del nome dell'applicazione dell'URI di connessione. Utilizzare questo parametro per specificare il nome dell'applicazione quando non si utilizza il parametro ConnectionURI nel comando.

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

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

Obbligatorio?

false

Posizione?

named

Valore predefinito

WSMAN

Accettare input da pipeline?

true (ByPropertyName)

Accettare caratteri jolly?

false

-ArgumentList <Object[]>

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 separato da virgole. I valori sono associati alle variabili nell'ordine in cui sono elencati. L'alias per ArgumentList è "Args".

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

Per utilizzare variabili locali in un comando, utilizzare il formato di comando seguente:

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

Nella parola chiave "param" sono elencate le variabili locali utilizzate nel comando. Il parametro ArgumentList fornisce i valori delle variabili, nell'ordine in cui sono elencati.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-AsJob

Esegue il comando come processo in background in un computer remoto. Utilizzare questo parametro per eseguire comandi il cui completamento richiede molto tempo.

Quando si utilizza AsJob, il comando restituisce un oggetto che rappresenta il processo, quindi visualizza il prompt dei comandi. È possibile continuare a utilizzare la sessione durante il completamento del processo. Per gestire il processo, utilizzare i cmdlet Job. Per ottenere i risultati del processo, utilizzare Receive-Job.

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

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

Obbligatorio?

false

Posizione?

named

Valore predefinito

nessuno

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-Authentication <AuthenticationMechanism>

Specifica il meccanismo utilizzato per autenticare le credenziali dell'utente. I valori validi sono Default, Basic, Credssp, Digest, Kerberos, Negotiate e NegotiateWithImplicitCredential. Il valore predefinito è Default.

L'autenticazione CredSSP è disponibile unicamente in Windows Vista, Windows Server 2008 e nelle versioni successive di Windows.

Per informazioni sui valori di questo parametro, vedere la descrizione dell'enumerazione System.Management.Automation.Runspaces.AuthenticationMechanism in MSDN.

ATTENZIONE: l'autenticazione CredSSP (Credential Security Service Provider), che prevede il passaggio delle credenziali dell'utente a un computer remoto per l'autenticazione, è progettata per i comandi che richiedono l'autenticazione su più di una risorsa, ad esempio l'accesso a una condivisione di rete remota. Questo meccanismo aumenta il rischio per la sicurezza dell'operazione remota. Se il computer remoto è compromesso, è possibile utilizzare le credenziali passate a tale computer per controllare la sessione di rete.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Default

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-CertificateThumbprint <string>

Specifica il certificato di chiave pubblica digitale (X509) di un account utente con autorizzazione per l'esecuzione di questa azione. Immettere l'identificazione digitale del certificato.

I certificati vengono utilizzati nell'autenticazione basata su certificati client. Possono essere mappati solo agli account utente locali; non funzionano con gli account di dominio.

Per ottenere un'identificazione digitale del certificato, utilizzare i comandi Get-Item o Get-ChildItem nell'unità Cert: di Windows PowerShell.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-ComputerName <string[]>

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

Quando si utilizza il parametro ComputerName, in Windows PowerShell viene creata una connessione temporanea utilizzata solo per eseguire il comando specificato e quindi chiusa. Se è necessaria una connessione permanente, utilizzare il parametro Session.

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

Per utilizzare un indirizzo IP nel valore del parametro ComputerName, il comando deve includere il parametro Credential. È inoltre necessario configurare il computer per il trasporto HTTPS o includere l'indirizzo IP del computer remoto nell'elenco di host attendibili (TrustedHosts) di Gestione remota Windows nel computer locale. Per istruzioni relative all'aggiunta di un nome di computer all'elenco di host attendibili (TrustedHosts), vedere "Come aggiungere un computer all'elenco di host attendibili" in about_Remote_Troubleshooting.

Nota: in Windows Vista e nelle versioni successive di Windows per includere il computer locale nel valore del parametro ComputerName, è necessario aprire Windows PowerShell con l'opzione "Esegui come amministratore".

Obbligatorio?

false

Posizione?

1

Valore predefinito

Accettare input da pipeline?

true (ByPropertyName)

Accettare caratteri jolly?

false

-ConfigurationName <string>

Specifica la configurazione di sessione utilizzata per la nuova sessione PSSession.

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

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

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

Obbligatorio?

false

Posizione?

named

Valore predefinito

https://schemas.Microsoft.com/PowerShell/Microsoft.PowerShell

Accettare input da pipeline?

true (ByPropertyName)

Accettare caratteri jolly?

false

-ConnectionURI <Uri[]>

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

Il formato di questa stringa è:

<Trasporto>://<NomeComputer>:<Porta>/<NomeApplicazione>

Il valore predefinito è:

http://localhost:80/WSMAN

I valori validi per il segmento Trasport dell'URI sono HTTP e HTTPS. Se non si specifica ConnectionURI, è possibile utilizzare i parametri UseSSL, ComputerName, Port e ApplicationName per specificare i valori URI.

Se il computer di destinazione reindirizza la connessione a un URI diverso, in Windows PowerShell viene impedito il reindirizzamento a meno che non si utilizzi il parametro AllowRedirection nel comando.

Obbligatorio?

false

Posizione?

1

Valore predefinito

http://localhost:80/wsman

Accettare input da pipeline?

true (ByPropertyName)

Accettare caratteri jolly?

false

-Credential <PSCredential>

Specifica un account utente con autorizzazione per l'esecuzione di questa azione. Il valore predefinito è l'utente corrente.

Digitare un nome utente, ad esempio "Utente01" o "Dominio01\Utente01", o immettere una variabile che contenga un oggetto PSCredential, ad esempio uno generato dal cmdlet Get-Credential. Quando si digita un nome utente, viene richiesta una password.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

true (ByPropertyName)

Accettare caratteri jolly?

false

-FilePath <string>

Esegue lo script locale specificato in uno o più computer remoti. Immettere il percorso e il nome file dello script oppure reindirizzare un percorso di script a Invoke-Command. Lo script deve trovarsi nel computer locale o in una directory accessibile dal computer locale. Utilizzare il parametro ArgumentList per specificare i valori dei parametri nello script.

Quando si utilizza questo parametro, in Windows PowerShell il contenuto del file di script specificato viene convertito in un blocco di script, che viene trasmesso al computer remoto e successivamente eseguito su tale computer.

Obbligatorio?

true

Posizione?

2

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-HideComputerName

Omette il nome del computer di ogni oggetto dalla visualizzazione dell'output. Per impostazione predefinita, viene visualizzato il nome del computer che ha generato l'oggetto.

Questo parametro interessa solo la visualizzazione dell'output. L'oggetto non viene modificato.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-InputObject <psobject>

Specifica l'input del comando. Immettere una variabile contenente gli oggetti oppure digitare un comando o un'espressione che consente di ottenere gli oggetti.

Durante l'utilizzo di InputObject, utilizzare la variabile automatica $input nel valore del parametro ScriptBlock per rappresentare gli oggetti di input.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

true (ByValue)

Accettare caratteri jolly?

false

-JobName <string>

Specifica un nome descrittivo per il processo in background. Per impostazione predefinita i processi sono denominati "Job<n>", dove <n> è un numero ordinale. Questo parametro è valido solo con il parametro AsJob.

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

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

Obbligatorio?

false

Posizione?

named

Valore predefinito

Job<n>

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-Port <int>

Specifica la porta di rete nel computer remoto utilizzato per questo comando. Il valore predefinito è la porta 80 (porta HTTP).

Prima di utilizzare una porta alternativa, è necessario configurare il listener WinRM nel computer remoto affinché resti in ascolto su tale porta. Per configurare il listener, digitare i due comandi seguenti al prompt di Windows PowerShell:

remove-item -path wsman:\Localhost\listener\listener* -recurse

new-item -path wsman:\Localhost\listener -Transport http -Address * -port <numero-porta>

Non utilizzare il parametro Port a meno che non sia necessario. Il parametro Port impostato nel comando si applica a tutti i computer o a tutte le sessioni in cui il comando è in esecuzione. Un'impostazione di porta alternativa potrebbe impedire l'esecuzione del comando in tutti i computer.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-ScriptBlock <scriptblock>

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

Per impostazione predefinita, qualsiasi variabile nel comando verrà valutata nel computer remoto. Per includere variabili locali nel comando, utilizzare il parametro ArgumentList.

Obbligatorio?

true

Posizione?

1

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-Session <PSSession[]>

Esegue il comando nelle sessioni di Windows PowerShell specificate (PSSession). Immettere una variabile che contiene le sessioni PSSession o un comando che consente di creare o ottenere tali sessioni, ad esempio New-PSSession o Get-PSSession.

Quando si crea una sessione PSSession, Windows PowerShell stabilisce una connessione permanente al computer remoto. Utilizzare una sessione PSSession per eseguire una serie di comandi correlati che condividono dati. Per eseguire un solo comando o una serie di comandi non correlati, utilizzare il parametro ComputerName.

Per creare una sessione PSSession, utilizzare il cmdlet New-PSSession. Per ulteriori informazioni, vedere about_PSSessions.

Obbligatorio?

false

Posizione?

1

Valore predefinito

Accettare input da pipeline?

true (ByPropertyName)

Accettare caratteri jolly?

false

-SessionOption <PSSessionOption>

Imposta opzioni avanzate per la sessione. Immettere un oggetto SessionOption creato utilizzando il cmdlet New-PSSessionOption.

I valori predefiniti delle opzioni sono determinati dal valore della variabile di preferenza $PSSessionOption, se impostato. In caso contrario nella sessione vengono utilizzate le impostazioni predefinite del sistema.

Per una descrizione delle opzioni di sessione, inclusi i valori predefiniti, vedere l'argomento della Guida per il cmdlet New-PSSessionOption. Per informazioni sulla variabile di preferenza $PSSessionOption, vedere about_Preference_Variables.

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-ThrottleLimit <int>

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

Il limite di velocità si applica solo al comando corrente, non alla sessione o al computer.

Obbligatorio?

false

Posizione?

named

Valore predefinito

32

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

-UseSSL

Utilizza il protocollo SSL (Secure Sockets Layer) per stabilire una connessione al computer remoto. Per impostazione predefinita, SSL non viene utilizzato.

WS-Management consente di crittografare tutto il contenuto di Windows PowerShell trasmesso in rete. UseSSL consente di inviare i dati con una protezione aggiuntiva mediante il protocollo HTTPS anziché HTTP.

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

Obbligatorio?

false

Posizione?

named

Valore predefinito

Accettare input da pipeline?

false

Accettare caratteri jolly?

false

<CommonParameters>

Questo cmdlet supporta i parametri comuni -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer e -OutVariable. Per ulteriori informazioni, vedere about_Commonparameters.

Input e output

Il tipo di input è il tipo degli oggetti che è possibile reindirizzare al cmdlet. Il tipo restituito è il tipo degli oggetti restituiti dal cmdlet.

Input

System.Management.Automation.ScriptBlock

È possibile reindirizzare un comando in un blocco di script a Invoke-Command. Utilizzare la variabile automatica $input per rappresentare gli oggetti di input nel comando.

Output

System.Management.Automation.PSRemotingJob oppure l'output del comando richiamato

Quando si utilizza il parametro AsJob, Invoke-Command restituisce un oggetto processo. In caso contrario, restituisce l'output del comando richiamato (valore del parametro ScriptBlock).

Note

-- In Windows Vista e nelle versioni successive di Windows per utilizzare il parametro ComputerName di Invoke-Command per l'esecuzione di un comando nel computer locale, è necessario aprire Windows PowerShell con l'opzione "Esegui come amministratore".

-- Quando si eseguono comandi in più computer, Windows PowerShell stabilisce la connessione ai computer nell'ordine in cui vengono visualizzati nell'elenco. Tuttavia, l'output dei comandi viene visualizzato nell'ordine in cui viene ricevuto dai computer remoti che potrebbe essere diverso.

-- Gli errori derivanti dal comando eseguito da Invoke-Command sono inclusi nei risultati del comando. Gli errori che sarebbero considerati fatali in un comando locale vengono considerati errori non fatali in un comando remoto. Questa strategia garantisce che gli errori fatali in un computer non causino l'arresto dell'esecuzione del comando in tutti i computer in cui è in corso. Questa procedura viene utilizzata anche quando un comando remoto viene eseguito in un solo computer.

-- Se il computer remoto non fa parte di un dominio considerato 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, utilizzare il comando seguente nel provider WSMAN, dove <Nome-Computer-Remoto> è il nome del computer remoto:

set-item -path wsman:\Localhost\Client\TrustedHosts -value <Nome-Computer-Remoto>.

Esempio 1

C:\PS>invoke-command -filepath c:\scripts\test.ps1 -computerName Server01

Disks: C:, D:, E:
Status: Warning, Normal, Normal

Descrizione
-----------
Con questo comando si esegue lo script Test.ps1 nel computer Server01. 

Con il comando si utilizza il parametro FilePath per specificare 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

C:\PS>invoke-command -computername server01 -credential domain01\user01 -scriptblock {get-culture}

Descrizione
-----------
Questo comando esegue il comando Get-Culture nel computer remoto Server01. 

Vengono utilizzati il parametro ComputerName per specificare il nome del computer e il parametro Credential per eseguire il comando nel contesto di sicurezza di "Dominio01\Utente01", un utente con autorizzazione per l'esecuzione dei comandi. Viene utilizzato il parametro ScriptBlock per specificare il comando da eseguire nel computer remoto.

In risposta, viene visualizzata una finestra di dialogo di Windows PowerShell in cui vengono richiesti la password e un metodo di autenticazione per l'account Utente01. Successivamente, il comando viene eseguito nel computer Server01 e viene restituito il risultato.






Esempio 3

C:\PS>$s = new-pssession -computername server02 -credential domain01\user01

C:\PS> invoke-command -session $s -scriptblock {get-culture}

Descrizione
-----------
In questo esempio viene eseguito lo stesso comando "Get-Culture" in una sessione (connessione permanente) nel computer remoto Server02. In genere, viene creata una sessione solo quando si esegue una serie di comandi nel computer remoto.

Il primo comando utilizza il cmdlet New-PSSession per creare una sessione nel computer remoto Server02. La sessione viene quindi salvata nella variabile $s.

Il secondo comando utilizza il cmdlet Invoke-Command per eseguire il comando Get-Culture in Server02. Viene utilizzato il parametro Session per specificare la sessione salvata nella variabile $s. 

In risposta, in Windows PowerShell il comando viene eseguito nella sessione nel computer Server02.






Esempio 4

C:\PS>invoke-command -computername Server02 -scriptblock {$p = get-process powershell}

C:\PS> invoke-command -computername Server02 -scriptblock {$p.virtualmemorysize}
C:\PS>

C:\PS> $s = new-pssession -computername Server02
C:\PS> invoke-command -session $s -scriptblock {$p = get-process powershell}
C:\PS> invoke-command -session $s -scriptblock {$p.virtualmemorysize}
17930240

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

Nei primi due comandi viene utilizzato il parametro ComputerName di Invoke-Command per eseguire comandi sul computer remoto Server02. Il primo comando utilizza il comando Get-Process per ottenere il processo di PowerShell nel computer remoto e salvarlo nella variabile $p. Il secondo comando consente di ottenere il valore della proprietà VirtualMemorySize del processo di PowerShell. 

Il primo comando ha esito positivo. Il secondo, invece, ha esito negativo, poiché quando si utilizza il parametro ComputerName in Windows PowerShell viene creata una connessione solo per l'esecuzione del comando. Quindi, chiude la connessione quando il comando è completo. La variabile $p è stata creata in una connessione, ma non esiste nella connessione creata per il secondo comando.

Il problema viene risolto creando una sessione (connessione permanente) nel computer remoto ed eseguendo entrambi i comandi correlati nella stessa sessione.

Il terzo comando utilizza il cmdlet New-PSSession per creare una sessione nel computer Server02. La sessione viene quindi salvata nella variabile $s. Nel quarto e nel quinto comando la serie di comandi utilizzata nel primo set viene ripetuta, ma in questo caso nel comando Invoke-Command viene utilizzato il parametro Session per eseguire entrambi i comandi nella stessa sessione. 

In questo caso, poiché entrambi i comandi vengono eseguiti nella stessa sessione, i comandi hanno esito positivo e il valore di $p rimane attivo nella sessione $s per essere utilizzato successivamente.






Esempio 5

C:\PS>$command = { get-eventlog -log "windows powershell" | where {$_.message -like "*certificate*"} }

C:\PS> invoke-command -computername S1, S2 -scriptblock $command

Descrizione
-----------
In questo esempio viene illustrato come immettere un comando salvato in una variabile locale. 

Quando l'intero comando viene salvato in una variabile locale, è possibile specificare la variabile come valore del parametro ScriptBlock. Non è necessario utilizzare la parola chiave "param" o la variabile ArgumentList per inviare il valore della variabile locale.

Con il primo comando si salva un comando Get-Eventlog nella variabile $command. Il comando viene formattato come blocco di script.

Il secondo comando utilizza il cmdlet Invoke-Command per eseguire il comando in $command nei computer remoti S1 e S2.






Esempio 6

C:\PS>invoke-command -computername server01, server02, TST-0143, localhost -configurationname MySession.PowerShell -scriptblock {get-eventlog "windows powershell"}

Descrizione
-----------
In questo esempio viene illustrato come utilizzare il cmdlet Invoke-Command per eseguire un solo comando in più computer. 

Viene utilizzato il parametro ComputerName per specificare i computer. I nomi dei computer vengono presentati in un elenco separato da virgole. L'elenco di computer include il valore "localhost", che rappresenta il computer locale.

Vengono utilizzati il parametro ConfigurationName per specificare una configurazione di sessione alternativa per Windows PowerShell e il parametro ScriptBlock per specificare il comando.

In questo esempio, il comando nel blocco di script ottiene gli eventi nel registro eventi di Windows PowerShell in ogni computer remoto.






Esempio 7

C:\PS>$version = invoke-command -computername (get-content machines.txt) -scriptblock {(get-host).version}

Descrizione
-----------
Questo comando consente di ottenere la versione dell'host di Windows PowerShell in esecuzione in 200 computer remoti. 

Poiché viene eseguito solo un comando, non è necessario creare connessioni permanenti (sessioni) a ognuno dei computer. Viene invece utilizzato il parametro ComputerName per indicare i computer.

Viene utilizzato il cmdlet Invoke-Command per eseguire un comando Get-Host. Viene utilizzata la notazione con punto per ottenere la proprietà Version dell'host di Windows PowerShell.

Per specificare i computer, viene utilizzato il cmdlet Get-Content per ottenere il contenuto del file Machine.txt, che contiene i nomi dei computer.

Questi comandi vengono eseguiti in modo sincrono (uno alla volta). Al termine dell'esecuzione dei comandi, l'output dei comandi di tutti i computer viene salvato nella variabile $version. L'output include il nome del computer da cui sono stati originati i dati.






Esempio 8

C:\PS>$s = new-pssession -computername Server01, Server02

C:\PS> invoke-command -session $s -scriptblock {get-eventlog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        --------             -------
1    Job1    Running    True          Server01,Server02  get-eventlog system


C:\PS> $j = Get-Job

C:\PS> $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  :

C:\PS> $results = $j | Receive-Job

Descrizione
-----------
Questi comandi consentono l'esecuzione di un processo in background in due computer remoti. Poiché il comando Invoke-Command utilizza il parametro AsJob, i comandi vengono eseguiti nei computer remoti, ma in realtà il processo si trova nel computer locale e i risultati vengono trasmessi al computer locale.

Il primo comando utilizza il cmdlet New-PSSession per creare sessioni nei computer remoti Server01 e Server02.

Il secondo comando utilizza il cmdlet Invoke-Command per eseguire un processo in background in ciascuna sessione. Viene utilizzato il parametro AsJob per eseguire il comando come processo in background. Viene restituito un oggetto processo che contiene due oggetti processo figlio, uno per ogni processo eseguito nei due computer remoti.

Il terzo comando utilizza un comando Get-Job per salvare l'oggetto processo nella variabile di $j. 

Con il quarto comando si utilizza un operatore pipeline (|) per inviare il valore della variabile $j al cmdlet Format-List che consente di visualizzare tutte le proprietà dell'oggetto processo in un elenco.

Con il quinto comando si ottengono i risultati dei processi. L'oggetto processo in $j viene reindirizzato al cmdlet Receive-Job e i risultati vengono archiviati nella variabile $results.






Esempio 9

C:\PS>$MWFO-LOg = Microsoft-Windows-Forwarding/Operational

C:\PS> invoke-command -computername server01 -scriptblock {param($log, $num) get-eventlog -logname $log -newest $num} -ArgumentList $MWFO-log, 10

Descrizione
-----------
In questo esempio viene illustrato come includere i valori delle variabili locali in un'esecuzione del comando in un computer remoto.

Il primo comando salva il nome del registro eventi Microsoft-Windows-Forwarding/Operational nella variabile $MWFO-Log.

Il secondo comando utilizza il cmdlet Invoke-Command per eseguire un comando Get-EventLog nel computer remoto Server01 che ottiene i 10 eventi più recenti dal registro eventi Microsoft-Windows-Forwarding/Operational in Server01.

In questo comando viene utilizzata la parola chiave "param" per creare due variabili, $log e $num, utilizzate come segnaposto nel comando Get-EventLog. Questi segnaposto hanno nomi arbitrari che non devono necessariamente corrispondere ai nomi delle variabili locali che ne forniscono i valori.

I valori del parametro ArgumentList illustrano le due diverse modalità per specificare i valori nell'elenco di argomenti. Il valore del segnaposto $log è la variabile $MFWO-Log, definita nel primo comando. Il valore della variabile $num è 10.

Prima dell'invio del comando al computer remoto, le variabili vengono sostituite dai valori specificati.






Esempio 10

C:\PS>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


C:\PS> 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

Descrizione
-----------
In questo esempio viene illustrato l'effetto dell'utilizzo del parametro HideComputerName di Invoke-Command. 

Nei primi due comandi viene utilizzato il cmdlet Invoke-Command per eseguire un comando Get-Process per il processo di PowerShell. L'output del primo comando include la proprietà PsComputerName che contiene il nome del computer in cui viene eseguito il comando. L'output del secondo comando, che utilizza il parametro HideComputerName, non include la colonna PsComputerName.

L'utilizzo del parametro HideComputerName non modifica l'oggetto. È comunque possibile utilizzare i cmdlet Format per visualizzare la proprietà PsComputerName di qualsiasi oggetto interessato.






Esempio 11

C:\PS>invoke-command -comp (get-content servers.txt) -filepath c:\scripts\sample.ps1 -argumentlist Process, Service

Descrizione
-----------
In questo esempio viene utilizzato il cmdlet Invoke-Command per eseguire lo script Sample.ps1 in tutti i computer elencati nel file Servers.txt. Viene utilizzato il parametro FilePath per specificare il file script. Questo comando consente di eseguire lo script nei computer remoti, anche se il file script non è accessibile a tali computer.

Quando si invia il comando, il contenuto del file Sample.ps1 viene copiato in un blocco di script il quale viene eseguito in ciascun computer remoto. Questa procedura equivale all'utilizzo del parametro ScriptBlock per inviare il contenuto dello script.






Esempio 12

C:\PS>$LiveCred = Get-Credential

C:\PS> Invoke-Command -ConfigurationName Microsoft.Exchange `
         -ConnectionUri https://ps.exchangelabs.com/powershell `
         -Credential $LiveCred  -Authentication Basic `
         -scriptblock {Invoke-Command {Set-Mailbox dan -DisplayName "Dan Park"}

Descrizione
-----------
In questo esempio viene illustrato come eseguire un comando in un computer remoto identificato da un URI (indirizzo Internet). In questo esempio viene eseguito un comando Set-Mailbox in un server remoto di Exchange. Il carattere di apice inverso (`) nel comando è il carattere di continuazione di Windows PowerShell.

Con il primo comando si utilizza il cmdlet Get-Credential per archiviare le credenziali di Windows Live ID nella variabile $LiveCred. Quando viene visualizzata la finestra di dialogo delle credenziali, immettere le credenziali di Windows Live ID.

Con il secondo comando si utilizza il cmdlet Invoke-Command per eseguire un comando Set-Mailbox. Viene utilizzato il parametro ConfigurationName per indicare che il comando deve essere eseguito in una sessione che utilizza la configurazione di sessione Microsoft.Exchange. Il parametro ConnectionURI specifica l'URL dell'endpoint del server di Exchange. 

Il parametro delle credenziali specifica le credenziali di Windows Live archiviate nella variabile $LiveCred. Il parametro AuthenticationMechanism specifica l'utilizzo dell'autenticazione di base. Il parametro ScriptBlock specifica un blocco di script che contiene il comando.






Esempio 13

C:\PS>$max = New-PSSessionOption -MaximumRedirection 1

C:\PS> Invoke-Command -ConnectionUri https://ps.exchangelabs.com/powershell `
         -scriptblock {Invoke-Command {Get-Mailbox dan} `
         -AllowRedirection -SessionOption $max

Descrizione
-----------
Con questo comando viene illustrato come utilizzare i parametri AllowRedirection e SessionOption per gestire il reindirizzamento dell'URI in un comando remoto.

Con il primo comando si utilizza il cmdlet New-PSSessionOption per creare un oggetto PSSessionOption che viene salvato nella variabile $max. Con il comando si utilizza il parametro MaximumRedirection per impostare la proprietà MaximumConnectionRedirectionCount dell'oggetto PSSessionOption su 1. 

Con il secondo comando si utilizza il cmdlet Invoke-Command per eseguire il comando Get-Mailbox in un server remoto in cui viene eseguito Microsoft Exchange Server. Viene utilizzato il parametro AllowRedirection per fornire un'autorizzazione esplicita per il reindirizzamento della connessione a un endpoint alternativo. Viene inoltre utilizzato il parametro SessionOption per specificare l'oggetto sessione nella variabile $max.

Di conseguenza, se il computer remoto specificato dal parametro ConnectionURI restituisce un messaggio di reindirizzamento, in Windows PowerShell la connessione verrà reindirizzata, ma se la nuova destinazione restituisce un altro messaggio di reindirizzamento, verrà superato il valore del conteggio di reindirizzamento pari a 1 e Invoke-Command restituirà un errore non fatale.






Esempio 14

C:\PS>$so = New-PSSessionOption -SkipCACheck

PS C:\> invoke-command $s { get-hotfix } -SessionOption $so -credential server01\user01

Descrizione
-----------
In questo esempio viene illustrato come creare e utilizzare un parametro SessionOption. 

Il primo comando utilizza il cmdlet New-PSSessionOption per creare un'opzione di sessione. L'oggetto SessionOption risultante viene salvato nel parametro $so.

Il secondo comando utilizza il cmdlet Invoke-Command per eseguire un comando Get-Hotfix in remoto. Il valore del parametro SessionOption è l'oggetto SessionOption presente nella variabile $so.






Esempio 15

C:\PS>enable-wsmanCredSSP -delegate server02

C:\PS> connect-wsman Server02

C:\PS> set-item wsman:\server02*\service\auth\credSSP -value $true

C:\PS> $s = new-pssession server02

C:\PS> invoke-command -session $s -script {get-item \\Net03\Scripts\LogFiles.ps1} -authentication credssp -credential domain01\admin01

Descrizione
-----------
In questo esempio viene illustrato come accedere a una condivisione di rete dall'interno di una sessione remota. 

Per questo comando è necessario che la delega CredSSP sia abilitata nelle impostazioni del client del 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.

Con il primo comando si utilizza il cmdlet Enable-WSManCredSSP per abilitare la delega CredSSP dal computer locale Server01 al computer remoto Server02. L'impostazione client CredSSP viene configurata nel computer locale.

Con il secondo comando si utilizza il cmdlet Connect-WSman per la connessione al computer Server02. Questa azione consente di aggiungere un nodo per il computer Server02 all'unità WSMan: nel computer locale, consentendo la visualizzazione e la modifica delle impostazioni di WS-Management nel computer Server02.

Nel terzo comando viene utilizzato il cmdlet Set-Item per modificare il valore dell'elemento CredSSP nel nodo Service del computer Server02 in True. Questa azione consente di abilitare CredSSP nelle impostazioni servizio nel computer remoto.

Con il quarto comando si utilizza il cmdlet New-PSSession per creare una sessione PSSession nel computer Server02. La sessione PSSession viene quindi salvata nella variabile $s.

Con il quinto comando si utilizza il cmdlet Invoke-Command per eseguire un comando Get-Item nella sessione in $s che ottiene uno script dalla condivisione di rete Net03\Scripts. Vengono utilizzati il parametro Credential e il parametro Authentication con un valore di CredSSP.






Vedere anche




Argomenti della Guida