Geek School impara a utilizzare i servizi remoti in PowerShell
Una delle migliori caratteristiche offerte da PowerShell è la possibilità di gestire da remoto i server. Ti permette anche di gestirli un po 'contemporaneamente.
Assicurati di leggere gli articoli precedenti della serie:
- Scopri come automatizzare Windows con PowerShell
- Imparare a utilizzare i cmdlet in PowerShell
- Apprendimento Come utilizzare gli oggetti in PowerShell
- Imparare la formattazione, il filtraggio e il confronto in PowerShell
E rimanete sintonizzati per il resto della serie per tutta la settimana.
Cos'è il servizio remoto?
La gestione collettiva dei tuoi server può essere noiosa e, se prima hai dovuto apportare una modifica alla configurazione di IIS su 50 server web, saprai cosa intendo. Questi sono i tipi di situazioni in cui PowerShell Remoting e le abilità di scripting del linguaggio possono venire in soccorso. Utilizzando HTTP o HTTPS più sicuro, PowerShell Remoting consente di inviare comandi a una macchina remota sulla rete dell'utente. La macchina esegue quindi i comandi e restituisce l'output all'utente, che a sua volta viene visualizzato sullo schermo.
Facciamo ottenere tecnico
Alla base di PowerShell Remoting si trova un singolo servizio Windows, il servizio Gestione remota Windows o WinRM, come è diventato noto. Utilizzando WinRM, è possibile configurare una o più configurazioni di sessione (note anche come endpoint), che sono fondamentalmente file che contengono informazioni sull'esperienza che si desidera fornire alla persona che si connette all'istanza remota di PowerShell. In particolare, è possibile utilizzare i file di configurazione della sessione per definire chi può e chi non può connettersi all'istanza, quali cmdlet e script possono essere eseguiti, nonché il contesto di sicurezza in cui la sessione deve essere eseguita. Utilizzando il servizio WinRM, si impostano anche "ascoltatori", che ascoltano le richieste PowerShell in arrivo. Questi "listener" possono essere HTTP o HTTPS e possono essere associati a un singolo indirizzo IP sulla macchina. Quando si apre una connessione PowerShell con un'altra macchina (tecnicamente ciò avviene usando il protocollo WS-MAN, che è basato su HTTP), la connessione si lega a uno di questi "listener". Gli "ascoltatori" sono quindi incaricati di inviare il traffico all'applicazione associata al file di configurazione della sessione appropriato; l'applicazione (in genere PowerShell ma è possibile avere altre applicazioni di hosting, se lo si desidera), quindi esegue il comando e restituisce i risultati attraverso il "listener" attraverso la rete e di nuovo sulla macchina.
Mostrami come
La prima cosa che devi fare è abilitare i servizi remoti sulla macchina a cui desideri connetterti. Questo può essere fatto eseguendo quanto segue:
Enable-PSRemoting
Dovrai quindi rispondere di si a tutti i prompt. Quando esegui Enable-PSRemoting, alcune modifiche vengono apportate al tuo PC:
- Il servizio WinRM si avvia.
- Il servizio WinRM passa dalla modalità di avvio manuale a automatica.
- Crea un listener HTTP che è associato a tutte le tue schede di rete.
- Crea inoltre un'eccezione firewall in entrata per il protocollo WS-MAN.
- Alcune configurazioni di sessione predefinite vengono create
Se si utilizza Windows 7 e la posizione della scheda di rete è impostata su Pubblico, l'abilitazione di PowerShell Remoting avrà esito negativo. Per risolvere il problema, è sufficiente passare alla posizione di rete Casa o Lavoro. In alternativa, puoi saltare il controllo di rete usando quanto segue:
Abilita-PSRemoting -SkipNetworkProfileCheck
Tuttavia, ti consigliamo di cambiare la posizione della tua rete.
Esistono due modi per connettersi a un'altra macchina utilizzando PowerShell. C'è il metodo one-to-one, che è molto simile all'utilizzo di SSH, e poi c'è il metodo da uno a molti.
Utilizzo di una sessione di PowerShell
Il primo modo di connettersi a una macchina remota che utilizza PowerShell consiste nell'usare qualcosa chiamata PowerShell Session. In poche parole una sessione ti consente di eseguire comandi sulla macchina remota in modo interattivo, quasi come faresti sulla tua macchina. Per aprire una sessione è sufficiente digitare quanto segue:
Enter-PSSession -ComputerName "Darlah"
Il prompt otterrà un prefisso che indica il computer su cui si stanno eseguendo i cmdlet.
Da qui puoi veramente trattare il prompt come se fossi seduto al computer remoto. Ad esempio, se vuoi vedere tutti i file sull'unità C: \ puoi fare un semplice:
Get-ChildItem -Path C: \
Se provieni da uno sfondo Linux, puoi pensare di utilizzare questo metodo di remoting one to one come alternativa PowerShell a SSH.
Utilizzo di Invoke-Command
Il secondo modo in cui è possibile utilizzare PowerShell su una macchina remota è utilizzando Invoke-Command. Il vantaggio dell'utilizzo di Invoke-Command deriva dal fatto che è possibile eseguire lo stesso comando su più macchine contemporaneamente. Come puoi immaginare, questo è particolarmente utile quando vuoi fare qualcosa come raccogliere i log degli eventi dai tuoi server. Invoke-Command segue la seguente sintassi:
Invoke-Command -ComputerName Darlah, localhost -ScriptBlock Get-EventLog Application -Newest 2
Poiché il comando viene eseguito in parallelo su tutte le macchine, sarà necessario un modo per vedere da quale PC proviene un determinato risultato. Puoi farlo osservando la proprietà PSComputerName.
Quando usi Invoke-Command, non hai più gli oggetti che potresti aspettarti nella Pipeline. Vedete, per consentire a PowerShell di recuperare le informazioni dalla macchina remota sul vostro computer, hanno bisogno di un modo per rappresentare gli oggetti che il comando che avete eseguito sulle uscite della macchina remota. In questi giorni sembra che il modo scelto per rappresentare una struttura gerarchica dei dati sia l'uso di XML, il che significa che quando si impartisce un comando usando Invoke-Command, i risultati vengono prima serializzati in XML prima di essere rispediti al proprio computer. Una volta che tornano alla tua macchina, vengono nuovamente sottoposti a deserializzazione in un oggetto; il problema è che quando vengono deserializzati, tutti i metodi, ad eccezione del metodo ToString (), che l'oggetto è stato rimosso da esso.
Nota: ci sono alcune eccezioni a questa regola, ad esempio la maggior parte dei tipi primitivi come gli interi può essere deserializzata con i suoi metodi inclusi. C'è anche un processo chiamato Reidratazione dove alcuni metodi possono essere aggiunti agli oggetti deserializzati. Quindi, fai attenzione e ricorda che Get-Member è tuo amico.
Compiti a casa
- Leggi i segreti di PowerShell Remoting ebook di Don Jones.