HOWTO · PowerShell
Come eseguire comandi utilizzando PowerShell Remoting
Scopri come funziona PowerShell Remoting, come configurare e verificare WinRM, creare e riutilizzare una PSSession ed eseguire comandi singoli con Invoke-Command.
In questa pagina
PowerShell Remoting consente di eseguire comandi su un altro computer tramite un endpoint di remoting configurato. Usa New-PSSession quando più comandi devono condividere lo stesso stato remoto; usa Invoke-Command con -ComputerName per un’attività che non richiede una sessione riutilizzabile. I comandi seguenti sono modelli: sostituisci DC01 con un host che sei autorizzato a gestire ed esegui i comandi di configurazione da una finestra di PowerShell con privilegi adeguati.
Come funziona PowerShell Remoting
Per una connessione WinRM, il client raggiunge un listener sul computer remoto, esegue l’autenticazione e avvia il comando richiesto in una sessione remota. PowerShell restituisce i risultati al client; molti oggetti attraversano la connessione come rappresentazioni serializzate e potrebbero quindi non conservare tutte le caratteristiche dell’oggetto originale in memoria. La comunicazione di remoting è protetta in base alla configurazione del trasporto e dell’autenticazione. Non presumere che ogni connessione usi HTTPS: WinRM usa comunemente HTTP con protezione a livello di messaggio per i metodi di autenticazione supportati, mentre HTTPS usa TLS a livello di trasporto. Le indicazioni sulla sicurezza di WinRM di Microsoft descrivono come l’autenticazione e il trasporto influiscano su questa protezione.
L’endpoint remoto determina quali comandi e autorizzazioni sono disponibili. Una connessione riuscita non concede automaticamente i privilegi di amministratore: l’account fornito deve essere autorizzato a usare l’endpoint e a eseguire l’operazione richiesta.
Abilitare e verificare WinRM
Su un computer Windows che deve accettare connessioni WinRM, un amministratore può configurare il remoting con Enable-PSRemoting -Force. Prima di modificare un computer gestito, esamina gli effetti e le policy della tua organizzazione. Per controllare i listener configurati, esegui winrm enumerate winrm/config/listener dal prompt dei comandi o da PowerShell. I dettagli del listener indicano il trasporto e gli indirizzi sui quali WinRM accetta connessioni. winrm quickconfig può mostrare o configurare le impostazioni di base del servizio e dei listener WinRM; non sostituisce la verifica delle regole del firewall, delle autorizzazioni dell’endpoint e della raggiungibilità di rete.
Usa HTTPS quando il tuo ambiente richiede il trasporto TLS e dispone di un certificato e di un listener HTTPS configurati correttamente. HTTP non significa che tutto il traffico di remoting venga inviato senza protezione: dopo l’autenticazione, WinRM applica la crittografia a livello di messaggio per i metodi di autenticazione supportati. La protezione effettiva dipende dal metodo di autenticazione e dalla configurazione; segui quindi i requisiti di sicurezza della tua organizzazione. Per le precisazioni documentate, consulta le indicazioni sulla sicurezza di WinRM di Microsoft.
TrustedHosts è un’impostazione lato client che può essere utile in un gruppo di lavoro o in altre configurazioni in cui il client non può autenticare il server secondo il consueto metodo basato sul dominio. Non è una soluzione universale ai problemi di connessione e non rende sicuro un server non attendibile. Le indicazioni sulla sicurezza di WinRM di Microsoft spiegano il contesto di autenticazione e le relative avvertenze; quando possibile, preferisci una configurazione appropriata basata su dominio o certificato. Se le policy richiedono TrustedHosts, limita l’impostazione agli host conosciuti e usa un metodo di autenticazione approvato. Puoi controllarla con winrm get winrm/config/client e modificarla solo dopo aver valutato le implicazioni per la sicurezza.
Creare e riutilizzare una PSSession
Crea una sessione remota persistente specificando una destinazione e le credenziali:
$credential = Get-Credential; $session = New-PSSession -ComputerName 'DC01' -Credential $credential
Esegui questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
$result = 'Ready to run the remote task.'
$result
Ready to run the remote task.
L’esempio precedente stampa una stringa locale e non si connette a un computer remoto. Per stabilire una connessione effettiva, esegui il comando inline in una sessione interattiva di PowerShell; Get-Credential richiede le credenziali invece di incorporare una password nel codice sorgente. L’account deve comunque avere l’autorizzazione per connettersi all’endpoint remoto. Dopo aver creato la sessione, passa l’oggetto sessione ai comandi che devono condividere la sessione e il relativo stato. Per esempio, usa Invoke-Command -Session $session -ScriptBlock { Get-Service -Name 'Spooler' } per eseguire un comando al suo interno. Una sessione persistente è utile quando devi svolgere più operazioni remote o mantenere disponibili variabili e altri dati di sessione tra una chiamata e l’altra.
Al termine, chiudi la connessione e rilascia la sessione con Remove-PSSession $session. Se la creazione non riesce, controlla il nome della destinazione, il percorso di rete, il listener WinRM, il firewall, le credenziali e le autorizzazioni dell’endpoint prima di modificare le impostazioni di attendibilità del client.
PowerShell può anche usare il remoting SSH quando la versione installata di PowerShell, il client SSH, il servizio SSH remoto e l’endpoint SSH di PowerShell configurato lo supportano. La guida di Microsoft al remoting SSH descrive i prerequisiti e la configurazione; consulta le indicazioni relative alle versioni e all’endpoint che usi, perché il supporto dipende da quell’ambiente. La documentazione di riferimento di New-PSSession descrive forme SSH come -HostName con -UserName e il parametro -SSHConnection per i dettagli della connessione. Queste opzioni non configurano al posto tuo il servizio SSH remoto né l’endpoint di PowerShell.
Eseguire comandi singoli con Invoke-Command
Per una singola attività, Invoke-Command -ComputerName si connette per la durata della chiamata e ne restituisce i risultati senza lasciare un oggetto sessione da riutilizzare. Per esempio, Invoke-Command -ComputerName 'DC01' -Credential (Get-Credential) -ScriptBlock { Get-Service -Name 'Spooler' } richiede le credenziali e recupera le informazioni sul servizio dal computer remoto. Usa un account autorizzato dall’endpoint; il remoting non eleva di per sé i privilegi dell’account.
Ecco un esempio locale autonomo che invoca un blocco di script. Mostra la sintassi del comando con blocco di script senza contattare un computer remoto; per lavorare in remoto, sostituiscilo con una chiamata configurata con -ComputerName o basata su una sessione:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
$result = Invoke-Command -ScriptBlock { 'Ready to run the remote task.' }
$result
Per le operazioni remote, le variabili a cui si fa riferimento all’interno di un blocco di script vengono valutate sul lato remoto. Passa esplicitamente i valori locali con -ArgumentList e l’ambito automatico $using: quando opportuno, ed evita di inserire password direttamente nel codice sorgente. Usa invece New-PSSession se i comandi successivi devono condividere una connessione persistente o lo stato della sessione remota.