Share via


about_Remote_FAQ

Aggiornamento: agosto 2012

Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0

ARGOMENTO

about_Remote_FAQ

DESCRIZIONE BREVE

Questo articolo contiene le domande e le risposte sull'esecuzione di comandi remoti in Windows PowerShell®.

DESCRIZIONE LUNGA

Quando si lavora in modalità remota, i comandi vengono digitati in Windows PowerShell su un computer (noto come "computer locale"), ma vengono eseguiti in un altro computer (noto come "computer remoto"). L'esperienza di utilizzo in modalità remota deve essere il più simile possibile a quando si lavora direttamente sul computer remoto.

Nota: Per usare la comunicazione remota di Windows PowerShell, il computer remoto deve essere configurato per l'utilizzo in remoto. Per altre informazioni, vedere about_Remote_Requirements.

IN ENTRAMBI I COMPUTER DEVE ESSERE INSTALLATO WINDOWS POWERSHELL?

Sì. Per lavorare in modalità remota, è necessario che sul computer locale e su quello remoto siano installati Windows PowerShell, Microsoft .NET Framework e Servizi Web per il protocollo di gestione (WS-Management). Tutti i file e le altre risorse necessarie per eseguire un comando specifico devono trovarsi nel computer remoto.

I computer che eseguono Windows PowerShell 3.0 e i computer che eseguono Windows PowerShell 2.0 possono connettersi tra loro in modalità remota ed eseguire comandi remoti. Tuttavia, alcune funzionalità, ad esempio la possibilità di disconnettersi da una sessione e poi riconnettersi, funzionano solo quando entrambi i computer eseguono Windows PowerShell 3.0.

È necessario disporre delle autorizzazioni per connettersi al computer remoto, per eseguire Windows PowerShell e per accedere ad archivi dati (ad esempio file e cartelle) e al Registro di sistema sul computer remoto.

Per altre informazioni, vedere about_Remote_Requirements.

COME FUNZIONA LA COMUNICAZIONE REMOTA?

Quando si invia un comando remoto, il comando viene trasmesso attraverso la rete al motore Windows PowerShell nel computer remoto e viene eseguito nel client Windows PowerShell sul computer remoto. I risultati del comando vengono inviati nuovamente al computer locale e vengono visualizzati nella sessione di Windows PowerShell nel computer locale.

Per trasmettere i comandi e ricevere l'output, Windows PowerShell usa il protocollo WS-Management. Per informazioni sul protocollo WS-Management, vedere l'argomento relativo al protocollo WS-Management in MSDN (Microsoft Developer Network) Library all'indirizzo https://go.microsoft.com/fwlink/?LinkId=144634.

A partire da Windows PowerShell 3.0, le sessioni remote vengono archiviate nel computer remoto. Ciò consente di disconnettersi dalla sessione e di riconnettersi da un'altra sessione o da un computer diverso senza interrompere i comandi o perdere lo stato.

LA COMUNICAZIONE REMOTA DI WINDOWS POWERSHELL È SICURA?

Quando ci si connette a un computer remoto, il sistema usa le credenziali nome utente e password nel computer locale o le credenziali fornite nel comando per accedere al computer remoto. Le credenziali e il resto della trasmissione vengono crittografati.

Per aggiungere un'ulteriore protezione, è possibile configurare il computer remoto per l'utilizzo di Secure Sockets Layer (SSL) anziché HTTP per ascoltare le richieste di Gestione remota Windows (WinRM). Quindi, gli utenti possono usare i parametri UseSSL dei cmdlet Invoke-Command, New-PSSession e Enter-PSSession quando si stabilisce una connessione. Questa opzione usa il canale HTTPS, più sicuro, anziché HTTP.

TUTTI I COMANDI REMOTI RICHIEDONO LA COMUNICAZIONE REMOTA DI WINDOWS POWERSHELL?

No. Alcuni cmdlet dispongono di un parametro ComputerName che consente di recuperare gli oggetti dal computer remoto.

Tali cmdlet non usano la comunicazione remota di Windows PowerShell. Pertanto, è possibile usarli in qualsiasi computer che esegue Windows PowerShell, anche se il computer non è configurato per la comunicazione remota di Windows PowerShell o non soddisfa i requisiti per la comunicazione remota di Windows PowerShell.

Sono inclusi in questa categoria i cmdlet seguenti:

       Get-Process
       Get-Service
       Get-WinEvent
       Get-EventLog
       Get-WmiObject
       Test-Connection

Per trovare tutti i cmdlet con un parametro ComputerName, digitare:

        Get-Help * -Parameter ComputerName
        or 
        Get-Command -ParameterName ComputerName

Per determinare se il parametro ComputerName di uno specifico cmdlet richiede la comunicazione remota di Windows PowerShell, vedere la descrizione del parametro. Per visualizzare la descrizione del parametro, digitare:

        Get-Help <cmdlet-name> -Parameter ComputerName

Ad esempio:

        Get-Help Get-Process -Parameter Computername

Per tutti gli altri comandi, usare il cmdlet Invoke-Command.

COME SI ESEGUE UN COMANDO SU UN COMPUTER REMOTO?

Per eseguire un comando su un computer remoto, usare il cmdlet Invoke-Command.

Racchiudere il comando tra parentesi graffe ({}) per renderlo un blocco di script. Usare il parametro ScriptBlock di Invoke-Command per specificare il comando.

È possibile usare il parametro ComputerName di Invoke-Command per specificare un computer remoto. In alternativa, è possibile creare una connessione permanente a un computer remoto (una sessione), quindi usare il parametro Session di Invoke-Command per eseguire il comando nella sessione.

Ad esempio, i comandi seguenti eseguono un comando Get-Process in modalità remota.

      Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}

        - OR -

      Invoke-Command -Session $s -ScriptBlock {Get-Process}

Per interrompere un comando remoto, premere CTRL+C. La richiesta di interruzione viene passata al computer remoto, dove termina il comando remoto.

Per altre informazioni sui comandi remoti, vedere about_Remote e gli argomenti della Guida relativi ai cmdlet che supportano la comunicazione remota.

È POSSIBILE SEMPLICEMENTE ESEGUIRE IL COMANDO "TELNET IN" UN COMPUTER REMOTO?

È possibile usare il cmdlet Enter-PSSession per avviare una sessione interattiva con un computer remoto.

Nel prompt di Windows PowerShell, digitare:

        Enter-PSSession <ComputerName>

Il prompt dei comandi cambia per mostrare che l'utente è connesso al computer remoto.

        <ComputerName>\C:>

Ora i comandi digitati vengono eseguiti nel computer remoto come se fossero stati digitati direttamente in tale computer.

Per terminare una sessione interattiva, digitare:

        Exit-PSSession

Una sessione interattiva è una sessione permanente che fa uso del protocollo WS-Management, diverso da Telnet, ma che offre un'esperienza simile.

Per altre informazioni, vedere Enter-PSSession.

È POSSIBILE CREARE UNA CONNESSIONE PERMANENTE?

Sì. È possibile eseguire i comandi remoti specificando il nome del computer remoto, il relativo nome NetBIOS o l'indirizzo IP. In alternativa, è possibile eseguire i comandi remoti specificando una sessione Windows PowerShell (PSSession) connessa al computer remoto.

Quando si usa il parametro ComputerName di Invoke-Command o Enter-PSSession, Windows PowerShell stabilisce una connessione temporanea. Windows PowerShell usa la connessione per eseguire solo il comando corrente, quindi la chiude. Si tratta di un metodo molto efficace per l'esecuzione di un singolo comando o di diversi comandi non correlati, anche su molti computer remoti.

Quando si usa il cmdlet New-PSSession per creare una PSSession, Windows PowerShell stabilisce una connessione permanente per la PSSession. Quindi, è possibile eseguire più comandi nella PSSession, inclusi quelli che condividono i dati. Inserire testo della sezione qui.

Generalmente, si crea una PSSession per eseguire una serie di comandi correlati che condividono i dati. In alternativa, la connessione temporanea creata dal parametro ComputerName è sufficiente per la maggior parte dei comandi.

Per altre informazioni sulle sessioni, vedere about_PSSessions.

È POSSIBILE ESEGUIRE COMANDI SU PIÙ COMPUTER CONTEMPORANEAMENTE?

Sì. Il parametro ComputerName del cmdlet Invoke-Command accetta più nomi di computer e il parametro Session accetta più PSSession.

Quando si esegue un comando Invoke-Command, Windows PowerShell esegue i comandi su tutti i computer specificati o in tutte le PSSession specificate.

Windows PowerShell è in grado di gestire centinaia di connessioni remote simultanee. Tuttavia, il numero di comandi remoti che è possibile inviare potrebbe essere limitato dalle risorse del computer e dalla sua capacità di stabilire e gestire più connessioni di rete.

Per altre informazioni, vedere l'esempio nell'argomento della Guida relativo a Invoke-Command.

DOVE SI TROVANO I PROFILI DELL'UTENTE?

I profili di Windows PowerShell non vengono eseguiti automaticamente nelle sessioni remote, pertanto i comandi aggiunti dal profilo non sono presenti nella sessione. Inoltre, la variabile automatica $profile non viene popolata nelle sessioni remote.

Per eseguire un profilo in una sessione, usare il cmdlet Invoke-Command.

Ad esempio, il seguente comando esegue il profilo CurrentUserCurrentHost dal computer locale nella sessione in $s.

        Invoke-Command -Session $s -FilePath $profile

Il seguente comando esegue il profilo CurrentUserCurrentHost dal computer remoto nella sessione in $s. Poiché la variabile $profile non è popolata, il comando usa il percorso esplicito nel profilo.

        Invoke-Command -Session $s {. "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"}

Dopo aver eseguito questo comando, i comandi aggiunti alla sessione dal profilo sono disponibili in $s.

È anche possibile usare uno script di avvio in una configurazione di sessione per l'esecuzione di un profilo in ogni sessione remota che usa la configurazione della sessione.

Per altre informazioni sui profili di Windows PowerShell, vedere about_Profiles. Per altre informazioni sulle configurazioni di sessione, vedere Register-PSSessionConfiguration.

COME FUNZIONA LA LIMITAZIONE NEI COMANDI REMOTI?

Per gestire le risorse sul computer locale, Windows PowerShell include una funzionalità di limitazione per ogni comando che consente di limitare il numero di connessioni remote simultanee stabilite per ogni comando.

Il valore predefinito è 32 connessioni simultanee, ma è possibile usare i parametri ThrottleLimit dei cmdlet per impostare un limite personalizzato per comandi specifici.

Quando si usa la funzionalità di limitazione, tenere presente che viene applicata a ogni comando, non all'intera sessione o al computer. Se si eseguono comandi contemporaneamente in più sessioni o PSSession, il numero di connessioni simultanee è la somma di connessioni simultanee in tutte le sessioni.

Per trovare i cmdlet con un parametro ThrottleLimit, digitare:

      Get-Help * -Parameter ThrottleLimit
      -or-
      Get-Command -ParameterName ThrottleLimit

L'OUTPUT DEI COMANDI REMOTI È DIVERSO DALL'OUTPUT LOCALE?

Quando si usa Windows PowerShell localmente, si inviano e ricevono oggetti .NET Framework "attivi". Gli oggetti "attivi" sono oggetti associati a programmi o componenti di sistema effettivi. Quando si richiamano i metodi o si modificano le proprietà degli oggetti attivi, le modifiche influiscono sul programma o sul componente effettivo. Inoltre, quando le proprietà di un programma o componente cambiano, cambiano anche le proprietà dell'oggetto che le rappresenta.

Tuttavia, poiché la maggior parte degli oggetti attivi non può essere trasmessa in rete, Windows PowerShell "serializza" gran parte degli oggetti inviati in comandi remoti, ossia converte ogni oggetto in una serie di elementi di dati XML (Constraint Language in XML [CLiXML]) per la trasmissione.

Quando Windows PowerShell riceve un oggetto serializzato, converte il codice XML in un tipo di oggetto deserializzato. L'oggetto deserializzato è una registrazione accurata delle proprietà del programma o del componente in un momento precedente, ma non è più "attivo", ossia non è più direttamente associato al componente. Inoltre, i metodi vengono rimossi perché non sono più validi.

In genere, è possibile usare gli oggetti deserializzati nello stesso modo in cui si usano gli oggetti attivi, ma è necessario tenere presenti le loro limitazioni. Inoltre, gli oggetti restituiti dal cmdlet Invoke-Command hanno proprietà aggiuntive che consentono di determinare l'origine del comando.

Alcuni tipi di oggetto, ad esempio gli oggetti DirectoryInfo e GUID, vengono convertiti di nuovo in oggetti attivi quando vengono ricevuti. Questi oggetti non necessitano di una gestione o formattazione speciale.

Per informazioni sull'interpretazione e sulla formattazione dell'output remoto, vedere about_Remote_Output.

È POSSIBILE ESEGUIRE PROCESSI IN BACKGROUND IN MODALITÀ REMOTA?

Sì. Un processo in background di Windows PowerShell è un comando di Windows PowerShell che viene eseguito in modo asincrono senza interazioni con la sessione. Quando si avvia un processo in background, viene restituito immediatamente il prompt dei comandi ed è possibile continuare a lavorare nella sessione mentre viene eseguito il processo, anche se l'esecuzione dura per un lungo periodo di tempo.

È possibile avviare un processo in background anche mentre sono in esecuzione altri comandi perché i processi in background vengono sempre eseguiti in modo asincrono in una sessione temporanea. Inserire il corpo della sezione qui.

È possibile eseguire processi in background in un computer locale o remoto. Per impostazione predefinita, i processi in background vengono eseguiti nel computer locale. Tuttavia, è possibile usare il parametro AsJob del cmdlet Invoke-Command per eseguire qualsiasi comando remoto come processo in background. Inoltre, è possibile usare Invoke-Command per eseguire un comando Start-Job in modalità remota.

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

È POSSIBILE ESEGUIRE PROGRAMMI WINDOWS IN UN COMPUTER REMOTO?

È possibile usare i comandi remoti di Windows PowerShell per eseguire programmi basati su Windows in computer remoti. Ad esempio, è possibile eseguire Shutdown.exe o Ipconfig in un computer remoto.

Tuttavia, non è possibile usare i comandi di Windows PowerShell per aprire l'interfaccia utente di un programma in un computer remoto.

Quando si avvia un programma Windows in un computer remoto, il comando non viene completato e il prompt dei comandi di Windows PowerShell non viene restituito, fino a quando il programma non viene terminato o si preme CTRL+C per interrompere il comando. Ad esempio, se si esegue il programma IpConfig in un computer remoto, il prompt dei comandi non viene restituito fino al completamento di IpConfig.

Se si usano i comandi remoti per avviare un programma dotato di interfaccia utente, il processo del programma viene avviato, ma l'interfaccia utente non verrà visualizzata. Il comando Windows PowerShell non viene completato e il prompt dei comandi non viene restituito fino a quando non si arresta il processo del programma o si preme CTRL+C, che interrompe il comando e arresta il processo.

Ad esempio, se si usa un comando di Windows PowerShell per eseguire il Blocco note in un computer remoto, il processo del Blocco note viene avviato nel computer remoto, ma l'interfaccia utente non viene visualizzata. Per interrompere il comando e ripristinare il prompt dei comandi, premere CTRL+C.

È POSSIBILE LIMITARE I COMANDI CHE GLI UTENTI POSSONO ESEGUIRE IN MODALITÀ REMOTA SUL COMPUTER?

Sì. Ogni sessione remota deve usare una delle configurazioni di sessione sul computer remoto. È possibile gestire le configurazioni di sessione nel computer (e le autorizzazioni per tali configurazioni di sessione) per determinare chi può eseguire comandi in modalità remota nel computer e quali comandi possono essere eseguiti.

Una configurazione di sessione consente di configurare l'ambiente per la sessione. È possibile definire la configurazione usando un assembly che implementa una nuova classe di configurazione o uno script che viene eseguito nella sessione. La configurazione è in grado di determinare i comandi disponibili nella sessione. Inoltre, la configurazione può includere le impostazioni che consentono di proteggere il computer, ad esempio quelle che limitano la quantità di dati che la sessione può ricevere in un singolo oggetto o comando. È anche possibile specificare un descrittore di sicurezza che determina le autorizzazioni necessarie per usare la configurazione.

Il cmdlet Enable-PSRemoting crea le configurazioni di sessione predefinite nel computer in uso: Microsoft.PowerShell, Microsoft.PowerShell.Workflow e Microsoft.PowerShell32 (solo sistemi operativi a 64 bit). Enable-PSRemoting imposta il descrittore di sicurezza per la configurazione per consentire solo ai membri del gruppo Administrators del computer in uso di utilizzarle.

Per modificare le configurazioni di sessione predefinite, creare nuove configurazioni di sessione e modificare i descrittori di sicurezza di tutte le configurazioni di sessione, è possibile usare i cmdlet della configurazione di sessione.

A partire da Windows PowerShell 3.0, il cmdlet New-SessionConfigurationFile consente di creare configurazioni di sessione personalizzate per mezzo di un file di testo. Il file include opzioni per l'impostazione della modalità linguaggio e per specificare i cmdlet e i moduli disponibili nelle sessioni che usano la configurazione della sessione.

Quando gli utenti usano i cmdlet Invoke-Command, New-PSSession o Enter-PSSession, possono usare il parametro ConfigurationName per indicare la configurazione di sessione usata per la sessione. Inoltre, possono modificare la configurazione predefinita usata dalle loro sessioni modificando il valore della variabile di preferenza $PSSessionConfigurationName nella sessione.

Per altre informazioni sulle configurazioni di sessione, vedere la Guida relativa ai cmdlet di configurazione di sessione. Per trovare i cmdlet di configurazione di sessione, digitare:

        Get-Command *PSSessionConfiguration

QUALI SONO LE CONFIGURAZIONI DI TIPO FAN-IN E FAN-OUT?ARGOMENTO

Lo scenario di comunicazione remota di Windows PowerShell più comune in cui sono coinvolti più computer è la configurazione uno-a-molti, in cui un computer locale (il computer dell'amministratore) esegue i comandi di Windows PowerShell su molti computer remoti. Questo tipo di scenario è noto come configurazione "fan-out".

Tuttavia, in alcune aziende, la configurazione è molti-a-uno, dove molti computer client si connettono a un solo computer remoto che esegue Windows PowerShell, ad esempio un file server o un chiosco. Questo scenario è noto come configurazione "fan-in".

La comunicazione remota di Windows PowerShell supporta le configurazioni di tipo fan-out e fan-in.

Per la configurazione di tipo fan-out, Windows PowerShell usa i servizi Web per il protocollo di gestione (WS-Management) e il servizio Gestione remota Windows (WinRM) che supporta l'implementazione Microsoft di WS-Management. Quando un computer locale si connette a un computer remoto, WS-Management stabilisce una connessione e usa un plug-in affinché Windows PowerShell avvii il processo host di Windows PowerShell (Wsmprovhost.exe) nel computer remoto. L'utente può specificare una porta alternativa, una diversa configurazione di sessione e altre funzionalità per personalizzare la connessione remota.

Per supportare la configurazione "fan-in", Windows PowerShell usa Internet Information Services (IIS) per ospitare WS-Management, per caricare il plug-in Windows PowerShell e per avviare Windows PowerShell. In questo scenario, anziché avviare ogni sessione Windows PowerShell in un processo separato, tutte le sessioni Windows PowerShell vengono eseguite nello stesso processo host.

L'hosting IIS e la gestione remota fan-in non sono supportati in Windows XP o Windows Server 2003.

In una configurazione fan-in, l'utente può specificare un URI di connessione e un endpoint HTTP, inclusi il trasporto, il nome del computer, la porta e il nome dell'applicazione. IIS inoltra tutte le richieste con un nome di applicazione specifico all'applicazione. L'impostazione predefinita è WS-Management, in grado di ospitare Windows PowerShell.

È anche possibile specificare un meccanismo di autenticazione e impedire o consentire il reindirizzamento da endpoint HTTP e HTTPS.

È POSSIBILE TESTARE LA COMUNICAZIONE REMOTA IN UN SINGOLO COMPUTER (NON IN UN DOMINIO)?

Sì. La comunicazione remota di Windows PowerShell è disponibile anche quando il computer locale non fa parte di un dominio. È possibile usare le funzionalità di comunicazione remota per connettersi alle sessioni e per creare sessioni nello stesso computer. Le funzionalità funzionano esattamente come quando ci si connette a un computer remoto.

Per eseguire i comandi remoti in un computer in un gruppo di lavoro, modificare le impostazioni di Windows seguenti nel computer.

Attenzione: queste impostazioni interessano tutti gli utenti del sistema e rendono il sistema più vulnerabile a eventuali attacchi da parte di utenti malintenzionati. Apportare queste modifiche con cautela.

-- Windows XP con SP2:

Usare le impostazioni di protezione locale (Secpol.msc) per impostare il criterio "Accesso alla rete: modello di condivisione e sicurezza per gli account locali" in Impostazioni di protezione\Criteri locali\Opzioni di protezione su "Classico".

-- Windows Vista, Windows 7, Windows 8:

Creare la voce seguente del Registro di sistema e impostarne il valore su 1: LocalAccountTokenFilterPolicy in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

È possibile usare il comando seguente di Windows PowerShell per aggiungere questa voce:

        New-ItemProperty `
        –Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System `
        –Name LocalAccountTokenFilterPolicy –propertyType DWord –Value 1

-- Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2012 R2:

Non sono necessarie modifiche poiché l'impostazione predefinita del criterio "Accesso alla rete: modello di condivisione e protezione per gli account locali" è "Classico". Verificare l'impostazione nel caso in cui sia stata modificata.

È POSSIBILE ESEGUIRE COMANDI REMOTI IN UN COMPUTER IN UN ALTRO DOMINIO?

Sì. In genere, i comandi vengono eseguiti senza errori, anche se potrebbe essere necessario usare il parametro Credential dei cmdlet Invoke-Command, New-PSSession o Enter-PSSession per fornire le credenziali di un membro del gruppo Administrators sul computer remoto. Tali credenziali talvolta sono necessarie anche quando l'utente corrente è un membro del gruppo Administrators nel computer locale e nei computer remoti.

Tuttavia, se il computer remoto non fa parte di un dominio considerato attendibile dal computer locale, potrebbe non essere in grado di autenticare le credenziali dell'utente.

Per abilitare l'autenticazione, usare il comando seguente per aggiungere il computer remoto all'elenco di host attendibili per il computer locale in WinRM. Digitare il comando nel prompt dei comandi di Windows PowerShell.

        Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>

Ad esempio, per aggiungere il computer Server01 all'elenco di host attendibili nel computer locale, digitare il comando seguente nel prompt dei comandi di Windows PowerShell:

        Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01

VEDERE ANCHE

about_Remote

about_Profiles

about_PSSessions

about_Remote_Jobs

about_Remote_Variables

Invoke-Command

New-PSSession