6Sep

Geek School: imparare 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 ad usare i cmdlet in PowerShell
  • Imparare come utilizzare gli oggetti in PowerShell
  • Imparare la formattazione, il filtraggio e il confronto in PowerShell

E rimanere sintonizzati perresto della serie per tutta la settimana.

Cos'è il servizio remoto?

La gestione in blocco dei tuoi server può essere noiosa e, se 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.

Ottieni

tecnico Al centro 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 sul computer.

Mostrami come

La prima cosa che devi fare è abilitare il Remoting sulla Macchina a cui vuoi connetterti. Questo può essere fatto eseguendo quanto segue:

Enable-PSRemoting

Dovrai quindi rispondere yes a tutti i prompt. Quando si esegue Enable-PSRemoting, vengono apportate alcune modifiche al PC:

  • Il servizio WinRM si avvia.
  • Il servizio WinRM passa dalla modalità di avvio manuale a automatica.
  • Crea un listener HTTP associato a tutte le schede di rete.
  • Crea anche 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 risolverlo, passa semplicemente al percorso di rete Casa o Lavoro. In alternativa, è possibile saltare il controllo di rete utilizzando quanto segue:

Abilita-PSRemoting -SkipNetworkProfileCheck

Tuttavia, si consiglia di modificare piuttosto la posizione di rete.

Esistono due modi per connettersi a un'altra macchina mediante PowerShell. C'è il metodo one-to-one, che è molto simile all'uso di SSH, e poi c'è il metodo da uno a molti.

Utilizzo di una sessione PowerShell

Il primo modo per connettersi a una macchina remota che utilizza PowerShell consiste nell'utilizzare qualcosa chiamata sessione PowerShell. 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 davvero trattare il prompt come se fossi seduto al computer remoto. Ad esempio, se si desidera visualizzare tutti i file nell'unità C: \, è possibile eseguire una semplice operazione:

Get-ChildItem -Path C: \

Se provieni da uno sfondo Linux, puoi pensare di utilizzare questo metodo di remoting one to one come alternativa a PowerShell per SSH.

Utilizzo di Invoke-Command

Il secondo modo per 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 quale PCdato risultato venuto da. 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: esistono 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.

Homework

  • Leggi i segreti di PowerShell Remoting ebook di Don Jones.