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>]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-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]
      [-RemoteDebug]
      [-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]
      [-RemoteDebug]
      [-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]
      [-RemoteDebug]
      [-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]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMId] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMId] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      [-Port <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      -HostName <String[]>
      [-UserName <String>]
      [-KeyFilePath <String>]
      [-SSHTransport]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-Subsystem <String>]
      [-ConnectingTimeout <int>]
      [<CommonParameters>]
Invoke-Command
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -ContainerId <String[]>
      [<CommonParameters>]
Invoke-Command
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -ContainerId <String[]>
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      -SSHConnection <Hashtable[]>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      -FilePath <String>
      -HostName <String[]>
      [-UserName <String>]
      [-KeyFilePath <String>]
      [-SSHTransport]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      -FilePath <String>
      -SSHConnection <Hashtable[]>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<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 Invoke-Command per 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 eseguire un blocco di script come comando. PowerShell esegue il blocco di script immediatamente in un ambito figlio dell'ambito corrente.

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

A partire da PowerShell 6.0 è possibile usare Secure Shell (SSH) per stabilire una connessione e richiamare i comandi nei computer remoti. È necessario installare SSH nel computer locale e il computer remoto deve essere configurato con un endpoint SSH di PowerShell. Il vantaggio di una sessione remota di PowerShell basata su SSH è che funziona su più piattaforme (Windows, Linux, macOS). Per la sessione basata su SSH si usano i parametri HostName o SSH Connessione ion per specificare il computer remoto e le informazioni di connessione pertinenti. Per altre informazioni su come configurare la comunicazione remota SSH di PowerShell, vedere Comunicazione remota di PowerShell su SSH.

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

Questo esempio esegue 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 consente di specificare 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 persistente 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: Richiamare un comando con un blocco di script archiviato in una variabile

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

$command = {
    Get-WinEvent -LogName PowerShellCore/Operational |
      Where-Object -FilterScript { $_.Message -like '*certificate*' }
}
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command

La $command variabile archivia il Get-WinEvent comando formattato come blocco di script. Invoke-Command Esegue il comando archiviato in 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-WinEvent -LogName PowerShellCore/Operational }
}
Invoke-Command @parameters

Il parametro ComputerName specifica un elenco delimitato da virgole di nomi 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-WinEvent per ottenere i registri eventi di PowerShellCore/Operational 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 permanenti 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

Questo esempio esegue un comando su 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 nel $jReceive-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 = 'PowerShellCore/Operational'
Invoke-Command -ComputerName Server01 -ScriptBlock {
    Get-WinEvent -LogName $Using:Log -MaxEvents 10
}

La $Log variabile archivia il nome del registro eventi, PowerShellCore/Operational. Il Invoke-Command cmdlet viene eseguito Get-WinEvent 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'uso 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 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 -HideComputerName -ScriptBlock {
    Get-Process PowerShell
}

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 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 e $param1$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 valori di matrice alle posizioni dei parametri in un blocco di script. In questo esempio viene visualizzato il contenuto della directory di un server di .txt file. Il Get-ChildItemparametro 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 della matrice e $args[1] . 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 Invoke-Command cmdlet per eseguire lo Sample.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.

$parameters = @{
    ComputerName = (Get-Content Servers.txt)
    FilePath     = 'C:\Scripts\Sample.ps1'
    ArgumentList = 'Process', 'Service'
}
Invoke-Command @parameters

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

Questo esempio illustra come eseguire un comando in un computer remoto identificato da un URI (Uniform Resource Identifier). Questo particolare esempio 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 utilizzando la configurazione della sessione Microsoft.Exchange . Il parametro Connessione ionURI specifica l'URL dell'endpoint server di Exchange. Il parametro Credential specifica le credenziali archiviate nella $LiveCred variabile . Il parametro AuthenticationMechanism consente di specificare 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
$parameters = @{
    ComputerName  = 'server01'
    UseSSL        = $true
    ScriptBlock   = { Get-HotFix }
    SessionOption = $so
    Credential    = 'server01\user01'
}
Invoke-Command @parameters

Il New-PSSessionOption cmdlet crea un oggetto opzione di sessione che causa la mancata verifica dell'autorità di certificazione, del nome canonico e degli elenchi di revoche 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 modalità remota. Al parametro SessionOption viene assegnata la $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à Maximum Connessione ionRedirectionCount dell'oggetto PSSessionOption su 1.

Il Invoke-Command cmdlet esegue un Get-Mailbox comando in un server Microsoft Exchange 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 Connessione ionURI restituisce un messaggio di reindirizzamento, PowerShell reindirizza la connessione, ma se la nuova destinazione restituisce un altro messaggio di reindirizzamento, viene superato il valore del conteggio di reindirizzamento pari a 1 e Invoke-Command restituisce un errore non irreversibile.

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

Questo esempio illustra come accedere a una condivisione di rete da una sessione remota. Vengono usati tre computer 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 quindi Server02 esegue un secondo hop a Net03 per accedere alla condivisione di rete. Per altre informazioni su come la comunicazione remota di PowerShell supporta gli hop tra 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 del computer locale e nelle impostazioni del servizio nel computer remoto. Per eseguire i comandi in questo esempio, è necessario essere membri del gruppo Amministrazione istrators 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 = @{
  ComputerName   = 'Server02'
  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 condivisione di \\Net03\Scripts rete. Il comando usa il parametro Authentication con il valore CredSSP e il parametro Credential con il valore Domain01\Amministrazione 01.

Esempio 18: Avviare script in molti computer remoti

Questo esempio esegue uno script su più di un centinaio di 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         = [timespan]::FromHours(12)
  }
}
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 avvia 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 12 ore.

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

Esempio 19: Eseguire un comando in un computer remoto tramite SSH

Questo esempio illustra come eseguire un comando in un computer remoto usando Secure Shell (SSH). Se SSH è configurato nel computer remoto per richiedere le password, si riceverà una richiesta di password. In caso contrario, sarà necessario usare l'autenticazione utente basata su chiave SSH.

Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * }

Esempio 20: Eseguire un comando in un computer remoto usando SSH e specificare una chiave di autenticazione utente

Questo esempio illustra come eseguire un comando in un computer remoto usando SSH e specificando un file di chiave per l'autenticazione utente. Non verrà richiesta una password a meno che l'autenticazione della chiave non riesca e che il computer remoto sia configurato per consentire l'autenticazione della password di base.

$parameters = @{
    HostName    = 'UserA@LinuxServer01'
    ScriptBlock = { Get-MailBox * }
    KeyFilePath = '/UserA/UserAKey_rsa'
}
Invoke-Command

Esempio 21: Eseguire un file di script in più computer remoti usando SSH come processo

Questo esempio illustra come eseguire un file di script in più computer remoti usando SSH e il set di parametri SSH Connessione ion. Il parametro SSH Connessione ion accetta una matrice di tabelle hash che contengono informazioni di connessione per ogni computer. Questo esempio richiede che i computer remoti di destinazione abbiano SSH configurato per supportare l'autenticazione utente basata su chiave.

$sshConnections = @(
    @{
        HostName    = "WinServer1"
        UserName    = "Domain\UserA"
        KeyFilePath = "C:\Users\UserA\id_rsa"
    }
    @{
        HostName    = "UserB@LinuxServer5"
        KeyFilePath = "/Users/UserB/id_rsa"
    }
)
$results = Invoke-Command -FilePath c:\Scripts\GetInfo.ps1 -SSHConnection $sshConnections

Parametri

-AllowRedirection

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

Quando si usa il parametro Connessione ionURI, 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 dell'opzione di sessione Maximum Connessione ionRedirectionCount. Utilizzare il parametro MaximumRedirection del New-PSSessionOption cmdlet o impostare la proprietà Maximum Connessione ionRedirectionCount 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 Connessione ionURI nel comando .

Il valore predefinito è il valore della variabile di $PSSessionApplicationName 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 dei parametri per lo scriptblock. I parametri nel blocco di script vengono passati in base alla posizione dal valore della matrice fornito a ArgumentList. Questa operazione è nota come splatting della matrice. Per altre informazioni sul comportamento di ArgumentList, vedere about_Splatting.

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 comandi che richiedono molto tempo per il completamento.

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 modalità remota. 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
  • Di base
  • Credssp
  • Digest
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

Il valore predefinito è Default.

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

Attenzione

L'autenticazione credSSP (Credential Security Support Provider), in cui le credenziali dell'utente vengono passate a un computer remoto da autenticare, è progettato 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 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:Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential
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 viene quindi chiusa. Se è necessaria una connessione permanente, 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 di 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 sull'aggiunta di 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 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 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 solo il nome di configurazione, viene anteporto l'URI dello schema seguente: http://schemas.microsoft.com/PowerShell.

Se usato con SSH, questo parametro specifica il sottosistema da usare nella destinazione, come definito in sshd_config. Il valore predefinito per SSH è il powershell sottosistema .

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 $PSSessionConfigurationName 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

-ConnectingTimeout

Specifica la quantità di tempo in millisecondi consentita per il completamento della connessione SSH iniziale. Se la connessione non viene completata entro l'ora specificata, viene restituito un errore.

Questo parametro è stato introdotto in PowerShell 7.2

Type:Int32
Position:Named
Default value:Unlimited
Required:False
Accept pipeline input:False
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:

http://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 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:http://localhost:5985/WSMAN
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ContainerId

Specifica una matrice di ID contenitore.

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
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, oppure immettere un oggetto PSCredential generato dal Get-Credential cmdlet. Se si digita un nome utente, viene richiesto di immettere la password.

Le credenziali vengono archiviate in un oggetto PSCredential e la password viene archiviata come SecureString.

Nota

Per altre informazioni sulla protezione dei dati SecureString , vedere How secure is SecureString?.

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 nei 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, è possibile riconnettere le sessioni di loopback disconnesse con token interattivi, ovvero quelle create tramite EnableNetworkAccess, solo dal computer in cui è stata creata la sessione. Le sessioni disconnesse che usano l'autenticazione CredSSP possono essere riconnesse da altri computer. Per ulteriori 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 esistere 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 e lo esegue 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:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HostName

Specifica una matrice di nomi di computer per una connessione basata su Secure Shell (SSH). Questo è simile al parametro ComputerName , ad eccezione del fatto che la connessione al computer remoto viene effettuata tramite SSH anziché Windows WinRM.

Questo parametro è stato introdotto in PowerShell 6.0.

Type:String[]
Position:Named
Default value:None
Required:True
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 della restituzione di tutti i risultati, InDisconnectedSession assicura che tutti i risultati dei comandi 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à 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

-KeyFilePath

Specifica un percorso del file di chiave usato da Secure Shell (SSH) per autenticare un utente in un computer remoto.

SSH consente di eseguire l'autenticazione utente tramite chiavi private e pubbliche come alternativa all'autenticazione della password di base. Se il computer remoto è configurato per l'autenticazione della chiave, questo parametro può essere usato per fornire la chiave che identifica l'utente.

Questo parametro è stato introdotto in PowerShell 6.0.

Type:String
Aliases:IdentityFilePath
Position:Named
Default value:None
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 i comandi che omettono 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 (porta WinRM per HTTP) e 5986 (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

-RemoteDebug

Usato per eseguire il comando richiamato in modalità di debug nella sessione remota di PowerShell.

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

-RunAsAdministrator

Indica che questo cmdlet richiama un comando come Amministrazione istrator.

Type:SwitchParameter
Position:Named
Default value:False
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. Quando si usa Invoke-Command per eseguire un comando in modalità remota, tutte le variabili nel comando vengono valutate nel computer remoto.

Nota

I parametri per scriptblock possono essere passati solo da ArgumentList per posizione. I parametri switch non possono essere passati in base alla posizione. Se è necessario un parametro che si comporta come un tipo SwitchParameter , usare invece un tipo booleano .

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 di opzione di sessione.

Nota

Se si specifica una tabella hash per SessionOption, PowerShell converte la tabella hash in un oggetto System.Management.Autiomation.Remoting.PSSessionOption . Viene eseguito il cast dei valori per le chiavi specificate nella tabella hash alla proprietà corrispondente dell'oggetto . Questo comportamento è diverso rispetto alla chiamata New-PSSessionOptiondi . Ad esempio, i valori System.TimeSpan per le proprietà di timeout, ad esempio IdleTimeout, converte un valore intero in tick invece di millisecondi. Per altre informazioni sull'oggetto PSSessionOption e sulle relative proprietà, vedere PSSessionOption

I valori predefiniti per le opzioni sono determinati dal valore della variabile di $PSSessionOption 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

-SSHConnection

Questo parametro accetta una matrice di tabelle hash in cui ogni tabella hash contiene uno o più parametri di connessione necessari per stabilire una connessione Secure Shell (SSH). Il parametro SSH Connessione ion è utile per creare più sessioni in cui ogni sessione richiede informazioni di connessione diverse.

La tabella hash ha i membri seguenti:

  • ComputerName (o HostName)
  • Porta
  • UserName
  • KeyFilePath (o IdentityFilePath)

ComputerName (o HostName) è l'unica coppia chiave-valore necessaria.

Questo parametro è stato introdotto in PowerShell 6.0.

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

-SSHTransport

Indica che la connessione remota viene stabilita tramite Secure Shell (SSH).

Per impostazione predefinita, PowerShell usa Windows WinRM per connettersi a un computer remoto. Questa opzione forza PowerShell a usare il parametro HostName per stabilire una connessione remota basata su SSH.

Questo parametro è stato introdotto in PowerShell 6.0.

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

-Subsystem

Specifica il sottosistema SSH usato per la nuova sessione PSSession.

Specifica il sottosistema da usare nella destinazione come definito in sshd_config. Il sottosistema avvia una versione specifica di PowerShell con parametri predefiniti. Se il sottosistema specificato non esiste nel computer remoto, il comando ha esito negativo.

Se questo parametro non viene usato, il valore predefinito è il powershell sottosistema .

Type:String
Position:Named
Default value:powershell
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

-UserName

Specifica il nome utente per l'account usato per eseguire un comando nel computer remoto. Il metodo di autenticazione utente dipende dalla configurazione di Secure Shell (SSH) nel computer remoto.

Se SSH è configurato per l'autenticazione password di base, verrà richiesta la password utente.

Se SSH è configurato per l'autenticazione utente basata su chiave, è possibile specificare un percorso del file di chiave tramite il parametro KeyFilePath e non viene richiesta alcuna password. Se il file di chiave utente client si trova in un percorso noto SSH, il parametro KeyFilePath non è necessario per l'autenticazione basata su chiave e l'autenticazione utente viene eseguita automaticamente in base al nome utente. Per altre informazioni, vedere la documentazione SSH della piattaforma sull'autenticazione utente basata su chiave.

Questo non è un parametro obbligatorio. Se il parametro UserName non è specificato, per la connessione viene usato il nome utente connesso corrente.

Questo parametro è stato introdotto in PowerShell 6.0.

Type:String
Position:Named
Default value:None
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[]
Aliases:VMGuid
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 inviare tramite pipe un comando in un blocco di script a Invoke-Command. Usare la $Input variabile automatica per rappresentare gli oggetti di input nel comando .

Output

System.Management.Automation.PSRemotingJob

Se si usa il parametro AsJob , questo cmdlet restituisce un oggetto processo.

PSSession

Se si usa il parametro InDisconnectedSession , questo cmdlet restituisce un oggetto PSSession .

Object

Per impostazione predefinita, questo cmdlet restituisce l'output del comando richiamato, ovvero il valore del parametro ScriptBlock .

Note

PowerShell include gli alias seguenti per Invoke-Command:

  • Tutte le piattaforme:
    • icm

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 in cui viene ricevuto dai computer remoti, che potrebbero essere diversi.

Gli errori risultanti dal comando Invoke-Command eseguito vengono 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 irreversibili 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 si trova 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 una sessione PSSession usando il parametro InDisconnectedSession , lo stato della sessione è Disconnected e la disponibilità è None. Il valore della proprietà State è relativo alla sessione corrente. Il valore Disconnected indica che la sessione PSSession non è connessa alla sessione corrente. Tuttavia, non significa che la sessione PSSession sia disconnessa da tutte le sessioni. È possibile che sia connessa a una sessione diversa. Per determinare se è possibile connettersi o riconnettersi alla sessione, utilizzare la proprietà Availability .

Un valore availability di None indica che è possibile connettersi alla sessione. Un valore occupato indica che non è possibile connettersi alla sessione PSSession perché è connessa 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.

I parametri HostName e SSH Connessione ion sono stati inclusi a partire da PowerShell 6.0. Sono stati aggiunti per fornire la comunicazione remota di PowerShell basata su Secure Shell (SSH). PowerShell e SSH sono supportati in più piattaforme (Windows, Linux, macOS) e la comunicazione remota di PowerShell funziona su queste piattaforme in cui PowerShell e SSH sono installati e configurati. Questo comportamento è separato dalla comunicazione remota di Windows precedente basata su WinRM e molte delle funzionalità e limitazioni specifiche di WinRM non si applicano. Ad esempio, le quote basate su WinRM, le opzioni di sessione, la configurazione dell'endpoint personalizzata e le funzionalità di disconnessione/riconnessione non sono attualmente supportate. Per altre informazioni su come configurare la comunicazione remota SSH di PowerShell, vedere Comunicazione remota di PowerShell su SSH.