Brug en til mange-fjernstyring ved hjælp af Windows PowerShell
en til mange- kan du sende en enkelt kommando til flere computere parallelt. Hver computer kører den kommando, du sender, serialiserer resultaterne til XML og sender disse resultater tilbage til computeren. Computeren deserialiserer derefter XML til objekter og placerer dem i Windows PowerShell-pipelinen. Når du gør dette, føjes der flere egenskaber til hvert objekt, herunder en PSComputerName egenskab, der angiver, hvilken computer hvert resultat kom fra. Denne egenskab giver dig mulighed for at sortere, gruppere og filtrere baseret på computernavn.
Du kan bruge en til mange-remoting ved hjælp af to forskellige teknikker:
- Invoke-Command –ComputerName name1,name2 –ScriptBlock { command }. Denne teknik sender kommandoen (eller kommandoerne) i scriptblokken til de computere, du angiver. Denne teknik er nyttig til afsendelse af en eller to kommandoer. flere kommandoer adskilles af et semikolon.
- Invoke-Command –Computernavn navn1,navn2 –FilePath filsti. Denne teknik sender indholdet af en scriptfil med et .ps1 filtypenavn til de computere, du angiver. Den lokale computer åbner filen og læser dens indhold. Fjerncomputerne behøver dog ikke at have direkte adgang til filen. Denne teknik er nyttig til afsendelse af en stor fil med kommandoer, f.eks. et komplet script.
Seddel
I en hvilken som helst scriptblok (herunder den scriptblok, der er angivet til parameteren –ScriptBlock), kan du bruge et semikolon til at adskille flere kommandoer.
{ Get-Service ; Get-Process } kører f.eks. Get-Service-og kører derefter Get-Process.
Kvæle
PowerShell indeholder en begrænsningsfunktion pr. kommando for at hjælpe dig med at administrere ressourcerne på din lokale computer, så du kan begrænse antallet af samtidige fjernforbindelser, der er oprettet for hver kommando. Windows PowerShell opretter som standard kun forbindelse til 32 computere på én gang. Hvis du angiver mere end 32 computere, sættes forbindelserne til de andre computere i kø. Når sessionerne til nogle af computerne fra den første batch er fuldført og returnerer deres resultater, startes der forbindelser til computerne i det næste batch.
Du kan ændre denne funktionsmåde ved hjælp af parameteren –ThrottleLimit for Invoke-Command. Hvis du hæver tallet, belastes fjerncomputerne ikke yderligere. Det belaster dog computeren, hvor Invoke-Command- blev aktiveret. Det bruger også mere båndbredde. Hver samtidige forbindelse er grundlæggende en tråd i Windows PowerShell. Derfor bruger forøgelsen af antallet af computere hukommelse og processorhastighed på den lokale computer.
Overførsel af værdier
Scriptblokken eller filindholdet sendes som konstanttekst til de fjerncomputere, der kører dem, præcis som de er. Computeren fortolker ikke den scriptblok eller -fil, som Invoke-Command- blev kørt på. Se følgende kommandoeksempel:
$var = 'BITS'
Invoke-Command –ScriptBlock { Get-Service –Name $var } –Computer LON-DC1
I dette scenarie angives variablen $var på den lokale computer i stedet for at blive inkluderet i scriptblokken, der skal køres på LON-DC1. Med andre ord er $var ikke defineret eller angivet i PowerShell-remotingsessionen til LON-DC1, hvilket er en almindelig fejl, som administratorer, der er nye i Windows PowerShell, ofte begår.
Kørsel af kommandoer lokalt og eksternt
Vær opmærksom på de kommandoer, du omslutter i scriptblokken, som overføres til fjerncomputeren. Husk, at din lokale computer ikke behandler noget scriptblokindhold, men blot sender det til fjerncomputeren. Overvej f.eks. følgende kommando:
Invoke-Command –ScriptBlock { Do-Something –Credential (Get-Credential) } -ComputerName LON-DC1
Denne kommando kører cmdlet'en Get-Credential på fjerncomputeren. Hvis du forsøger at køre Get-Credential på en lokal computer, bruges der en grafisk dialogboks til at bede om legitimationsoplysningerne.
spørgsmål: Fungerer kommandoen, når den køres på en fjerncomputer? Hvis du f.eks. kørte den foregående kommando på 100 fjerncomputere, bliver du så bedt om at angive 100 legitimationsoplysninger?
Overvej nu denne ændrede version af kommandoen:
Invoke-Command –ScriptBlock { Param($c) Do-Something –Credential $c }
-ComputerName LON-DC1
-ArgumentList (Get-Credential)
Denne kommando kører Get-Credential på den lokale computer og kører den kun én gang. Det resulterende objekt overføres til parameteren $c for scriptblokken, så hver computer kan bruge de samme legitimationsoplysninger.
Disse eksempler illustrerer vigtigheden af at skrive remoting-kommandoer omhyggeligt. Ved at bruge en kombination af at køre kommandoer eksternt og lokalt kan du nå forskellige nyttige mål.
Persistens
Ved hjælp af de teknikker, der er beskrevet her, opretter fjerncomputeren en ny wsmprovhost proces, hver gang du bruger Invoke-Command, og kører kommandoen eller kommandoerne. Derefter returneres resultaterne, og den pågældende Windows PowerShell-forekomst lukkes. Hver efterfølgende Invoke-Command-, selvom den er oprettet på den samme computer, svarer til at åbne et nyt Windows PowerShell-vindue. Arbejde udført af en tidligere session findes ikke, medmindre du gemmer det på en disk eller et andet vedvarende lager. Overvej f.eks. følgende kommando:
Invoke-Command –ComputerName LON-DC1 –ScriptBlock { $x = 'BITS' }
Invoke-Command –ComputerName LON-DC1 –ScriptBlock { Get-Service –Name $x }
I dette eksempel mislykkes Get-Service-, fordi den er afhængig af værdien af en variabel, der er oprettet som en del af den forrige wsmprovhost-proces. Når det første script, der aktiveres af Invoke-Command fuldføres, ryddes variablerne fra hukommelsen. Du kan løse dette problem ved at oprette en wsmprovhost-proces på en fjerncomputer, så du kan sende efterfølgende kommandoer til den.
Flere computernavne
Parameteren –ComputerName for Invoke-Command- kan acceptere alle samlinger af strengobjekter som computernavne. På følgende liste beskrives forskellige teknikker, der kan bruges til at oprette sådanne samlinger:
- -Computernavn EN, TO, TRE. En statisk kommasepareret liste over computernavne.
- -Computernavn (Get-Content Names.txt). Læser navne fra en tekstfil med navnet Names.txt, hvis filen indeholder ét computernavn pr. linje.
- -ComputerName (Import-Csv Computers.csv | Vælg –ExpandProperty Computer). Læser en CSV-fil (kommasepareret værdi), der hedder Computers.csv og indeholder en kolonne med navnet Computer, der indeholder computernavne.
- -ComputerName (Get-ADComputer –Filter * | Vælg –UdvidEgenskabsnavn). Forespørger alle computerobjekter i AD DS, hvilket kan tage lang tid i et stort domæne.
Almindelige fejl ved brug af computernavne
Pas på, hvor du angiver et computernavn. Gennemse f.eks. følgende kommando:
Invoke-Command –ScriptBlock { Get-Service –ComputerName ONE,TWO }
Denne kommando angiver ikke parameteren –ComputerName til Invoke-Command. Derfor kører kommandoen på den lokale computer. Den lokale computer kører Get-Service-, der er målrettet til computere med navnet ONE og TWO. De protokoller, der bruges af Get-Service-, bruges i stedet for Windows PowerShell-remoting. Sammenlign dette med følgende kommando:
Invoke-Command –ScriptBlock { Get-Service } –ComputerName ONE,TWO
Denne kommando bruger Windows PowerShell-fjernforbindelse til at oprette forbindelse til computere med navnet ONE og TWO. Hver af disse computere kører Get-Service- lokalt og returnerer deres resultater ved hjælp af fjernudgang.
Hvis du vil have mere interaktive Windows PowerShell-remoting-situationer, kan du administrere individuelle sessioner som separate enheder. Det gør du ved først at oprette en session ved hjælp af kommandoen New-PSSession. Fordelen ved at bruge kommandoen New-PSSession er, at sessionen fortsætter i flere Invoke-Command forekomster, så du kan overføre variabler og objekter til andre kommandoer i scriptet. Du kan oprette vedvarende sessioner ved hjælp af kommandoen New-PSSession og tildele den til en variabel. Du kan derefter referere til variablen senere ved hjælp af kommandoen Invoke-Command. Når du er færdig, kan du lukke vedvarende sessioner ved hjælp af kommandoen Remove-PSSession.