Geek School Lær å bruke Remoting i PowerShell
En av de beste funksjonene i PowerShell tilbyr muligheten til å administrere serverne dine eksternt. Det lar deg selv styre en haug med dem samtidig.
Husk å lese de forrige artiklene i serien:
- Lær hvordan du automatiserer Windows med PowerShell
- Lære å bruke Cmdlets i PowerShell
- Lære hvordan du bruker objekter i PowerShell
- Læreformatering, filtrering og sammenligning i PowerShell
Og hold deg innstilt for resten av serien hele uken.
Hva er Remoting?
Bulkadministrasjon av serverne dine kan være kjedelig, og hvis du har måttet gjøre en IIS-konfigurasjonsendring på 50 webservere før, vil du vite hva jeg mener. Det er slike situasjoner når PowerShell Remoting og språkets skriptegenskaper kan komme til redning. Ved hjelp av HTTP eller den sikrere HTTPS-en, kan PowerShell Remoting du sende kommandoer til en ekstern maskin på nettverket ditt. Maskinen kjører deretter kommandoene og sender utgangen tilbake til deg, som igjen vises på skjermen.
La oss få teknisk
Kjerne i PowerShell Remoting ligger en enkelt Windows-tjeneste, Windows Remote Management eller WinRM-tjenesten, som den er blitt kjent. Ved hjelp av WinRM kan du konfigurere en eller flere sesjonskonfigurasjoner (også kjent som sluttpunkter), som egentlig inneholder filer som inneholder informasjon om opplevelsen du vil gi til personen som kobler til din eksterne PowerShell-forekomst. Mer spesifikt kan du bruke øktkonfigurasjonsfiler til å definere hvem som kan og hvem ikke kan koble til forekomsten, hvilke cmdletter og skript de kan kjøre, samt hvilken sikkerhetskontekst sesjonen må kjøre under. Ved hjelp av WinRM-tjenesten oppretter du også "lyttere", som lytter etter innkommende PowerShell-forespørsler. Disse "lytterne" kan enten være HTTP eller HTTPS og kan være bundet til en enkelt IP-adresse på maskinen din. Når du åpner en PowerShell-tilkobling til en annen maskin (teknisk sett gjøres dette ved hjelp av WS-MAN-protokollen, som er basert på HTTP), binder forbindelsen til en av disse "lytterne". "Lytterne" har da ansvaret for å sende trafikken til applikasjonen som er tilknyttet den aktuelle øktkonfigurasjonsfilen. programmet (normalt PowerShell, men du kan ha andre vertsprogrammer hvis du vil), kjører deretter kommandoen og feeds resultatene tilbake gjennom "lytteren" over nettverket og tilbake på maskinen din.
Vis meg hvordan
Det første du må gjøre er å aktivere Remoting på maskinen du vil koble til. Dette kan gjøres ved å kjøre følgende:
Aktiver-PSRemoting
Du må da svare ja til alle spørsmålene. Når du kjører Aktiver-PSRemoting, blir det gjort noen endringer på PCen din:
- WinRM-tjenesten starter opp.
- WinRM-tjenesten endres fra manuell oppstartsmodus til automatisk.
- Den oppretter en HTTP-lytter som er bundet til alle nettverkskortene dine.
- Det skaper også et innkommende brannmur unntak for WS-MAN protokollen.
- Noen standard sesjonskonfigurasjoner er opprettet
Hvis du kjører Windows 7 og nettverkskortets posisjon er satt til Offentlig, vil PowerShell Remoting mislykkes. For å fikse det, må du bare bytte til Hjem eller Arbeidsnettsted. Alternativt kan du hoppe over nettverkskontrollen ved hjelp av følgende:
Aktiver-PSRemoting -SkipNetworkProfileCheck
Vi anbefaler imidlertid at du endrer nettverksplasseringen din heller.
Det er to måter å koble til en annen maskin ved hjelp av PowerShell. Det er den ene til en metoden, som ligner på å bruke SSH, og så er det en til mange metoder.
Bruke en PowerShell-sesjon
Den første måten å koble til en ekstern maskin ved hjelp av PowerShell, bruker noe som kalles en PowerShell-økt. Enkelt å sette en økt lar deg kjøre kommandoer på den eksterne maskinen på en interaktiv måte, omtrent det samme du ville på din egen maskin. For å åpne en økt, skriv bare følgende:
Enter-PSSession -ComputerName "Darlah"
Prompten vil få et prefiks som betyr at maskinen som du kjører cmdlets mot.
Herfra kan du virkelig behandle spørringen som om du satt på fjernmaskinen. Hvis du for eksempel vil se alle filene på C: \ -stasjonen, kan du gjøre det enkelt:
Get-ChildItem -Path C: \
Hvis du kommer fra en Linux-bakgrunn, kan du tenke på å bruke denne en til en fjernmetode som PowerShell-alternativet til SSH.
Bruke Invoke-Command
Den andre måten du kan bruke PowerShell på en ekstern maskin, er å bruke Invoke-Command. Fordelen med å bruke Invoke-Command kommer fra det faktum at du kan utføre samme kommando på flere maskiner samtidig. Som du kan forestille deg, er dette spesielt nyttig når du vil gjøre noe som å samle hendelseslogger fra serverne dine. Invoke-Command følger følgende syntaks:
Invoke-Command -ComputerName Darlah, localhost -ScriptBlock Get-EventLog Application -Newest 2
Siden kommandoen utføres parallelt på tvers av alle maskiner, trenger du en måte å se hvilken PC et gitt resultat kommer fra. Du kan gjøre dette ved å se på egenskapen PSComputerName.
Når du bruker Invoke-kommando, har du ikke lenger de objektene du kan forvente i rørledningen. Du ser, for at PowerShell skal få informasjonen fra den eksterne maskinen tilbake til maskinen din, trenger de noen måte å representere objektene som kommandoen du kjørte på de eksterne maskinutgangene. Disse dagene ser det ut til at den valgte måten å representere en hierarkisk datastruktur er å bruke XML, noe som betyr at når du utsteder en kommando ved hjelp av Invoke-Command, blir resultatene først serialisert i XML før de sendes tilbake til maskinen din. Når de kommer tilbake til maskinen, blir de deserialisert tilbake til et objekt; The gotcha her er at når de er deserialiserte, alle metoder, bortsett fra ToString () metoden, at objektet hadde blitt fjernet fra det.
Merk: Det er noen unntak fra denne regelen, for eksempel kan de fleste primitive typer som heltall deserialiseres med sine metoder inkludert. Det er også en prosess som heter Rehydrering hvor noen metoder kan legges tilbake til deserialiserte objekter. Så vær forsiktig og husk. Get-Member er din venn.
Hjemmelekser
- Les hemmelighetene til PowerShell Remoting ebook av Don Jones.