Remoting Basics

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.

image003.png

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.

image004.png

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.

image005.png

Figura 1.,3: Output previsto da Enable-PSRemoting

Nota: Noterai l’uso dissoluto delle schermate in questa guida. Aiuta a garantire che non faccio errori di battitura o copia/incolla errori-stai vedendo esattamente ciò che abbiamo digitato ed eseguito.

L’esecuzione di Get-PSSessionConfiguration dovrebbe rivelare i tre o quattro endpoint creati da Enable-PSRemoting. Figura 1.4 mostra l’output previsto su un server.

image006.png

Figura 1.,4: Output previsto da Get-PSSessionConfiguration

Nota: La figura 1.4 illustra che è possibile prevedere la configurazione di endpoint diversi su macchine diverse. Questo esempio proviene da un computer Windows Server 2008 R2, che ha meno endpoint rispetto a un computer Windows 2012.

Vale la pena prendere un momento per testare rapidamente la configurazione remota. Per i computer che fanno tutti parte dello stesso dominio, quando sei connesso come amministratore di dominio da quel dominio, il remoting dovrebbe “funzionare.”Controllare rapidamente tentando di remoto da un computer a un altro utilizzando Enter-PSSession.,

Nota: in altri ambienti, un account amministratore di dominio potrebbe non essere l’unico account che può utilizzare il remoting. Se l’ambiente di casa o di lavoro dispone di account aggiuntivi nel gruppo Amministratori locali come standard in tutto il dominio, sarà anche possibile utilizzare questi account per il remoting.

Figura 1.5 mostra l’output previsto, in cui abbiamo anche eseguito un comando Dir rapido e poi uscito dalla sessione remota.

image007.,png

Figura 1.5: Controllo della connettività remota dall’AZIENDA.loc’s CLIENTA al controller di dominio DCA.

Attenzione: se stai seguendo nel tuo ambiente di test, non procedere fino a quando non hai confermato la connettività remota tra due computer nello stesso dominio. Nessun altro scenario ha bisogno di lavorare in questo momento; ci arriveremo a loro nelle prossime sezioni.

Attività principali di remoting

PowerShell fornisce due principali casi d’uso di Remoting., Il primo, 1-to-1 Remoting, è simile in natura alla SSH secure shell offerto su sistemi UNIX e Linux. Con esso, si ottiene un prompt della riga di comando su un singolo computer remoto. Il secondo, 1-to-Many Remoting, consente di inviare un comando (o un elenco di comandi) in parallelo a un set di computer remoti. Ci sono anche un paio di tecniche secondarie utili che vedremo.

Remoting da 1 a 1

Il comando Enter-PSSession si connette a un computer remoto e fornisce un prompt della riga di comando su quel computer., È possibile eseguire qualsiasi comando su quel computer, a condizione di avere il permesso di eseguire tale attività. Si noti che non si sta creando una sessione di accesso interattiva; la connessione verrà verificata come accesso di rete, proprio come se ci si connettesse alla condivisione amministrativa C administrative del computer. PowerShell non caricherà o elaborerà gli script del profilo sul computer remoto. Qualsiasi script che si sceglie di eseguire (e questo include l’importazione di moduli di script) funzionerà solo se la politica di esecuzione della macchina remota lo consente.,

Enter-PSSession -computerName DC01

Nota: durante la connessione a una macchina remota tramite Enter-PSSession, il prompt cambia e visualizza il nome del sistema remoto tra parentesi quadre. Se hai personalizzato il prompt, tutte le personalizzazioni andranno perse perché il prompt viene ora creato sul sistema remoto e trasferito di nuovo all’utente. Tutti gli input da tastiera interattivi vengono inviati al computer remoto e tutti i risultati vengono inviati all’utente. Questo è importante da notare perché non è possibile utilizzare Enter-PSSession in uno script., Se lo facessi, lo script verrebbe comunque eseguito sul tuo computer locale poiché nessun codice è stato inserito in modo interattivo.

1-to-Many Remoting

Con questa tecnica, si specificano uno o più nomi di computer e un comando (o un elenco di comandi separati da punto e virgola); PowerShell invia i comandi, tramite Remoting, ai computer specificati. Questi computer eseguono i comandi, serializzano i risultati in XML e trasmettono i risultati all’utente. Il computer deserializza l’XML in oggetti e li inserisce nella pipeline della sessione PowerShell., Ciò avviene tramite il cmdlet Invoke-Command.

Invoke-Command -computername DC01,CLIENT1 -scriptBlock { Get-Service }

Se si dispone di uno script di comandi da eseguire, è possibile far leggere Invoke-Command, trasmettere il contenuto ai computer remoti e farli eseguire quei comandi.

Invoke-Command -computername DC01,CLIENT1 -filePath c:\Scripts\Task.ps1

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 SERVER2
C:\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 SERVER2
Invoke-Command -session $session -ScriptBlock { C:\RemoteTest.ps1 }