Windows PowerShell 2.0 ha introdotto una nuova potente tecnologia, il Remoting, che è stato perfezionato e ampliato per PowerShell 3.0. Basato principalmente su protocolli e tecniche standardizzate, il remoting è forse uno degli aspetti più importanti di PowerShell: i futuri prodotti Microsoft si baseranno su di esso quasi interamente per le comunicazioni amministrative attraverso una rete.,
Purtroppo, Remoting è anche un insieme complesso di componenti, e mentre Microsoft ha tentato di fornire una guida solida per l’utilizzo in una varietà di scenari, molti amministratori ancora lotta con esso. Questo “mini e-book” è progettato per aiutarti a capire meglio cos’è il Remoting, come funziona e, soprattutto, come usarlo in una varietà di situazioni diverse.
Nota Questa guida non è destinata a sostituire la miriade di libri esistenti che coprono le nozioni di base di Remoting, come il proprio di Don Impara Windows PowerShell in un mese di pranzi (http://MoreLunches.com) o PowerShell in profondità., Invece, questa guida integra quelli fornendo istruzioni passo-passo per molti dei casi “edge” nel Remoting e spiegando alcuni dei comportamenti e dei requisiti di Remoting più insoliti.
In sostanza, il Remoting consente di accedere a macchine remote attraverso una rete e recuperare dati da o eseguire codice su uno o più computer remoti. Questa non è un’idea nuova e in passato si sono evolute diverse tecnologie di remoting. Alcuni cmdlet hanno tradizionalmente fornito le proprie limitate capacità di remoting, mentre la maggior parte dei cmdlet non supporta il remoting da soli.,
Con PowerShell remoting c’è finalmente un ambiente di remoting generico che consente l’esecuzione remota per letteralmente qualsiasi comando che può essere eseguito in un PowerShell locale. Quindi, invece di aggiungere funzionalità di remoting a ogni singolo cmdlet e applicazione, è sufficiente lasciarlo a PowerShell per trasferire il codice PowerShell ai computer di destinazione, eseguirlo lì e quindi restituire i risultati a te.
In tutto questo eBook, ci concentreremo su PowerShell remoting e non coprire le funzionalità di remoting privato non standard integrate in cmdlet selezionati.,
Esaminando l’architettura remota
Come mostrato nella figura 1.1, l’architettura remota generica di PowerShell è costituita da numerosi componenti ed elementi diversi e correlati.
Figura 1.1: Gli elementi e i componenti di PowerShell Remoting
Ecco l’elenco completo:
■ Nella parte inferiore della figura è il computer, o più correttamente il client., Questo è dove ti siedi fisicamente, ed è dove inizierai la maggior parte delle tue attività di Remoting.
■ Il computer comunica tramite il protocollo WS-MAN, o Web Services for Management. Questo è un protocollo basato su HTTP (S) che può incapsulare una varietà di comunicazioni diverse. Abbiamo illustrato questo come usando HTTP, che è la configurazione predefinita di Remoting, ma potrebbe essere altrettanto facilmente HTTPS.
■ Sul computer remoto, nella terminologia corretta del server (che non si riferisce al sistema operativo), viene eseguito il servizio Windows Remote Management (WinRM)., Questo servizio è configurato per avere uno o più listener. Ogni listener attende il traffico WS-MAN in entrata su una porta specifica, ciascuno associato a un protocollo specifico (HTTP o HTTPS) e su indirizzi IP specifici (o tutti gli indirizzi locali).
■ Quando un listener riceve traffico, il servizio WinRM cerca di vedere a quale endpoint è destinato il traffico. Per i nostri scopi, un endpoint di solito avvia un’istanza di Windows PowerShell. In termini di PowerShell, un endpoint viene anche chiamato configurazione di sessione., Questo perché, oltre a lanciare PowerShell, può caricare automaticamente script e moduli, porre restrizioni su ciò che può essere fatto dall’utente che si connette e applicare impostazioni specifiche della sessione aggiuntive non menzionate qui.
Nota Anche se mostriamo PowerShell.exe nel nostro diagramma, che è a scopo illustrativo. PowerShell.exe è l’applicazione PowerShell console, e non avrebbe senso avere questo in esecuzione come un processo in background su un computer remoto. Il processo effettivo è chiamato Wsmprovhost.exe, che ospita PowerShell in background per le connessioni remote.,
Come puoi vedere, un singolo computer remoto può facilmente avere decine o addirittura centinaia di endpoint, ognuno con una configurazione diversa. PowerShell 3.0 imposta tre di questi endpoint per impostazione predefinita: uno per PowerShell a 32 bit (su sistemi a 64 bit), l’endpoint PowerShell predefinito (che è a 64 bit su sistemi x64) e uno per il flusso di lavoro PowerShell. A partire da Windows Server 2008 R2, esiste un quarto endpoint predefinito per le attività del flusso di lavoro di Server Manager.,
Abilitazione del Remoting
La maggior parte delle versioni client di Windows, a partire da Windows Vista, non abilita le connessioni Remoting in entrata per impostazione predefinita. Le versioni più recenti di Windows Server lo fanno, ma le versioni precedenti potrebbero non esserlo. Quindi il tuo primo passo con il Remoting sarà di solito abilitarlo su quei computer che desideri ricevere connessioni in entrata. Esistono tre modi per abilitare il remoting e la tabella 1.1 confronta ciò che è realizzabile con ciascuno di essi.
Tabella 1.,1 Comparing the ways of enabling remoting
Enable-PSRemoting |
Group Policy |
Manually Step-by-Step |
|||
Set WinRM to auto-start and start the service |
Yes |
Yes |
Yes – use Set-Service and Start-Service., |
No |
Yes – use PSSessionConfiguration cmdlets |
Configure Windows Firewall exception |
Yes* |
Yes* |
Yes* – use Firewall cmdlets or Windows Firewall GUI |
Note Existing client versions of Windows, such as Windows Vista, do not permit firewall exceptions on any network identified as “Public”., Le reti devono essere “Home” o “Work / Domain” per consentire eccezioni. In PowerShell 3.0, è possibile eseguire Enable-PSRemoting con l’opzione-SkipNetworkProfileCheck per evitare questo problema.
Abiliteremo il Remoting nel nostro ambiente di test eseguendo Enable-PSRemoting. È veloce, facile e completo; vedrai anche la maggior parte delle attività manuali eseguite nelle prossime sezioni.
Ambiente di test
Useremo un ambiente di test coerente in tutte le sezioni seguenti; questo è stato creato su sei macchine virtuali su CloudShare.,com, ed è configurato come mostrato in figura 1.2.
Figura 1.2: Configurazione dell’ambiente di test
Alcune note importanti:
■. NET Framework v4 e PowerShell 3.0 sono installati su tutti i computer. La maggior parte di ciò che tratteremo si applica anche a PowerShell 2.0.,
■ Come mostrato, la maggior parte dei computer ha un nome numerico (C2108222963 e così via); il controller di dominio per ogni dominio (che è anche un server DNS) ha record CNAME con nomi più facili da ricordare.
■ Ogni controller di dominio dispone di uno spedizioniere condizionale impostato per l’altro dominio, in modo che le macchine in entrambi i domini possano risolvere i nomi dei computer nell’altro dominio.
■ Abbiamo eseguito tutte le attività come membro del gruppo Domain Admins, se non diversamente specificato.
■ Abbiamo creato un sesto server completamente autonomo che non è in alcun dominio., Questo sarà utile per coprire alcune delle situazioni non di dominio in cui puoi trovarti con il Remoting.
Attenzione Quando si apre PowerShell su un computer con Controllo account utente (UAC) abilitato, fare clic con il pulsante destro del mouse sull’icona PowerShell e selezionare Esegui come amministratore. Se la barra del titolo della finestra di PowerShell risultante non inizia con Administrator: non si dispone dei privilegi amministrativi. Puoi controllare le autorizzazioni a livello di codice con questo (whoami | all / select-string S-1-16-12288) – ne null null dalla console PowerShell., In una shell elevata viene restituito True, altrimenti False.
Abilitazione del Remoting
Abbiamo iniziato eseguendo Enable-PSRemoting su tutti e sei i computer. Ci siamo presi cura di garantire che il comando eseguito senza errori; eventuali errori a questo punto sono un segnale che è necessario interrompere e risolvere l’errore prima di tentare di procedere. La figura 1.3 mostra l’output previsto.
Si noti che Invoke-Command, per impostazione predefinita, comunica con solo 32 computer contemporaneamente. Se si specifica di più, gli extra si accoderanno e Invoke-Command inizierà a elaborarli al termine dei primi 32., Il parametro-ThrottleLimit può aumentare questo limite; l’unico costo è per il computer, che deve disporre di risorse sufficienti per mantenere una sessione PowerShell unica per ogni computer che si sta contattando contemporaneamente. Se si prevede di ricevere grandi quantità di dati dai computer remoti, la larghezza di banda di rete disponibile può essere un altro fattore limitante.,
Sessioni
Quando esegui Enter-PSSession o Invoke-Command e usi il loro parametro-ComputerName, il Remoting crea una connessione (o sessione), fa tutto ciò che gli hai chiesto e quindi chiude la connessione (nel caso di una sessione interattiva creata con Enter-PSSession, PowerShell sa che hai finito quando esegui Exit-PSSession). C’è un po ‘ di overhead coinvolto in quel set-up e tear-down, e così PowerShell offre anche la possibilità di creare una connessione persistente – chiamata PSSession. Si esegue New-PSSession per creare una nuova sessione persistente., Quindi, anziché utilizzare-ComputerName con Enter-PSSession o Invoke-Command, si utilizza il loro parametro-Session e si passa un oggetto PSSession esistente e aperto. Ciò consente ai comandi di riutilizzare la connessione persistente creata in precedenza.
Quando si utilizza il parametro-ComputerName e si lavora con sessioni ad hoc, ogni volta che si invia un comando a una macchina remota, si verifica un ritardo significativo causato dal sovraccarico necessario per creare una nuova sessione. Poiché ogni chiamata a Enter-PSSession o Invoke-Command imposta una nuova sessione, non è possibile preservare lo stato., Nell’esempio seguente, la variabile test test viene persa nella seconda chiamata:
Quando si utilizzano sessioni persistenti, d’altra parte, le ri-connessioni sono molto più veloci e, poiché si mantengono e si riutilizzano le sessioni, preserveranno lo stato., Quindi qui, la seconda chiamata a Invoke-Command sarà ancora in grado di accedere alla variabile test test che è stata impostata nella prima chiamata
Esistono vari altri comandi per controllare lo stato della sessione e recuperare le sessioni (Get-PSSession), chiuderle (Remove-PSSession), disconnetterle e ricollegarle (Disconnect-PSSession e Reconnect-PSSession, che sono nuove in PowerShell v3), e così via., In PowerShell v3, è anche possibile passare una sessione aperta a Get-Module e Import-Module, consentendo di visualizzare i moduli elencati su un computer remoto (tramite PSSession aperto) o di importare un modulo da un computer remoto nel computer per il Remoting implicito. Rivedere la guida su tali comandi per saperne di più.
Nota: Una volta che usi New-PSSession e crei le tue sessioni persistenti, è tua responsabilità fare le pulizie e chiudere e smaltire la sessione quando hai finito con loro., Finché non lo fai, le sessioni persistenti rimangono attive, consumano risorse e possono impedire ad altri di connettersi. Per impostazione predefinita, sono consentite solo 10 connessioni simultanee a una macchina remota. Se mantieni troppe sessioni attive, ti imbatterai facilmente in limiti di risorse. Questa riga mostra cosa succede se si tenta di impostare troppe sessioni simultanee:
PS> 1..10 | Foreach-Object { New-PSSession -ComputerName CLIENT1 }
Remoting Restituisce dati deserializzati
I risultati ricevuti da un computer remoto sono stati serializzati in XML e quindi deserializzati sul computer., In sostanza, gli oggetti inseriti nella pipeline della shell sono istantanee statiche e distaccate di ciò che si trovava sul computer remoto al momento del completamento del comando. Questi oggetti deserializzati non hanno i metodi degli oggetti originali e offrono solo proprietà statiche.
Se hai bisogno di accedere ai metodi o modificare le proprietà, o in altre parole se devi lavorare con gli oggetti live, assicurati semplicemente di farlo sul lato remoto, prima che gli oggetti vengano serializzati e ritornino al chiamante., Questo esempio utilizza i metodi object sul lato remoto per determinare i proprietari dei processi che funzionano bene:
Una volta che i risultati tornano a te, non puoi più richiamare i metodi object perché ora lavori con oggetti “reidratati” che sono staccati dagli oggetti live e non contengono più alcun metodo:
La serializzazione e la deserializzazione sono relativamente costose. È possibile ottimizzare la velocità e le risorse assicurandosi che il codice remoto emetta solo i dati di cui si ha realmente bisogno., Ad esempio, è possibile utilizzare Select-Object e selezionare attentamente le proprietà che si desidera ripristinare piuttosto che serializzare e deserializzare tutto.
Enter-PSSession vs. Invoke-Command
Molti nuovi arrivati si confonderanno un po ‘ sul remoting, in parte a causa di come PowerShell esegue gli script. Si consideri quanto segue e si supponga che SERVER2 contenga uno script denominato C:\RemoteTest.,ps1:
Enter-PSSession -ComputerName SERVER2C:\RemoteTest.ps1
Se dovessi sederti e digitare questi comandi in modo interattivo nella finestra della console sul tuo computer client, questo funzionerebbe (supponendo che il remoting sia stato impostato, tu avessi i permessi e tutto il resto). Tuttavia, se li hai incollati in uno script e li hai eseguiti, non funzionerebbe. Lo script avrebbe cercato di eseguire C:\RemoteTest.ps1 sul tuo computer locale.
Il risultato pratico di questo è che Enter-PSSession è davvero pensato per l’uso interattivo da parte di un essere umano, non per l’uso in batch da parte di uno script., Se si desidera inviare un comando a un computer remoto, all’interno di uno script, Invoke-Command è il modo giusto per farlo. È possibile impostare una sessione in anticipo (utile se si prevede di inviare più di un comando), oppure è possibile utilizzare un nome del computer se si desidera inviare un solo comando. Ad esempio:
$session = New-PSSession -ComputerName SERVER2Invoke-Command -session $session -ScriptBlock { C:\RemoteTest.ps1 }
Ovviamente, è necessario usare un po ‘ di cautela. Se queste fossero le uniche due righe nello script, quando lo script ha terminato l’esecuzione, session session cesserebbe di esistere., Ciò potrebbe disconnetterti (in un certo senso) dalla sessione in esecuzione su SERVER2. Quello che fai, e anche se è necessario preoccuparsi, dipende molto da quello che stai facendo e come lo stai facendo. In questo esempio, probabilmente tutto andrebbe bene, perché Invoke-Command “manterrebbe” lo script locale in esecuzione fino a quando lo script remoto non terminerà e restituirà il suo output (se presente).