Artikkel av: Jan Egil Ring, Crayon

 

Mange har hørt om PowerShell, men har ikke satt seg så mye inn i hva det er. I denne artikkelen skal vi derfor se på hva det er og hvorfor det er viktig for alle som jobber med Windows-baserte systemer.

--------------------------------------------------------------------------------------------------------------------------------------

Historien bak

Som i andre industrier er det også i IT-bransjen definert standarder for administrasjon av systemer. Distributed Management Task Force (DMTF) er en industri-organisasjon som utvikler, vedlikeholder og frembringer standariseringer i IT-bransjen.
Standariseringene sørger for at det er mulig å bygge administrasjons-systemer som er uavhengige i forhold til teknologi og plattformer.
Det eksisterer en rekke standarder for eksempelvis virtualisering og hardware, men de 2 vi skal se på heter CIM og WBEM. CIM står for Common Information Model og er en standard som definerer for eksempel hvordan harddisker, printere og andre enheter representeres som objekt i et definert schema. CIM danner grunnlaget for de fleste standarder fra DMTF.
WBEM står for Web-Based Enterprise Management, og er en standard i DMTF som definerer kommunikasjonsprotokoller mellom de ulike elementene i CIM.
Som den største leverandøren av operativsystemer var også Microsoft forpliktet til å følge disse standardene. Siden Windows 2000 har Microsoft hatt pre-installert støtte for CIM og WBEM, i form av noe som heter Windows Management Instrumentation (WMI). WMI var også tilgjengelig som nedlastinger for Windows 95, Windows 98 og Windows NT.
WMI består i grove trekk av såkalte namespaces og klasser, som gjør det mulig å jobbe med alt fra hardware til tjenester og andre elementer i operativsystemet. Applikasjoner som Internet Explorer og Microsoft Office, samt server-applikasjoner som Microsoft Exchange og SQL, utvider CIM-modellen i WMI med flere klasser. Dette gjør det mulig å administrere disse applikasjonene basert på definerte standarder.
For oss som jobber med Microsoft-produkter til daglig har vi ikke så mye forhold til WMI og de nevnte standarder. Dette er ikke så rart siden WMI hovedsakelig er myntet på utviklere.
Det fins riktignok et kommandolinje-verktøy som heter Windows Management Instrumentation Command-line (WMIC), men å jobbe med WMI er forholdsvis komplekst.

En annen standard i Microsoft-miljøer er Component Object Model (COM). Dette er en grensesnitt-standard for software som ble introdusert av Microsoft i 1993. Begrepet COM er ofte brukt som et samlebegrep for teknologier som OLE, ActiveX, COM+ og DCOM.

Bortsett fra de grafiske verktøyene som er tilgjengelig har mulighetene for å masse-administrere og automatisere systemer ligget i bruk av de ulike teknologiene nevnt ovenfor, ved hjelp av for eksempel VBScript eller ulike kommandolinje verktøy. Visual Basic Scripting Edition (VBScript) bygger på Visual Basic og er et script-språk utviklet av Microsoft. Da dette ble lansert i 1996 var det initielt myntet på web-utviklere, men ble senere utvidet til administrasjon av Windows-systemer. Før dette var det batch, som stammer fra DOS og OS/2, som ga oss muligheten til å automatisere oppgaver i Windows.

Både VBScript, batch og ulike kommandolinjeverktøy har vi kunnet jobbet med fra den tradisjonelle kommandolinjen i Windows, cmd.exe/command.com.

Dette har ikke vært dårlige løsninger, men problemet for oss som skal ta det i bruk er stor grad av inkonsistens. De fleste produkter har et eller flere kommandolinje-verktøy, tradisjonelt i form av Resource Kits. For disse verktøyene er det ingen definert standard for syntaks og oppbygging. For eksempel kan et verkøy benytte slash (/) for å angi parametre, mens andre kan bruke binde-strek (-).

Før vi går inn på oppbygging i PowerShell, skal vi se litt på .NET og historien til selve PowerShell.
Microsoft .NET Framwork er et rammeverk for software på Windows operativsystemer. Den første versjonen ble lansert i 2002, og vi har per i dag kommet til versjon 4.0.
.NET erstatter i stor grad COM, og de fleste nye applikasjoner for Windows skrives i dag i .NET.
Microsoft har lenge vært klar over Windows sine begrensninger i forhold til kommandolinjen og automatisering. De begynte å se på dette i år 2000, og det ble da etablert et prosjekt for dette. Parallelt jobbet mannen som er arkitekten bak PowerShell, Jeffrey Snover, på WMI teamet i Microsoft. Han hadde noen tanker om hvordan WMI kunne tilgjengeliggjøres på en mer administrator-vennlig måte i et objekt-orientert shell basert på .NET. Under “Ressurser” nederst i denne artikkelen er det en link til “Monad Manifesto – the Origin of Windows PowerShell”. Monad var kode-navnet for PowerShell, og Monad Manifesto beskriver Jeffrey Snover`s visjon for en ny plattform for administrasjon og automatisering i Windows.

Den første offentlige beta-versjonen av PowerShell ble lansert i Juni 2005, mens det endelige produktet Windows PowerShell 1.0 ble lansert i November 2006. Den nyeste versjonen er versjon 2.0, som ble lansert som en del av Windows 7 og Windows Server 2008 R2 i August 2009. Fra og med versjon 2.0 er PowerShell en integrert del av Windows operativsystemet, og den siste versjonen er tilgjengelig som en nedlasting til Windows XP/Vista og Windows Server 2003/2008 R1.

Microsoft har et program som heter Microsoft Common Engineering Criteria for Windows Servers (CEC), som definerer felles krav for alle server-produkter fra Microsoft. Fra og med 2009 ble Windows PowerShell en del av CEC, noe som betyr at alle Microsoft server-produkter heretter skal ha støtte for automatisering via PowerShell.

Grunnleggende oppbygging

PowerShell kan startes enten fra Start->Alle programmer->Tilbehør->Windows PowerShell eller ved å skrive powershell.exe i Kjør-vinduet. Bortsett fra navn og bakgrunnsfarge kan man få inntrykk av at dette er cmd.exe i ny drakt:

clip_image002

Men det er langt fra sannheten! PowerShell er et interaktivt shell, et scriptmiljø og en automasjonsmotor som bygger på .NET. Siden .NET er et objektorientert språk, er også PowerShell objektorientert. Dette vil si at alt i PowerShell er oppbygd av objekter. Kommandoene i PowerShell heter cmdlets (uttales kommandlets), og har en konsistens som bygger på verb-bindestrek-substantiv. Eksempler på verb er Get, Set, Remove, New, Start og Stop, altså noe man kan gjøre. Eksempler på substantiver er Service, Process, Item, Computer og User. Dette kan gi oss eksempler som Get-Service, New-User, Set-User og Start-Service.
I forrige avsnitt ble det nevnt at parametre i ulike kommandolinje-verktøy tradisjonelt har vært forskjellige. I PowerShell angis parametre alltid med bindestrek. Eksempelvis Start-Service –Name “Print Spooler”.

Som en grunnleggende start kan du begynne med å lære deg følgende to cmdlets:

Get-Command – lister alle tilgjengelige kommandoer

Get-Help – viser hjelpetekst for angitt kommando

Et eksempel på dette er Get-Help Start-Service, som vil vise syntaks og bruk av Start-Service.
De fleste finner fortere ut av ting ved å se praktiske eksempler enn å måtte lese lange instrukser. Eksempler kan man få fram ved å legge til parameteren –Examples:

clip_image004

I versjon 2.0 ble det lansert et grafisk verktøy for PowerShell som heter Windows PowerShell Integrated Scripting Engine (Windows PowerShell ISE).

clip_image006

Her har man en fullverdig scripteditor med syntaks-farger (høyre side), et output vindu (øverst til venstre) og en kommandolinje (nederst til venstre). Dette gjør scripting og feilsøking (debugging) vesentlig enklere, uten å måtte sette seg inn i og kanskje kjøpe et 3. parts produkt.

PowerShell bygger på en automasjonsmotor, og konsollapplikasjonen powershell.exe er i realiteten en host applikasjon for PowerShell-motoren. Host applikasjonen kan også være en grafisk applikasjon, noe vi allerede har et innebygd eksempel på i versjon 2.0 i form av PowerShell ISE. Andre applikasjoner kan også bygges på denne motoren, noe 3. parts scripteditorer er et eksempel på.

clip_image008

Grunnleggende oversikt over PowerShell`s oppbygning

For en videre innføring i Windows PowerShell vil jeg anbefale artikkel-serien på 7 deler jeg har hatt gleden av å skrive sammen med Ragnar Harper. Link finner du under “Ressurser” nederst i denne artikkelen.

Utvidelser

De fleste som administerer Windows-miljøer er kjent med Microsoft Management Console, MMC. Dette er et grafisk verktøy hvor man kan legge til og fjerne såkalte snap-ins. Ulike produkter og features som Active Directory, Group Policy og servicer kan administreres via snap-ins.

clip_image010

Tilsvarende funksjonalitet finner vi i PowerShell i det som i versjon 1.0 het snapins, og som i versjon 2.0 ble erstattet av moduler. En oversikt over tilgjengelige moduler får man ved å kjøre Get-Module med parameteren –ListAvailable:

clip_image012

Vil man ta i bruk en modul kjører man Import-Module –Name “Navn på modul”. Eksempel:

clip_image014

For å se de nye kommandoene som nå har blitt tilgjengelige kjører man Get-Command med parameteren –Module “navn på modul”. Eksempel:

clip_image016

Man vil da få opp listen over 76 nye kommandoer i PowerShell for å administrere Active Directory.
PowerShell 2.0 i seg selv uten innlastede moduler/snapin inneholder 236 kommandoer.

Fra og med Windows Server 2008 har Microsoft et verktøy som heter Server Manager som samler snapins for installerte roller, features og operativsystem-funksjoner i ett konsoll.
For å sammenligne dette med tilsvarende funksjonalitet i PowerShell kan vi basert på det vi har sett på hittil kjøre følgende for å laste inn PowerShell-modulen ServerManager og se de tilgjengelige kommandoene:

clip_image018

Akkurat som i MMC kan man laste inn flere moduler, og dermed jobbe med flere produkter og features samtidig.

Moduler og snapins er ikke bare begrenset til Microsoft selv. 3. parter kan lage egne moduler og snapins for sine produkter. I de siste par årene har flere og flere 3. parter kommet til med PowerShell-støtte i sine produkter.

Fjernadministrasjon

En av de største og viktigste nyhetene i PowerShell 2.0 er remoting. Dette gjør det mulig å koble seg til en eller flere eksterne maskiner via PowerShell. Det eksisterer i grove trekk 3 former for remoting:

· En til en – kan gjerne sammenlignes med SSH i Unix/Linux, og gjør det mulig å jobbe interaktivt med en maskin via PowerShell i stedet for den tradisjonelle metoden med eksternt skrivebord.

· En til mange – gjør det mulig å kjøre en kommando eller et script mot flere maskiner samtidig.

· Mange til en – et eksempel på denne formen for remoting er PowerShell hosting provideren i Internet Information Services (IIS), som gjør det mulig for flere maskiner å koble seg til IIS for å eksempelvis administrere en tjeneste på den aktuelle maskinen

Remoting i PowerShell bygger på en tjeneste i Windows som heter Windows Remote Management (WinRM). Dette er Microsoft`s implementering av industristandarden Web Services-Management, som er en definert DMTF-standard.

WinRM er en web-basert tjeneste som benytter http. Tidligere har fjernadministrasjon i Windows i stor grad vært bygget på RPC, som er en lite brannmur-vennlig protokoll som benytter dynamiske porter. Standard port for WinRM er TCP 5985.

Produkt-integrasjoner

Det første Microsoft-produktet bygget på Windows PowerShell var Microsoft Exchange Server 2007, som ble lansert 16 dager etter Windows PowerShell i November 2006. Siden da har mange andre produkter blitt lansert med PowerShell-støtte, blant annet System Center Operations Manager 2007 R2, System Center Virtual Machine Manager 2008/2008 R2 og SQL Server 2008/2008 R2.
Fra og med Windows 7 og Windows Server 2008 R2 er også flere operativsystem- og server-tjenester basert på PowerShell. Eksempler på dette er Windows Troubleshooting Platform som i sin helhet kjøres med PowerShell-kommandoer i bunn. Server-tjenester som Active Directory, Windows Failover Clustering, Network Load Balancing og Remote Desktop Services tilbyr alle PowerShell-moduler for administrasjon.

Det som var revolusjonerende med Exchange Server 2007 var at det var det første produktet til å ta i bruk konseptet med at alt av administrasjon rundt produktet bygges rundt PowerShell. Det bygges deretter et grafisk MMC-konsoll som for hver operasjon som utføres kjøres i bakgrunnen som PowerShell-kommando. Exchange Server 2007 er et veldig bra eksempel på hvordan dette kan gjennomføres, siden de på slutten av veiviserne i MMC-konsollet viser de faktiske PowerShell-kommandoene som kjøres i bakgrunnen. Dette gjør det vesentlig enklere å automatisere en oppgave, ved å først utføre den i MMC-konsollet og se hvilken kommando som ble kjørt, for deretter å kopiere denne til eksempelvis PowerShell ISE for sammensetning til et script.
Grunnet tidspress før utgivelse rakk ikke Exchange-teamet å tilgjengeliggjøre alle aspekter ved administrasjon av Exchange Server 2007 i MMC-konsollet, noe som møtte en del kritikk fra administratorer som først og fremst vil bruke et grafisk verktøy. Dette har i stor grad blitt rettet i senere Service Packs, samt den nyeste versjonen Exchange Server 2010.

Stadig flere 3. parter har kommet med PowerShell-integrasjoner i sine løsninger, blant disse kan Amazon S3, Citrix XenApp 6, Compellent, Intel, NetApp Data ONTAP, Quest, Symantec Enterprise Vault og VMware vSphere nevnes.

Praktisk bruk

For å illustrere hvilke gevinster man kan oppnå ved å automatisere prosesser med PowerShell skal vi se på noen praktiske eksempler.
Windows Update er noe alle må ha et forhold til for å ivareta sikkerhet. En mye brukt praksis er å konfigurere klienter for automatisk nedlasting og installasjon av oppdateringer, mens det på server-siden utføres manuell installasjon. Årsaken til dette er blant annet avhengigheter i forhold til oppstartsrekkefølge og redundante systemer. Dermed er det mange som utfører dette manuelt på hver server, noe som fort blir tidkrevende i miljøer med mange servere. I enterprise-miljøer håndteres slikt av systemer som eksempelvis BigFix. Slike løsninger blir gjerne for dyre og komplekse for SMB-miljøer. En kontrollert automatisering av Windows Update ved hjelp av PowerShell kan da være godt alternativ. For å kontrollere rekkefølge settes det typisk opp flere bulker av servere, dette kan gjerne være så enkelt som tekst-filer eller OU`er i Active Directory.
Skjermbilder og eksempel på et script for automatisering av Windows Update kan du finne i dette blogg-innlegget.

Et annet eksempel vi skal se på er administrasjon av servere. For pålogging til servere i mindre miljøer er bruk av “Eksternt skrivebord”-klienten i Windows tilstrekkelig, men i større miljøer er det mer praktisk med verktøy som eksempelvis VisionApp Remote Desktop, Royal TS og Remote Desktop Connection Manager. Remote Desktop Connection Manager er et gratis verktøy fra Microsoft for fjernstyring av servere, og konfigurasjonsfilen er i XML-format. Å jobbe med XML i PowerShell er forholdsvis enkelt, og sammen med PowerShell-modulen for Active Directory er det mulig å hente ut alle server-navn og sette sammen en konfigurasjonsfil for Remote Desktop Connection Manager. Du finner mer detaljer og link til nedlasting av script her.

I den siste utgaven av Windows Server – 2008 R2 – inneholder Server Manager et nytt verktøy som heter Best Practices Analyzer. Dette er som navnet indikerer et verktøy som kan scanne de fleste server-roller og komme med en oversikt over hva som er, og ikke er, i henhold til anbefalte retningslinjer fra Microsoft.
Dette er en nyttig funksjon som gir oss innblikk i om konfigurasjonen av ulike server-roller er i henhold til de anbefalte retningslinjene, men for de som har et større antall servere er det en tidkrevende oppgave å logge på hver server, starte Server Manager, og for hver server-rolle trykke på “Scan this role”.
Siden Best Practices Analyzer er en PowerShell-modul som i realiteten kjører i bakgrunnen når man scanner en server-rolle, er det mulig å automatisere prosessen ved hjelp av PowerShell remoting. Et eksempel på et script som utfører dette, og samtidig gir muligheten for å få rapporter på e-post samt CSV- og HTML-format er tilgjengelig her.

I det siste eksempelet skal vi se på oppretting av brukerobjekter i Active Directory. Å opprette en bruker via det velkjente MMC-konsollet Active Directory Users and Computers er en grei sak. Siden stadig flere produkter er Active Directory-integrert er det som regel flere administrasjons-verktøy en bruker må opprettes i. Eksempler på dette er Exchange Server og Microsoft Communications Server. I tillegg skal brukerne gjerne ha hjemmeområder hvor riktige rettigheter skal settes, brukeren skal meldes inn i grupper og så videre. Til slutt begynner dette å bli en omfattende oppgave. Skal man opprette mange brukere, eksempelvis hver sommer i skole-miljøer, vil dette være en tidskrevende oppgave samtidig som at det er en risiko for at man gjør feil på èn eller flere brukere. Ved hjelp av PowerShell er det mulig å utføre alle disse oppgavene på en gang, noe som både er tidsbesparende og er med og kvalitetssikrer resultatet.
Har man brukerinfo i for eksempel et Excel-ark som kan lagres i CSV-format, eller en database fra et fagsystem, kan dette brukes som datagrunnlag ved import. PowerShell MVP Don Jones har en artikkel-serie om bruker-oppretting (user provisioning) på 4 deler i TechNet Magazine hvor han går gjennom oppretting av brukere fra en CSV-fil, oppretting av mailbox i Exchange, oppretting av hjemmeområde, setting av rettigheter og så videre. Artikkelserien finner du her.

Dette var noen utvalgte områder som kan automatiseres for effektivisering av hverdagen for ITPro`er.

Oppsummering

PowerShell er en viktig del av Windows operativsystemer, og er kommet for å bli. Alle nye server produkter fra Microsoft vil ha full støtte for PowerShell, i tillegg til at stadig flere 3. parts produkter følger etter.
Dette har en revolusjonerende innvirkning på administrasjon og automatisering av Microsoft`s produkter og operativsystemer.

Ser man på de praktiske eksemplene fra forrige avsnitt ser man hvor mye inntjening man kan få i form av effektivitet og spart tidsbruk.

Personlig mener jeg ikke at alle skal sette seg dypt inn i PowerShell for å skrive avanserte script og automatisere oppgaver. Derimot mener jeg det er viktig at de som jobber med Microsoft-produkter setter seg inn i hva PowerShell er, bruk av grunnleggende funksjonalitet, og vet om potensialet som ligger der. Dette gjør at man ved behov kan benytte kommandoer, script og moduler som følger med Windows og ulike produkter. I tillegg er det en bred community rundt PowerShell, og veldig mange personer deler ting de har laget. Det fins også mange forum og nettsider hvor man kan få hjelp til alt fra grunnleggende spørsmål til mer avanserte temaer.

Ikke alle har tid til å bruke tid i en hektisk hverdag på å sette seg inn i nye ting, men det er kommet offisielle kurs fra Microsoft som er tilgjengelig. I tillegg til dette fins det mye gratis ressurser på internett, en del av disse finner du linker til i neste avsnitt.

Jeg vil avslutte denne artikkelen med et sitat fra PowerShell`s arkitekt, Jeffrey Snover: “If you’re using Windows and not retiring in the next 12 to 18 months, you need to learn PowerShell”.

Ressurser

Last ned Windows PowerShell (for OS lansert før Windows 7/Windows Server 2008 R2)

PowerShell-artikler på ITPro.no:

Guide: Windows PowerShell
Administrasjon av Active Directory med Windows PowerShell

Administrasjon av Group Policy med Windows PowerShell

Blogger:

PowerShell Team Blog

Hey, Scripting Guy! Blog – nye artikler og script hver dag, 24/7

EverythingPowershell – Ragnar Harper`s PowerShell-blog

Gratis ebooks:
Master-PowerShell av MVP Tobias Weltner

Effective Windows PowerShell av Keith Hill

Administrator's Guide to Windows PowerShell Remoting

Bøker:

Windows PowerShell In Action - 2nd Edition – designeren av PowerShell, Bruce Payette

Windows PowerShell Cookbook, Second Edition – PowerShell team-medlem Lee Holmes

Windows PowerShell TFM 2.0 – Don Jones og Jeffrey Hicks

Bli kjent med PowerShell – norsk bok av Ragnar Harper

Kurs:

Kurs 10325A: Automating Administration with Windows PowerShell 2.0

Kurs 50414: Powershell v2 for Administrators

Andre linker:

Windows PowerShell Quick Reference

Monad Manifesto – the Origin of Windows PowerShell

Mange flere ressurser finner du på TechNet Wiki-siden Windows PowerShell: Survival Guide

For flere artikler om PowerShell og andre fagområder, følg med på Microsoft Norge`s nyhetsbrev, TechNet Flash.