6Sep

Geek School: Lär dig använda Remoting i PowerShell

En av de bästa funktionerna PowerShell erbjuder möjligheten att fjärrhantera dina servrar. Det låter dig även hantera en massa av dem samtidigt.

Var noga med att läsa de tidigare artiklarna i serien:

  • Lär dig att automatisera Windows med PowerShell
  • Lär dig använda Cmdlets i PowerShell
  • Lär dig hur du använder objekt i PowerShell
  • Lär dig formatering, filtrering och jämförelse i PowerShell

och håll dig uppdateradresten av serien hela veckan.

Vad är Remoting?

Bulkhantering av dina servrar kan vara tråkig, och om du måste göra en IIS-konfigurationsbyte på 50 webbservrar innan, vet du vad jag menar. Det här är de typer av situationer när PowerShell Remoting och språkets skriptsförmåga kan komma till räddning. Med hjälp av HTTP eller säkrare HTTPS kan PowerShell Remoting du skicka kommandon till en fjärrmaskin i ditt nätverk. Maskinen kör sedan kommandon och skickar utmatningen tillbaka till dig, som i sin tur visas på skärmen.

Låt oss få teknisk

Kärnan i PowerShell Remoting ligger en enda Windows-tjänst, Windows Remote Management eller WinRM-tjänsten, som det har blivit känt. Med WinRM kan du konfigurera en eller flera sessionskonfigurationer( även kända som slutpunkter), som i grunden är filer som innehåller information om den erfarenhet du vill ge till den person som ansluter till din externa PowerShell-instans. Mer specifikt kan du använda sessionskonfigurationsfiler för att definiera vem som kan och vem inte kan ansluta till exemplet, vilka cmdlets och skript som de kan köra, samt vilken säkerhetskontext sessionen måste köras under. Med WinRM-tjänsten skapar du också "lyssnare", som lyssnar på inkommande PowerShell-förfrågningar. Dessa "lyssnare" kan antingen vara HTTP eller HTTPS och kan vara bundna till en enda IP-adress på din maskin. När du öppnar en PowerShell-anslutning till en annan maskin( tekniskt görs det med WS-MAN-protokollet, som är baserat på HTTP), binder anslutningen till en av dessa "lyssnare"."Lyttarna" har sedan ansvaret för att skicka trafiken till den ansökan som är associerad med den lämpliga sessionskonfigurationsfilen.programmet( normalt PowerShell men du kan ha andra webbhotell om du vill) kör sedan kommandot och matar resultaten tillbaka genom "lyssnaren" över nätverket och tillbaka till din maskin.

Visa mig Hur

Det första du behöver göra är att aktivera Remoting på den maskin du vill ansluta till. Detta kan göras genom att köra följande:

Aktivera-PSRemoting

Du måste då svara ja på alla instruktioner. När du kör Enable-PSRemoting görs några ändringar på din dator:

  • WinRM-tjänsten startas.
  • WinRM-tjänsten ändras från manuell startläge till automatisk.
  • Det skapar en HTTP-lyssnare som är bunden till alla dina nätverkskort.
  • Det skapar också ett inkommande brandväggs undantag för WS-MAN-protokollet.
  • Vissa standard sessionskonfigurationer skapas

Om du kör Windows 7 och ditt nätverkskorts läge är inställt på Offentlig, kan PowerShell Remoting misslyckas. För att fixa det, växla du bara till hem- eller arbetsnätverksplatsen. Alternativt kan du hoppa över nätverkskontrollen med följande:

Aktivera-PSRemoting -SkipNetworkProfileCheck

Vi rekommenderar dock att du ändrar din nätverksplats.

Det finns två sätt att ansluta till en annan maskin med PowerShell. Det finns en till en metod, som mycket liknar att använda SSH, och då finns det en till många metoder.

Använda en PowerShell-session

Den första sättet att ansluta till en fjärrmaskin med PowerShell använder något som kallas en PowerShell-session. Enkelt sätta en session gör att du kan köra kommandon på fjärrmaskinen på ett interaktivt sätt, ungefär samma som du skulle på din egen maskin. För att öppna en session skriver du bara följande:

Enter-PSSession -ComputerName "Darlah"

Prompten kommer att få ett prefix som betyder att du kör cmdlets mot.

Härifrån kan du verkligen behandla prompten som om du satt på fjärrmaskinen. Om du till exempel vill se alla filerna på C: \ -drevet kan du göra ett enkelt:

Get-ChildItem -Path C: \

Om du kommer från en Linux-bakgrund kan du tänka på att använda den här en till en metod för avlägsnande som PowerShell-alternativet till SSH.

Använda Invoke-Command

Det andra sättet att använda PowerShell på en fjärrmaskin är att använda Invoke-Command. Fördelen att använda Invoke-Command kommer från det faktum att du kan utföra samma kommando på flera maskiner samtidigt. Som du kan tänka dig är det här särskilt användbart när du vill göra något som att samla händelsesloggar från dina servrar. Invoke-Command följer följande syntax:

Invoke-Command -ComputerName Darlah, localhost -ScriptBlock{ Get-EventLog Application -Newest 2}

Eftersom kommandot körs parallellt på alla maskiner behöver du något sätt för att se vilken PCgivet resultat kom från. Du kan göra detta genom att titta på egenskapen PSComputerName.

När du använder Invoke-Command har du inte längre de objekt som du kan förvänta dig i pipelinen. Du ser, för att PowerShell ska få informationen från fjärrmaskinen tillbaka till din maskin, behöver de något sätt att representera objekten som kommandot du körde på fjärrutmatningarna. Dessa dagar verkar det valda sättet att representera en hierarkisk datastruktur är att använda XML, vilket innebär att när du utfärdar ett kommando med Invoke-Command, blir resultaten först serialiserade i XML innan de skickas tillbaka till din maskin. När de kommer tillbaka till din maskin, deserialiseras de tillbaka till ett föremål. Gotcha här är det när de är deserialiserade, alla metoder, med undantag av ToString() -metoden, som föremålet hade, avlägsnades från det.

Obs! Det finns några undantag från denna regel, till exempel kan de flesta primitiva typer som heltal deserialiseras med dess metoder. Det finns också en process som heter Rehydration, där vissa metoder kan läggas till deserialiserade objekt. Så var försiktig och kom ihåg att Get-Member är din vän.

Hemläxa

  • Läs Secrets of PowerShell Remoting ebook av Don Jones.