Invoke-Command
Esegue comandi in computer locali e remoti.
Sintassi
Invoke-Command
[-StrictMode <Version>]
[-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>]
[-Subsystem <String>]
[-ConnectingTimeout <Int32>]
[-SSHTransport]
[-Options <Hashtable>]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<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>]
[-Subsystem <String>]
[-ConnectingTimeout <Int32>]
[-SSHTransport]
[-Options <Hashtable>]
[-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 SSHConnection 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 $j
Receive-Job
cmdlet e archivia i risultati nella $results
variabile .
Esempio 9: Includere variabili locali in un comando eseguito in un computer remoto
Questo esempio mostra come includere i valori delle variabili locali in un comando eseguito in un computer remoto. Il comando usa il Using
modificatore di ambito per identificare una variabile locale in un comando remoto. Per impostazione predefinita, si suppone che tutte le variabili siano definite nella sessione remota. Il Using
modificatore di ambito è stato introdotto in PowerShell 3.0. Per altre informazioni sul modificatore di Using
ambito, vedere about_Remote_Variables e about_Scopes.
$Log = '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-ChildItem
parametro Path è posizione 0 e il parametro Filter è posizione 1.
Per altre informazioni sulla $args
variabile, vedere about_Automatic_Variables
$parameters = @{
ComputerName = 'Server01'
ScriptBlock = { Get-ChildItem $args[0] $args[1] }
ArgumentList = 'C:\Test', '*.txt*'
}
Invoke-Command @parameters
Directory: C:\Test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 6/12/2019 15:15 128 alog.txt
-a--- 7/27/2019 15:16 256 blog.txt
-a--- 9/28/2019 17:10 64 zlog.txt
Invoke-Command
usa un parametro ScriptBlock e Get-ChildItem
specifica i $args[0]
valori 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 ConnectionURI consente di specificare 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à MaximumConnectionRedirectionCount 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 ConnectionURI 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 Administrators nel computer locale e nel computer remoto.
Enable-WSManCredSSP -Role Client -DelegateComputer Server02
$s = New-PSSession Server02
Invoke-Command -Session $s -ScriptBlock { Enable-WSManCredSSP -Role Server -Force }
$parameters = @{
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 un valore CredSSP e il parametro Credential con il valore Domain01\Admin01.
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 SSHConnection . Il parametro SSHConnection 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
Esempio 22: Connettersi a una sessione SSH remota usando le opzioni SSH
Questo esempio illustra come eseguire un file di script in un computer basato su Linux remoto usando le opzioni SSH. Il parametro Options accetta una tabella hash di valori passati come opzioni al comando sottostante ssh
che ha stabilito la connessione al sistema remoto.
$options = @{
Port=22
User = 'UserB'
Host = 'LinuxServer5'
}
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -KeyFilePath '/Users/UserB/id_rsa' -Options $options
Parametri
-AllowRedirection
Consente il reindirizzamento della connessione a un URI (Uniform Resource Identifier) alternativo.
Quando si usa il parametro ConnectionURI , la destinazione remota può restituire un'istruzione per il reindirizzamento a un URI diverso. Per impostazione predefinita, PowerShell non reindirizza le connessioni, ma è possibile usare questo parametro per consentire il reindirizzamento della connessione.
È anche possibile limitare il numero di reindirizzamenti della connessione modificando il valore dell'opzione di sessione MaximumConnectionRedirectionCount . Utilizzare il parametro MaximumRedirection del New-PSSessionOption
cmdlet o impostare la proprietà MaximumConnectionRedirectionCount della $PSSessionOption
variabile di preferenza. Il valore predefinito è 5.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-ApplicationName
Specifica il segmento dell'URI di connessione corrispondente al nome dell'applicazione. Usare questo parametro per specificare il nome dell'applicazione quando non si usa il parametro ConnectionURI nel comando .
Il valore predefinito è il valore della 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.
Tipo: | String |
Posizione: | Named |
Valore predefinito: | $PSSessionApplicationName if set on the local computer, otherwise WSMAN |
Necessario: | False |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | 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.
Tipo: | Object[] |
Alias: | Args |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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:
- Predefiniti
- 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.
Tipo: | AuthenticationMechanism |
Valori accettati: | Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential |
Posizione: | Named |
Valore predefinito: | Default |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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: .
Tipo: | String |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String[] |
Alias: | Cn |
Posizione: | 0 |
Valore predefinito: | Local computer |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String |
Posizione: | Named |
Valore predefinito: | $PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell |
Necessario: | False |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | 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
Tipo: | Int32 |
Posizione: | Named |
Valore predefinito: | Unlimited |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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 .
Tipo: | Uri[] |
Alias: | URI, CU |
Posizione: | 0 |
Valore predefinito: | http://localhost:5985/WSMAN |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-ContainerId
Specifica una matrice di ID contenitore.
Tipo: | String[] |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | 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?.
Tipo: | PSCredential |
Posizione: | Named |
Valore predefinito: | Current user |
Necessario: | False |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String |
Alias: | PSPath |
Posizione: | 1 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Alias: | HCN |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String[] |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Alias: | Disconnected |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | PSObject |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | 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.
Tipo: | String |
Posizione: | Named |
Valore predefinito: | Job<n> |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String |
Alias: | IdentityFilePath |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Options
Specifica una tabella hash delle opzioni SSH usate per la connessione a una sessione remota basata su SSH. Le opzioni possibili sono i valori supportati dalla versione basata su Unix del comando ssh .
Tutti i valori passati in modo esplicito dai parametri hanno la precedenza sui valori passati nella tabella hash Options . Ad esempio, l'uso del parametro Port esegue l'override di qualsiasi Port
coppia chiave-valore passata nella tabella hash Options.
Questo parametro è stato aggiunto in PowerShell 7.3.
Tipo: | Hashtable |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | Int32 |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-RemoteDebug
Usato per eseguire il comando richiamato in modalità di debug nella sessione remota di PowerShell.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-RunAsAdministrator
Indica che questo cmdlet richiama un comando come amministratore.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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 .
Tipo: | ScriptBlock |
Alias: | Command |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | PSSession[] |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String[] |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.Automation.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-PSSessionOption
di . 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.
Tipo: | PSSessionOption |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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 SSHConnection è utile per la creazione di 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.
Tipo: | Hashtable[] |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Valori accettati: | true |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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 .
Tipo: | String |
Posizione: | Named |
Valore predefinito: | powershell |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | Int32 |
Posizione: | Named |
Valore predefinito: | 32 |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | String |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | 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.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-VMId
Specifica una matrice di ID di macchine virtuali.
Tipo: | Guid[] |
Alias: | VMGuid |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
-VMName
Specifica una matrice di nomi di macchine virtuali.
Tipo: | String[] |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | True |
Accettare caratteri jolly: | False |
Input
È 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.
Se si usa il parametro InDisconnectedSession , questo cmdlet restituisce un oggetto PSSession .
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 SSHConnection 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.
L'eseguibile ssh
ottiene i dati di configurazione dalle origini seguenti nell'ordine seguente:
- opzioni della riga di comando
- File di configurazione dell'utente (~/.ssh/config)
- file di configurazione a livello di sistema (/etc/ssh/ssh_config)
I parametri del cmdlet seguenti vengono mappati in ssh
parametri e opzioni:
Parametro del cmdlet | Parametro ssh | opzione ssh -o equivalente |
---|---|---|
-KeyFilePath |
-i <KeyFilePath> |
-o IdentityFile=<KeyFilePath> |
-UserName |
-l <UserName> |
-o User=<UserName> |
-Port |
-p <Port> |
-o Port=<Port> |
-ComputerName -Subsystem |
-s <ComputerName> <Subsystem> |
-o Host=<ComputerName> |
Tutti i valori passati in modo esplicito dai parametri hanno la precedenza sui valori passati nella tabella hash Options . Per altre informazioni sui file, vedere ssh_config(5).For more information about ssh_config
files, see ssh_config(5).