ARGOMENTO about_Remote_FAQ DESCRIZIONE BREVE Contiene domande e risposte relative all'esecuzione di comandi remoti in Windows PowerShell. DESCRIZIONE DETTAGLIATA Quando si opera in modalità remota, i comandi vengono digitati in Windows PowerShell in un computer (noto come computer locale), ma vengono eseguiti in un altro computer (noto come computer remoto). L'utilizzo della modalità remota deve avvicinarsi il più possibile all'utilizzo diretto del computer remoto. Nota: per utilizzare Windows PowerShell in modalità remota, è necessario configurare il computer remoto per la comunicazione remota. Per ulteriori informazioni, vedere about_Remote_Requirements. È NECESSARIO CHE IN ENTRAMBI I COMPUTER SIA INSTALLATO WINDOWS POWERSHELL? Sì. Per utilizzare la modalità remota, è necessario che il computer locale e quello remoto dispongano di Windows PowerShell, Microsoft .NET Framework 2.0 e il protocollo WS-Management. I file e le altre risorse necessarie per eseguire un determinato comando devono trovarsi nel computer remoto. È necessario disporre di autorizzazioni per connettersi al computer remoto, per eseguire Windows PowerShell e per accedere agli archivi dati (ad esempio file e cartelle) e al Registro di sistema nel computer remoto. Per ulteriori 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 di Windows PowerShell nel computer remoto ed eseguito nel client di Windows PowerShell nel computer remoto. I risultati del comando vengono restituiti al computer locale e visualizzati nella sessione di Windows PowerShell nel computer locale. Per trasmettere i comandi e ricevere l'output, in Windows PowerShell viene utilizzato il protocollo WS-Management. Per informazioni su tale protocollo, vedere la sezione relativa al protocollo WS-Management in MSDN Library (Microsoft Developer Network) all'indirizzo https://go.microsoft.com/fwlink/?LinkId=14463 4 (le informazioni potrebbero essere in lingua inglese). LA COMUNICAZIONE REMOTA IN WINDOWS POWERSHELL È SICURA? Quando si effettua la connessione a un computer remoto, vengono utilizzate le credenziali di nome utente e password del computer locale o quelle fornite nel comando per l'accesso al computer remoto. Le credenziali e il resto della trasmissione sono crittografati. Per una maggiore protezione, è possibile configurare il computer remoto per l'utilizzo di Secure Sockets Layer (SSL) anziché HTTP per l'ascolto delle richieste di Gestione remota Windows (WinRM). Gli utenti possono quindi utilizzare i parametri UseSSL dei cmdlet Invoke-Command, New-PSSession ed Enter-PSSession per stabilire una connessione. Con questa opzione viene utilizzato il canale HTTPS, più sicuro di HTTP. TUTTI I COMANDI REMOTI RICHIEDONO LA COMUNICAZIONE REMOTA DI WINDOWS POWERSHELL? No. Diversi cmdlet dispongono di un parametro ComputerName che consente di ottenere oggetti dal computer remoto. Con questi cmdlet non viene utilizzata la comunicazione remota di Windows PowerShell. È pertanto possibile utilizzare questi cmdlet in qualsiasi computer in cui viene eseguito Windows PowerShell, anche se il computer non è configurato per la comunicazione remota di Windows PowerShell o non soddisfa i requisiti per tale funzionalità. Tra questi cmdlet sono inclusi: 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 Per determinare se il parametro ComputerName di un determinato cmdlet richiede la comunicazione remota di Windows PowerShell, vedere la descrizione del parametro. Per visualizzare la descrizione del parametro, digitare: get-help <nome-cmdlet> -parameter ComputerName Ad esempio: get-help get-process -parameter ComputerName Per tutti gli altri comandi, utilizzare il cmdlet Invoke-Command. COME SI ESEGUE UN COMANDO IN UN COMPUTER REMOTO? Per eseguire un comando in un computer remoto, utilizzare il cmdlet Invoke-Command. Racchiudere il comando tra parentesi graffe ( {} ) per renderlo un blocco di script. Utilizzare il parametro ScriptBlock di Invoke-Command per specificare il comando. È possibile utilizzare il parametro ComputerName di Invoke-Command per specificare un computer remoto. In alternativa, è possibile creare una connessione permanente a un computer remoto (sessione) e utilizzare quindi il parametro Session di Invoke-Command per eseguire il comando nella sessione. Ad esempio, con i comandi seguenti viene eseguito un comando Get-Process in modalità remota. invoke-command -computername Server01, Server02 -scriptblock {get-process} - OPPURE invoke-command -session $s -scriptblock {get-process} Per interrompere un comando remoto, digitare CTRL+C. La richiesta di interruzione viene passata al computer remoto, dove viene terminato il comando remoto. Per ulteriori informazioni sui comandi remoti, vedere about_Remote e gli argomenti della Guida per i cmdlet che supportano la comunicazione remota. È POSSIBILE AVVIARE SOLO UNA SESSIONE TELNET IN UN COMPUTER REMOTO? È possibile utilizzare il cmdlet Enter-PSSession per avviare una sessione interattiva con un computer remoto. Al prompt di Windows PowerShell, digitare: Enter-PSSession <ComputerName> Il prompt dei comandi viene modificato per indicare la connessione al computer remoto. <ComputerName>\C:> A questo punto i comandi digitati vengono eseguiti nel computer remoto, come se venissero digitati direttamente nel computer remoto. Per terminare la sessione interattiva, digitare: Exit-PSSession Una sessione interattiva è una sessione permanente che utilizza il protocollo WS-Management. Non equivale all'utilizzo di Telnet, benché offra un'esperienza analoga. Per ulteriori informazioni, vedere Enter-PSSession. È POSSIBILE CREARE UNA CONNESSIONE PERMANENTE? Sì. È possibile eseguire comandi remoti specificando il nome, il nome NetBIOS o l'indirizzo IP del computer remoto. In alternativa, è possibile eseguire comandi remoti specificando una sessione di Windows PowerShell (PSSession) connessa al computer remoto. Quando si utilizza il parametro ComputerName di Invoke-Command o Enter-PSSession, in Windows PowerShell viene stabilita una connessione temporanea. Tale connessione viene utilizzata in Windows PowerShell solo per eseguire il comando corrente, quindi viene chiusa. Si tratta di un metodo molto efficiente per l'esecuzione di un solo comando o di molti comandi non correlati, anche su diversi computer remoti. Quando si utilizza il cmdlet New-PSSession per creare una sessione PSSession, in Windows PowerShell viene stabilita una connessione permanente per tale sessione PSSession. È quindi possibile eseguire più comandi nella sessione PSSession, inclusi comandi che condividono dati. In genere, una sessione PSSession viene creata per eseguire una serie di comandi correlati che condividono dati. In caso contrario, la connessione temporanea creata mediante il parametro ComputerName è sufficiente per la maggior parte dei comandi. Per ulteriori informazioni sulle sessioni, vedere about_PSSessions. È POSSIBILE ESEGUIRE COMANDI IN PIÙ COMPUTER CONTEMPORANEAMENTE? Sì. Il parametro ComputerName del cmdlet Invoke-Command accetta più nomi di computer e il parametro Session accetta più sessioni PSSession. Quando si esegue un comando Invoke-Command, in Windows PowerShell i comandi vengono eseguiti in tutti i computer specificati o in tutte le sessioni 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 relativa capacità di stabilire e gestire più connessioni di rete. Per ulteriori informazioni, vedere l'esempio nell'argomento della Guida relativo a Invoke-Command. DOVE SONO I PROFILI? 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 compilata nelle sessioni remote. Per eseguire un profilo in una sessione, utilizzare il cmdlet Invoke-Command. Ad esempio, mediante il comando seguente viene eseguito il profilo CurrentUserCurrentHost dal computer locale nella sessione in $s. invoke-command -session $s -filepath $profile Mediante il comando seguente viene eseguito il profilo CurrentUserCurrentHost dal computer remoto nella sessione in $s. Poiché la variabile $profile non è compilata, il comando utilizza il percorso esplicito del profilo. invoke-command -session $s {. "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"} Dopo l'esecuzione di questo comando, i comandi aggiunti dal profilo alla sessione sono disponibili in $s. È inoltre possibile utilizzare uno script di avvio in una configurazione di sessione per eseguire un profilo in ogni sessione remota che utilizza la configurazione di sessione. Per ulteriori informazioni sui profili di Windows PowerShell, vedere about_Profiles. Per ulteriori informazioni sulle configurazioni di sessione, vedere Register-PSSessionConfiguration. COME FUNZIONA LA LIMITAZIONE NEI COMANDI REMOTI? Per agevolare la gestione delle risorse nel computer locale, Windows PowerShell include una funzionalità di limitazione per comando che consente di limitare il numero di connessioni remote simultanee stabilite per ogni comando. L'impostazione predefinita è di 32 connessioni simultanee, ma è possibile utilizzare i parametri ThrottleLimit dei cmdlet per impostare un limite personalizzato per determinati comandi. Nell'utilizzare la funzionalità di limitazione, è importante ricordare che si applica a ciascun comando, non all'intera sessione o al computer. Se si eseguono contemporaneamente comandi in diverse sessioni o PSSession, il numero di connessioni simultanee è la somma delle connessioni simultanee in tutte le sessioni. Per trovare i cmdlet con un parametro ThrottleLimit, digitare: get-help * -parameter ThrottleLimit SONO PRESENTI DIFFERENZE SPECIFICHE DEL SISTEMA NELLA COMUNICAZIONE REMOTA? Quando si eseguono comandi in più computer, considerare le differenze tra i computer remoti, ad esempio le differenze relative ai sistemi operativi, alla struttura del file system e al Registro di sistema. Quando si stabilisce la connessione a un computer remoto in cui viene eseguito Windows Vista o Windows Server 2003, il percorso di avvio predefinito è la home directory dell'utente corrente, archiviata nella variabile di ambiente %homepath% ($env:homepath) e nella variabile $home di Windows PowerShell. In Windows Vista, la home directory è in genere C:\Users\<NomeUtente>. In Windows Server 2003, la home directory è in genere C:\Documents and Settings\<NomeUtente>. Quando si stabilisce la connessione a un computer remoto in cui viene eseguito Windows XP, il percorso di avvio predefinito è la home directory dell'utente predefinito, archiviata nella variabile di ambiente %homepath% ($env:homepath) per l'utente predefinito. La home directory è in genere C:\Documents and Settings\Default User. L'OUTPUT DEI COMANDI REMOTI È DIVERSO DALL'OUTPUT LOCALE? Quando si utilizza Windows PowerShell in locale, vengono inviati e ricevuti oggetti .NET Framework "attivi", ovvero oggetti associati a programmi o componenti di sistema effettivi. Quando si richiamano metodi o si modificano proprietà di oggetti attivi, le modifiche influiscono sul programma o sul componente effettivo. Inoltre quando le proprietà di un programma o di un componente cambiano, vengono modificate anche le proprietà dell'oggetto che le rappresenta. Tuttavia, poiché non è possibile trasmettere in rete la maggior parte degli oggetti attivi, in Windows PowerShell la maggior parte degli oggetti inviati nei comandi remoti viene serializzata, ovvero ogni oggetto viene convertito in una serie di elementi dati XML (Constraint Language in XML [CLiXML]) per la trasmissione. Quando in Windows PowerShell viene ricevuto un oggetto serializzato, il linguaggio XML viene convertito in un tipo di oggetto deserializzato. L'oggetto deserializzato è un record accurato delle proprietà del programma o del componente in un determinato momento precedente, ma non è più "attivo", ovvero non è più associato direttamente al componente. Inoltre i metodi vengono rimossi perché non sono più validi. In genere, è possibile utilizzare gli oggetti deserializzati analogamente agli oggetti attivi, ma è necessario considerarne le 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 i GUID, vengono convertiti nuovamente in oggetti attivi quando vengono ricevuti. Per tali oggetti non è necessaria alcuna operazione speciale di gestione o formattazione. Per informazioni sull'interpretazione e sula 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 eseguito in modo asincrono senza interazioni con la sessione. Quando si avvia un processo in background, il prompt dei comandi viene immediatamente restituito ed è possibile continuare a lavorare nella sessione mentre il processo è in esecuzione anche se questa operazione richiede un periodo di tempo prolungato. È possibile avviare un processo in background anche mentre sono in esecuzione altri comandi poiché i processi in background sono sempre eseguiti in modo asincrono in una sessione temporanea. È possibile eseguire processi in background in un computer locale o remoto. Per impostazione predefinita, un processo in background viene eseguito nel computer locale. Tuttavia, è possibile utilizzare il parametro AsJob del cmdlet Invoke-Command per eseguire qualsiasi comando remoto come processo in background. È inoltre possibile utilizzare Invoke-Command per eseguire un comando Start-Job in modalità remota. Per ulteriori informazioni sui processi in background di Windows PowerShell, È POSSIBILE ESEGUIRE APPLICAZIONI WINDOWS IN UN COMPUTER REMOTO? È possibile utilizzare comandi remoti di Windows PowerShell per eseguire applicazioni basate su Windows nei computer remoti. Ad esempio, è possibile eseguire Shutdown.exe o Ipconfig in un computer remoto. Tuttavia, non è possibile utilizzare comandi di Windows PowerShell per aprire l'interfaccia utente di qualsiasi programma in un computer remoto. Quando si avvia un'applicazione Windows in un computer remoto, il comando non viene completato e il prompt dei comandi di Windows PowerShell non viene restituito finché il programma non viene terminato o non 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 finché IpConfig non viene completato. Se si utilizzano comandi remoti per avviare un programma con interfaccia utente, il processo viene avviato, ma l'interfaccia utente non viene visualizzata. Il comando di Windows PowerShell non viene completato e il prompt dei comandi non viene restituito finché il processo del programma non viene arrestato o non si preme CTRL+C per interrompere il comando e arrestare il processo. Ad esempio, se si utilizza un comando di Windows PowerShell per eseguire Blocco note in un computer remoto, il processo Notepad (Blocco note) viene avviato nel computer remoto, ma l'interfaccia utente del programma 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 IN UN COMPUTER? Sì. Per ogni sessione remota è necessario utilizzare una delle configurazioni di sessione nel computer remoto. È possibile gestire le configurazioni di sessione nel computer e le relative autorizzazioni per stabilire quali utenti possono eseguire comandi in modalità remota nel computer e quali comandi possono essere eseguiti. Una configurazione di sessione configura l'ambiente per la sessione. È possibile definire la configurazione tramite un assembly che implementa una nuova classe di configurazione o tramite uno script in esecuzione nella sessione. Mediante la configurazione è possibile determinare i comandi disponibili nella sessione. La configurazione può inoltre includere impostazioni per la protezione del computer, ad esempio impostazioni che limitano la quantità di dati che la sessione può ricevere in modalità remota in un solo oggetto o comando. È inoltre possibile specificare un descrittore di sicurezza che determina le autorizzazioni richieste per utilizzare la configurazione. Il cmdlet Enable-PSRemoting crea una configurazione di sessione predefinita nel computer, ovvero Microsoft.PowerShell (Microsoft.PowerShell32 in sistemi operativi a 64 bit). Enable-PSRemoting imposta il descrittore di sicurezza per la configurazione affinché solo ai membri del gruppo Administrators del computer sia consentito utilizzarli. È possibile utilizzare i cmdlet della configurazione di sessione per modificare le configurazioni di sessione predefinite, creare nuove configurazioni di sessione e modificare i descrittori di sicurezza di tutte le configurazioni di sessione. Quando gli utenti utilizzano i cmdlet Invoke-Command, New-PSSession o Enter-PSSession, possono utilizzare il parametro ConfigurationName per indicare la configurazione di sessione utilizzata per la sessione. Possono inoltre modificare la configurazione predefinita utilizzata dalle sessioni modificando il valore della variabile di preferenza $PSSessionConfigurationNam e nella sessione. Per ulteriori informazioni sulle configurazioni di sessione, vedere le sezioni relative ai cmdlet della configurazione di sessione nella Guida. Per trovare i cmdlet della configurazione di sessione, digitare: get-command *pssessionconfiguration CHE COSA SI INTENDE PER CONFIGURAZIONI FAN-IN E FAN-OUT? Lo scenario di comunicazione remota tra più computer più comune di Windows PowerShell è la configurazione uno-a-molti, in cui da un computer locale (computer dell'amministratore) vengono eseguiti comandi di Windows PowerShell in più computer remoti. Si tratta dello scenario "fan-out". Tuttavia, in alcune organizzazioni viene utilizzata la configurazione molti-a-uno, in cui molti computer client si connettono a un solo computer remoto che esegue Windows PowerShell, ad esempio un file server o un chiosco. Si tratta della configurazione "fan-in". La comunicazione remota di Windows PowerShell supporta le configurazioni fan-out e fan-in. Per la configurazione fan-out, in Windows PowerShell vengono utilizzati il protocollo WS-Management e il servizio Gestione remota Windows che supporta l'implementazione Microsoft di WS-Management. Quando un computer locale si connette a un computer remoto, tramite WS-Management viene stabilita una connessione e viene utilizzato un plug-in affinché il processo host (Wsmprovhost.exe) di Windows PowerShell venga avviato nel computer remoto. L'utente può specificare una porta alternativa, una configurazione di sessione alternativa e altre funzionalità per personalizzare la connessione remota. Per supportare la configurazione fan-in, in Windows PowerShell viene utilizzato Internet Information Services (IIS) per ospitare WS-Management, per caricare il plug-in di Windows PowerShell e avviare Windows PowerShell. Questo scenario non prevede l'avvio di ogni sessione di Windows PowerShell in un processo separato, ma l'esecuzione di tutte le sessioni di Windows PowerShell nello stesso processo host. L'hosting IIS e la gestione remota fan-in non sono supportati in Windows XP o in Windows Server 2003. In una configurazione fan-in, l'utente può specificare un URI di connessione e un endpoint HTTP, inclusi trasporto, nome del computer, porta e nome dell'applicazione. IIS inoltra tutte le richieste con un nome di applicazione specificato alla relativa applicazione. L'impostazione predefinita è WS-Management, che può ospitare Windows PowerShell. È inoltre possibile specificare un meccanismo di autenticazione e proibire o consentire il reindirizzamento da endpoint HTTP e HTTPS. È POSSIBILE ESEGUIRE UN TEST DELLA COMUNICAZIONE REMOTA IN UN SOLO COMPUTER, NON IN UN DOMINIO? Sì. La comunicazione remota di Windows PowerShell è disponibile anche quando il computer locale non appartiene a un dominio. È possibile utilizzare le funzionalità di comunicazione remota per connettersi alle sessioni e creare sessioni nello stesso computer. Le funzionalità hanno lo stesso comportamento di quando si stabilisce la connessione a un computer remoto. Per eseguire comandi remoti in un computer in un gruppo di lavoro, modificare le seguenti impostazioni di Windows nel computer. Attenzione: queste impostazioni vengono applicate a tutti gli utenti del sistema e possono rendere il sistema più vulnerabile ad attacchi di utenti malintenzionati. Prestare attenzione nell'apportare queste modifiche. -- Windows XP con SP2: Utilizzare Impostazioni protezione locale (Secpol.msc) per modificare l'impostazione del criterio "Accesso di rete: modello di condivisione e protezione per gli account locali" in Impostazioni protezione\Criteri locali\Opzioni di protezione su "Classico". -- Windows Vista: Creare la voce del Registro di sistema seguente, quindi impostarne il valore su 1: LocalAccountTokenFilterPolicy in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System È possibile utilizzare il comando di Windows PowerShell seguente per aggiungere questa voce: new-itemproperty ` -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System ` -name LocalAccountTokenFilterPolicy -propertyType DWord -value 1 -- Windows 2003: Non è necessario apportare alcuna modifica perché l'impostazione predefinita del criterio "Accesso alla rete: modello di condivisione e protezione per gli account locali" è "Classico". Verificare l'impostazione nel caso sia stata modificata. È POSSIBILE ESEGUIRE COMANDI REMOTI IN UN COMPUTER IN UN ALTRO DOMINIO? Sì. In genere, i comandi vengono eseguiti senza errori, benché possa essere necessario utilizzare il parametro Credential dei cmdlet Invoke-Command, New-PSSession o Enter-PSSession per fornire le credenziali di un membro del gruppo Administrators nel computer remoto. Questa operazione è talvolta necessaria anche quando l'utente corrente è membro del gruppo Administrators nel computer locale e in quello remoto. Se tuttavia il computer remoto non fa parte di un dominio considerato attendibile dal computer locale, il computer remoto potrebbe non essere in grado di autenticare le credenziali dell'utente. Per abilitare l'autenticazione, utilizzare il comando seguente per aggiungere il computer remoto all'elenco di host attendibili per il computer locale in Gestione remota Windows. Al prompt di Windows PowerShell digitare il comando. set-item WSMan:\localhost\Client\TrustedHosts -value <nome-computer-remoto> Ad esempio, per aggiungere il computer Server01 all'elenco di host attendibili nel computer locale, digitare il comando seguente al prompt di Windows PowerShell: set-item WSMan:\localhost\Client\TrustedHosts -value Server01 VEDERE ANCHE about_Remote about_Profiles about_PSSessions about_Remote_Jobs Invoke-Command New-PSSession