Daily Archives

4 Articles

Powershell/remoting

Throttling med Powershell 2.0

Posted by ragnar harper on

Ettersom at vi kan kjøre kommandoer mot flere maskiner samtidig er det nyttig å kunne kontrollere hvor mange forbindelser som opprettes på en gang. Dette styrer vi med parameteren ThrotteLimit (eller bare Throttle om du vil). ThrottleLimit setter en grense på samtidige forbindelser som opprettes. Standardverdien er 32 (som gir 32 samtidige forbindelser). Om vi setter denne til 0 er det også standardverdien som benyttes.

Om ThrotteLimit parameteren ikke settes vil den benytte opptil 32 samtidige tilkoblinger.

I eksemplene under hentes maskinnavnene fra ei fil som heter servers.txt. Dette vil være en standard tekst fil med ett servernavn per linje:

Eksempel på innhold i fila servers.txt

ServerA
ServerB
ServerC
ServerD

La oss ta følgende eksempel:

invoke-command -computer (get-content servers.txt) –scriptblock {hostname} –ThrottleLimit 10

Throttling kan også benyttes på Get-WmiObject CmdLet:

Get-WmiObject win32_Bios –computer (get-content servers.txt) –throttle 10

For å gi deg ett eksempel på hvordan dette virker som du kan teste, lager vi en liste som peker på vår egen maskin 10 ganger.

Dette gjør jeg ved å lage ett array som inneholder . (tegnet punktum) 10 ganger.

$TestListe=@($(-split (". " * 10)))

Deretter kjører vi Invoke-Command mot maskinen vår:

invoke-command -ComputerName $TestListe -ScriptBlock {hostname}

Utfallet av kommandoen hos meg er som vist i bildet under:

image

Dette er fordi vi er begrenset til å kun kjøre fem samtidige shell gjennom WS-Management som standard. Om vi ikke ønsker å endre på denne verdien kan vi benyyte ThrottleLimit til å begrense antall kall som Powershell utfører samtidig.

For eksempel som følger:

invoke-command -ComputerName $TestListe -ScriptBlock {hostname} -ThrotteLimit 4

image 

Du ser nå hvordan Powershell sender kallene, men maks 4 stykker samtidig.

Så hvorfor ønsker du å benytte ThrottleLimit?

I tilfeller hvor du ønsker å begrense antalle samtidige kall som skal kjøres benytter du ThrottleLimit. På denne måten kan du justere hvor mange forespørsler som sendes ut samtidig.

Guide/Powershell

Kom igang med Powershell – del 3

Posted by ragnar harper on

Dette er del 3 av Kom igang med Powershell guiden min.

Del 1: Kom igang med Powershell

Del 2: Kom igang med Powershell

Sikkerhetsegenskaper

Et miljø som PowerShell møter store utfordringer sikkerhetsmessig, og disse er ivaretatt på flere måter. Det er tenkt sikkerhet hele veien gjennom utviklingsløpet av PowerShell, og i nå skal vi se nærmere på disse.

Merk at denne oppgaven krever at du er administrator. Hvis du kjører Vista eller nyere, start Powershell som administrator ved å høyreklikke på Powershell ikonet og velg Run as administrator.

Problemer med scriptkjøring

Hvis du dobbeltklikker på ei fil med endingen ps1 vil du åpne Notepad, istedet for at scriptet kjøres.Faktisk vil vi også oppleve problemer hvis vi skriver inn scriptnavnet fra kommandolinjen også…

For at ikke noen skal kunne ersatte kjente programmer og cmdlets, krever PowerShell at du angir mappenavnet for å kjøre et script. Hvis du kun taster inn scriptnavnet, vil PowerShell gi deg feilmelding om at scriptet ikke finnes, som vist i figuren under.

image

For å kjøre et script i samme mappe som du står, må du legge til .\ foran scriptnavnet, som i \.scripttest.ps1.

Den andre sikkerhetstskonfigurasjonen som har påvirkning for kjøring av dine script er PowerShell Execution Policy.

Følgende fire execution policy’s er definert:

  1. Restricted standardvalget. Ingen script kan kjøres – uansett.
  2. AllSigned Alle script som er signert med en sertifikat, og hvor vi har tillit til sertifikatet kan kjøre.
  3. RemoteSigned Alle lokale script kan kjøres, også de som ikke er signert. Remote script (som lastes ned fra Outlook, Internet Explorer osv), må være signert med et sertifikat vi har tillit til for å kunne kjøre.
  4. Unrestricted Alle script kjøres, om de er signerte eller ikke.

For mer informasjon kjør kommandoen

help about_signing.

Ønsker du å se hvilken ExecutionPolicy du har, kjør følgende kommando:

Get-Executionpolicy

For å endre ExtecutionPolicy til å tillate lokale script uten signering, men krev signering fra nedlastede script, kjør følgende kommando

Set-ExecutionPolicy RemoteSigned

Bruk av digitale signaturer

Det anbefales å signere alle script, slik at du kan kjøre med en restriktiv sikkerhetspolicy i PowerShell. Vi går her igjennom en måte å signere script for bruk på utviklermaskiner. Denne fremgangsmåten gjør at du slipper å kjøpe et sertifikat for utvikling. For kjøring i bedrift anbefaler vi at man går til innkjøp av et code-signing certificate, eller utsteder et code-signing sertifikat fra egen PKI infrastruktur.

Vi kommer til å benytte verktøyet makecert.exe fra .NET Framework SDK. Dette kan lastes ned fra http://msdn.microsoft.com/netframework/downloads/updates/default.aspx . Eventuellt finnes også verktøyet i Windows Platform SDK.

Deretter kan du navigere deg til stedet hvor makecert er installert, og kjøre følgende kommando for å opprette et rotsertifikat.

.\makecert -n "CN=PowerShell Local Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine

Når du kjører kommandoen vil du få et dialogvindu som spør deg om passord. Du kan angi et passord her for den private nøkkelen. For vår del  angi ett passord du husker.

Rotsertifikatet er den utstedelsesmyndigheten vi velger å ha tillit til. I tillegg til et rotsertifikat trenger vi en code-signing sertifikat som vi kan bruke på våre PowerShell script. For å utstede dette sertifikatet kjører vi følgende kommando:

 .\makecert -pe -n "CN=PowerShell Developer" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

Under denne operasjonen får du også en dialogboks som spør deg om passord. Angi igjen ett passord du husker.

Disse sertifikatene skal nå ligge i maskinens certificate store. Dette kan man naturligvis sjekke via PowerShell:

dir cert:\CurrentUser\My -codesigning | fl

Du skal nå se noe som ligner på følgende:

Subject : CN=PowerShell Developer

Issuer : CN=PowerShell Local Root

Thumbprint : 5F4C985FFCC51AF1A2E0626686BFBD883177280A

FriendlyName :

NotBefore : 01.05.2007 17:26:47

NotAfter : 01.01.2040 00:59:59

Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid}

La oss nå signere et script. Først trenger vi å lage et enkelt script.

Opprett scriptet mittscript.ps1 med følgende innhold:

$navn = Read-Host("Hva heter du?")
Write-Host "Hei der..$navn"

Dette kan du for eksempel gjøre i notepad. Husk å lagre fila med etternavnet ps1. I Notepad kan du gjøre dette i Save as dialogboksen ved å legge ” ” rundt filnavnet, eller endre Save As Type til Allfiles. Lagre fila med navnet mittscript.ps1.

Forsikre deg nå om at ExecutionPolicy er AllSigned med Get-ExecutionPolicy. Hvis den ikke er AllSigned, setter du den på følgende måte:

Set-ExecutionPolicy AllSigned

Prøv å kjøre scriptet:

.\mittscript.ps1

File C:\temp\mittscript.ps1 cannot be loaded. The file C:\temp\mittscript.ps1 is not digitally signed. The script will not execute on the system. Please see "get-help about_signing" for more details..

At line:1 char:16

+ .\mittscript.ps1 <<<<

Scriptet er ennå ikke signert, og vil derfor produsere en feilmelding når du forsøker å kjøre det.

La oss signere scriptet!

Først, la oss legge codesigning sertifikatet i en variabel, deretter forsikrer vi oss om at du har fått lagt riktig sertifikat i variabelen $cert.:

 $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

Deretter kjører vi følgende kommando for å forsikre oss om at du har riktig innhold i variabelen $cert:

$cert

Du skal da ha ett resultat som ligner på følgende:

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint Subject

———- ——-

5F4C985FFCC51AF1A2E0626686BFBD883177280A CN=PowerShell Developer

Tips: Hvis du har opprettet flere sertifikater kan det være du må endre [0] til [1] eller en annen verdi. Du kan liste ut alle mulige sertifikater ved å kjøre kommandoen

Get-ChildItem cert:\CurrentUser -codesigning

Deretter kjører vi kommandoen Set-AuthenticodeSignature kommandoen for å signere fila., som anvist i linje 31 under.

Set-AuthenticodeSignature mittscript.ps1 $cert

Prøv nå å kjøre scriptet:

.\mittscript.ps1

Du får nå opp en advarsel om at du ikke har tillit til sertifikatet som er benyttet.

image

Ved å svare A (Always) på spørsmålet (under forutsetningen at vi har tillit til oss selv), så slipper vi denne dialogboksen seinere.

Men hva skjedde med scriptet?

Ta en titt i fila mittscript.ps1. Du kan gjerne gjøre dette i PowerShell med kommandoen get-content på følgende måte:

[33] » get-content mittscript.ps1

Du vil nå finne at det er lagt til ekstra informasjon i fila. I mitt tilfelle ser denne ekstra informasjonen ut slik;

# SIG # Begin signature block

# MIIEFAYJKoZIhvcNAQcCoIIEBTCCBAECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB

# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR

# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUmQ9ec2cWO48xOLDpsvAtUabg

# 8hOgggIqMIICJjCCAZOgAwIBAgIQh7ANpUqeMZRF/QepIQRyIDAJBgUrDgMCHQUA

# MCAxHjAcBgNVBAMTFVBvd2VyU2hlbGwgTG9jYWwgUm9vdDAeFw0wNzA1MDExNTI2

# NDdaFw0zOTEyMzEyMzU5NTlaMB8xHTAbBgNVBAMTFFBvd2VyU2hlbGwgRGV2ZWxv

# cGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCslEI1W+iqe0BTKL8TUSzD

# Uv6ZZbnUk46wzwJ9uHNggfjGEtLiVKWxvFTM1BgM+/5mYtYFz5Vssoo84VI7EuGf

# umeIU1DWyIh4J1q4Md6/Hn/NHkDQTINfCsi7+IM2BgLBk2I8KOqeweLq5F0rgcfE

# h/GmaQS6UT2hPjYyGF4vdwIDAQABo2owaDATBgNVHSUEDDAKBggrBgEFBQcDAzBR

# BgNVHQEESjBIgBBtQRksbGaKclauFeJPoqQkoSIwIDEeMBwGA1UEAxMVUG93ZXJT

# aGVsbCBMb2NhbCBSb290ghDCpdCfKLjirEFA1TvQWmFhMAkGBSsOAwIdBQADgYEA

# sO0IXieIH8Ke+t8XNH61ZJkrNXP3tClGR1Y4wErxBDdvHAw4zN3CCz2x/JjF30/h

# /SADj0keE+LVjojWg5EbSZdY3gdFu8WTBHiK0eh+g9F4XCV71SN2VYbc6wMf1BSc

# leAxAPUwzq0BDXSPbKXo2exUhK3zRZRZ7jdwqVZi0+cxggFUMIIBUAIBATA0MCAx

# HjAcBgNVBAMTFVBvd2VyU2hlbGwgTG9jYWwgUm9vdAIQh7ANpUqeMZRF/QepIQRy

# IDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG

# 9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB

# FTAjBgkqhkiG9w0BCQQxFgQUL8LCtPpgpJi4d7Jm+Hs2K4aBRf4wDQYJKoZIhvcN

# AQEBBQAEgYCBopCZvbkxsEh3ZUzlTQQef2UqmmHhhK5QEqLtY3VChYfCAIa4XexK

# 9/KHz9EOBcx8tk0PzqkD2Kqe3UGSYAAGf5xwTfeXGtrOyOoPCD2shKAyb7eivp++

# J4CgYwptBgoD/9P0rG1UiXFYkhWKhMUeYV0Y1KZQlPnDqaM6fjM8sw==

# SIG # End signature block

En bedre måte å lese ut informasjon på vil for de fleste være å kjøre get-authenticodesignature kommandoen :

get-authenticodesignature mittscript.ps1 | fl

Vi har nå opprettet et sertifikat vi kan bruke for test og utvikling. I produksjon anbefaler jeg at du benytter eventuell intern PKI infrastruktur eller et kjøpt code-signing sertifikat.

Etter at du har installert code-signing sertifikatet på din maskin, kan du da laste det inn, og benytte Set-AuthentiCodeSignature med det sertifikatet.

Før vi nå går videre kan det være smart å endre ExecutionPolicy tilbake til RemoteSigned

Set-ExecutionPolicy RemoteSigned

Vi har i denne artikkelen sett på signering av script i Powershell.

Guide/Powershell

Kom igang med Powershell – del 2

Posted by ragnar harper on

Du finner del 1 her.

Bruk av moduler i Powershell

Den primære måten å utvide funksjonaliteten i Powershell 2.0 er gjennom bruk av moduler. En modul er en pakke som inneholder Powershell kommandoer, slik som cmdlets, funksjoner, variabler, alias og såkalte providers. Providers gjør det mulig å aksessere datakilder gjennom stasjonsalias.

Moduler lar utviklere og administratorer dele opp og organisere Powershell koden i gjenbrukbare, komplette pakker. Kode fra en modul utføres i sin egen kontekst, og affekterer ikke tilstanden utenfor modulen.

Der snapins må installeres (dll basert installasjon) og registreres i registry, kan moduler enkelt kun kopieres inn uten noen form for installasjon.

Fordi moduler ikke må installeres, kan man bruke disse uten å være administrator.

Du kan altså benytte både moduler og snapins for å legge til kommandoer i ditt Powershell miljø. Moduler kan legge til alle typer kommandoer, cmdlets, providers, funksjoner, variabler, aliase og stasjoner. Snapins kan kun legge til cmdlets og providers.

Hvis du ønsker å se hvor en cmdlet er definert, kan du utføre følgende kommando:

get-command <cmdlet-name> | format-list -property verb, noun, pssnapin, module

For eksempel, hvis du ønsker å se hvor Get-Process er definert:

get-command get-process | format-list -property verb, noun, pssnapin, module

Moduler kan lastes fra hvor som helst, men det er enklest å benytte erklærte modulområder. Ved å bruke erklærte modulområder er det lettere å oppdage modulene, samt at de kan aktiveres uten at hele stien til modulen må angis. Det er i utgangspunktet to erklærte områder hvor moduler kan ligge:

· %System%\WindowsPowershell\1.0\Modules ($PSHome\Modules)

· %Userprofile%\Documents\WindowsPowershell\Modules

Du kan sjekke hvilke stier som er erklærte modulområder på ditt system ved å kjøre følgende kommando:

$env:psmodulepath

image

Modulfilene kan kopieres til brukerens modulområde, eller til systemets modulområde. Man kan også laste moduler ved å eksplisitt angi banen til modulen.

For å aktivere modulen bruker man kommandoen Import-Module og modulens navn. Man kan få en oversikt over tilgjenglige moduler ved å bruke kommandoen Get-Module –ListAvailable.

Redirection

I alle kommandolinjer er redirection en sentral funksjon, hvor man styrer output dit man vil ha det. For eksempel ønsker du å lage deg etn oversikt over alle cmdlets som er tilgjengelig. Denne oversikten ønsker du å ha i ei fil.

Get-command > commandref.txt

Ved å erstatte > med >> legger du til teksten, hvis fila finnes fra før med innhold.

Senere vil du se at det også er flere måter å oppnå dette på, også for å styre output andre steder.

Hvis du ønsker å skrive ut alle kommandoene grupper etter subjektivet, så kan du kjøre følgende kommando:

Get-command | sort-object noun |format-table –group noun

Spesialtegn

Noen ganger har du behov for skrive ut tegn som egentlig ikke skrives ut synlig, slik som linjeskift, tabulator eller lage en lyd.

Tegn

Escape sekvens

Null

`0

Alert

`a

Backspace

`b

Form Feed

`f

Ny linje (Linjeskift)

`n

Carriage Return (Enter)

`r

Tab

`t

Vertical quote

`v

Prøv følgende kommando for å bygge din egen tre kolonners rapport.

[20] » write-host "Kolonne1 `t Kolonne2 `t Kolonne3 `nRekke1-1 `tRekke1-2 `tRekke1-3 `nRekke2-1 `tRekke2-2 `tRekke2-3"

Kolonne1 Kolonne2 Kolonne3

Rekke1-1 Rekke1-2 Rekke1-3

Rekke2-1 Rekke2-2 Rekke2-3

[21] » write-host `a`a`a`a

Scope

Funksjoner og variabler har en begrenset synlighet og levetid i Poweshell. Dette betyr at verdier vi setter eller funksjoner vi oppretter ikke nødvendigvis er tilgjengelig i hele systemet. Man kan se på scope i et foreldre-barn (parent-child) perspektiv, hvor det første og øverste leddet heter global. Childscopes kan aksessere verdier i et parentscope, men ikke motsatt. Scopet til det kjørende scriptet er navngitt script, og når vi kommer til variabler skal vi se litt nærmere på dette. Men jeg ønsker å presentere begrepet dot sourcing; når vi starter script fra PowerShell benytter vi ofte et punktum (dot) før scriptnavnet. Dette betyr at scriptet skal kjøre i samme scope som kommandolinja kjører i, og gir samme funksjonalitet som om du skulle skrevet alle kommandoene i kommandolinja direkte.

Funksjoner

Funksjoner er små rutiner med kildekode. Dette betyr kodelinjer satt sammen til å utføre en bestemt oppgave. Funksjoner har sin egen scope. Det betyr at variabler som deklareres og finnes i en funksjon kun er tilgjengelig til funksjonen. Hvis funksjonen kjører som en del av et script, har funksjonen adgang til scriptetes scope, fordi scriptet er funksjonens foreldre scope.

Eksempel på funksjon:

Function foo {write-host “bar”}

image

Pipelining

En av Powershells kraftigste fordeler er pipelining funksjonaliteten. Pipelining betyr å flytte data og objekter fra en kommando (cmdlet) til en annen.

Et eksempel mange kjenner seg igjen i fra cmd.exe verden er more

dir | more

Denne kommandolinjen tar resultatet fra dir kommandoen og ”piper” det til more.

Tradisjonelt pipes data mellom kommandoer i tekst format. Dette er endret med PowerShell, hvor data pipes som objekter. Dette er en meget sterk måte å håndtere data mellom objekter på, som gir flotte muligheter for avanserte script. Vi kommer til å bruke pipelining mye i resten av kurset.

Tegnet for pipe er |

Kjør følgende kommando:

Get-process | where { $_.handlecount –gt 400 } | format-list

Denne kommandoen henter en liste med kjørende prosesser ( get-process). Deretter så piper den resultatet inn i where . Fordi vi flytter objekter over til where kommandoen kan vi lese av attributter på objektet. Et process objekt har flere egenskaper, men vi leser av egenskapen handlecount. $_ er en standardangivelse for resultatet av foregående operasion, så med $_ mener vi resultatet fra foregående kommando. –gt står for større enn (greater than). Etter at vi har plukket ut alle processobjekter som har handlecount større enn 400, formaterer vi dette som en liste før vi skriver ut (format-list).

Tips:

Når man benytter where kan man også sette sammen flere uttrykk:

-and Logisk and

-or Logisk or

-bor Bitwise or

-band Bitwise and

-xor XOR operator

For å se en liste over alle egenskapene processene har som vi kan jobbe med, kjør følgende kommando:

get-process | get-member -membertype property

I lista vil du nå finnes egenskapen responding, som er satt til en boolsk egenskap. Vi kan nå liste ut alle prosesser som ikke svarer (not responding) med følgende kommando:

Get-process | where { $_.responding –eq 0 } | format-list

Merk at overstående kommando mest sannsynlig ikke returnerer noen treff i din test – den returnerer kun applikasjoner som henger!

Eller alle prosesser som svarer:

Get-process | where { $_.responding –eq 1 } | format-list

Vi kan også endre formateringen, og bestemme hvilke felt som skal være med I utdata på følgende mate:

get-process | where { $_.responding -eq 1 } | format-table ProcessName,Id,Responding

Vi kan også bygge videre på et tidligere eksempel hvor vi lister ut filer, og ønsker å formatere resultatet av dir kommandoen (en linje) :

Dir –exclude *.old,*.bak,*.tmp –recurse | select-object FullName,Length,LastWriteTime | format-table –auto

Denne kommandoen lister ut alle filer i mappen vi står i, samt undermapper. Den tar ikke med filer med endelsen old, bak eller tmp. For hver av filene skriver den ut fullt navn, størrelsen, og siste gang den ble skrevet til. Dette formateres i en tabell.

Format-Table skal vi se nærmere på seinere også ,men den har også mulighet for å bestemme hvilke felt som skal vises eller ikke. Fordelen med å bruke Select-Object er at vi kan sende utdataene andre steder enn til skjermen (for eksempel til fil) og kun få med de utvalgte feltene.

Hjelpesystemet

PowerShell har et kraftig hjelpesystem, som baseres på kommandoen get-help og get-pagedhelp. Det er også opprettet alias som help og man for Get-PagedHelp.

For å lage deg en oversikt over hvilke hjelpefiler som er tilgjengelig kan du kjøre kommandoen help *_*

Help *_*

Disse hjelpefilene begynner med about_ og omhandler emner du kan slå opp i hjelpesystemet.

Wildcards er også støttet i oppslagene, for eksempel kan du slå opp hjelp for logiske operatører med følgende kommando:

[56] Get-help about_logi*

Du kan hente fullstendig hjelp ved å benytte parameteren –full

Get-help new-item –full

De fleste av oss leter etter eksempler når vi prøver å benytte en kommando. Du kan hente kun eksemplene på følgende måte:

Get-help new-item -examples

Guide/Powershell

Kom igang guide for Powershell

Posted by ragnar harper on

Jeg har lenge tenkt å publisere en del artikler jeg har skrevet om bruk av Powershell. Nå har jeg endelig startet på denne serien om hvordan du kommer igang med Powershell. Jeg vet ikke hvor mange artikler det blir ennå, men jeg har tenkt å ta alle igjennom det mest grunnleggende.

Oppstart av PowerShell

Du kan starte Powershell kommandolinjen fra Start-menyen eller fra Kjør ved å taste inn ”powershell” som vist i figuren. Med Powershell 2.0 kommer det to varianter av Powershell konsoll fra Microsoft. Det ene konsollet er som en tradisjonell kommandolinje. Den andre er som en moderne kommandolinje bygd som ett grafisk verktøy. Vi starter her med å se på den tradisjonelle kommandolinjen:

image

Alternativt kan du starte PowerShell fra startmenyen.

image

Når PowerShell starter opp er det flere ting som skjer. Dette skal vi se på nærmere ganske snart, men kort fortalt lastes det inn en profil som setter arbeidsmiljøet. I denne kan det for eksempel lastes inn utvidelser, som gjør at PowerShell støtter flere kommandoer enn det som er med standard.

Slik ser Windows Powershell ut når jeg starter det på min maskin.

image

Om du ønsker å starte den “moderne” varianten av en kommandolinje, skal du se etter Powershell ISE. Om jeg i min Windows 7 klient skriver Powershell i søkefeltet på Start-menyen får jeg opp følgende varianter:

image

Du starter Powershell ISE ved å trykke på image

ISE står for Integreted Scripting Environment, og ser slik ut

image

Du kan velge og benytte den som passer deg best for kommandoene som følger.

For at kommandolinja skal føles så ”kjent” som mulig er det definert en god del aliaser som gir tilnærmet funksjonaliet med det vi er vant med fra blant annet cmd.exe. Vi kan også selv sette opp aliaser hvis vi ønsker. Ett enkelt eksempel er kommandoen dir

dir

image

Med PowerShell startet Microsoft med blanke ark. En av de grunnleggende viktige tingene de avgjorde var at kommandoer skal ha gjenkjennelig syntaks. I dette ligger det at alle kommandoer skal følge en fast struktur. I praksis betyr dette at alle kommandoer ha følgende format :

verb-substantiv . Som du allerede har erfart bryter kommandoen dir med dette mønsteret. Men dir er altså ett alias for Get-ChildItem.

Du kan teste dette ved å skrive kommandoen Get-ChildItem

Get-Childitem
image 

Merk at du kan bruke TAB til å automatisk fullføre det du skriver på. Skriver du Get- og trykker TAB, blar du deg gjennom mulighetene som starter med Get-.

For å skaffe deg en oversikt over kommandoene som er tilgjengelig kan du kjøre kommandoen Get-Command.

Get-Command

image

Legg merke til at Get-Command viser alle ulike typer for kommandoer du har tilgjenglig. Om du kun ønsker å se rene Powershell CmdLet’s gjør du dette ved å bruke parameteren CommandType på følgende måte:

Get-Command -CommandType CmdLet

image

En nyttig kommando er Start-Transcript. Denne kommandoen fanger opp kommandoene du kjører, samt resultatet av kommandoen. Det blir en tekstfil, med komplett logg, slik at du kan gå tilbake senere.

image

Tips: Det finnes også andre varianter av Powershell kommandolinjen enn den som Microsoft tilbyr. Tredjeparts miljø er for eksempel Powershell+ og PowerGUI. PowerShell+ er et avansert kommandolinje basert Powershell miljø, mens PowerGUI er et grafisk grensesnitt for Powershell. Du kan se nærmere på PowerGUI på www.powergui.com og Powershell+ finner du på www.idera.com

Navigering i PowerShell

Du navigerer i PowerShell med kommandoen Set-Location. Etter som at du er vant til å benytte cd i cmd.exe, er cd opprettet som alias for Set-Location.

En av de tingene som er kjekt å huske til å begynne med er at cd.. eller cd\ gir feil i standard PowerShell. Du må ha med mellomrom mellom kommandoen og parameteren. Du må altså skrive cd .. eller cd \ .  Du opplever dog ikke dette mange steder på grunn av at det er definert funksjoner som heter cd.. og cd\ som utfører operasjonen for deg.

PowerShell skiller seg også fra tidligere kommandolinje med at den inneholder providere til ulike systemer. Med dette mener jeg at du ikke er begrenset til filsystemet, men at du også kan navigiere inn i registry, sertifikat store, Active Directory med flere. Støtte for flere systemer kan enkelt legges til. Benytt kommandoen Get-PSDrive for å se hvilke PowerShell ”stasjoner” du har tilgjengelig.

Get-PSDrive

image

Om du titter på listen over ser du navnet (Name) på stasjonen (dette er navnet du navigerer med). To andre viktige ting du ser er Provider og Root. Provider sier hvilken type stasjon dette er. Root sier lokasjonen til denne stasjonen.

La oss nå navigere inn i registry på maskinen. Hvis du ønsker å navigere inn i HKEY_CURRENT_USER, kan du skrive cd hkcu:

cd hkcu:

Dette er det samme som å skrive:

Set-Location hkcu:

Naturligvis kan du da kjøre kommandoer der også, for eksempel dir.

dir hkcu:

image

Dir (som altså er et alias for Get-ChildItem) har mange nyttige parametre vi kan benytte, for eksempel:

-Path forteller oss banen(mappen) vi ønsker å liste ut. Aksepterer jokertegn, og kan brukes om flere baner(mapper) samtidig.

-Filter lar datakilden (provider) filtrere dataene før den sendes tilbake til Powershell

-Exclude lar oss eksludere filer fra listen. Aksepterer jokertegn.

-Include lar oss spesifiere hvilke filer som skal inkluderes. Aksepterer jokertegn.

-Force viser også skjulte elementer – elementer man ikke ser ellers.

-Recurse tar også med underliggende baner (mapper).

Følgende eksempel lister ut alle filer, untatt de med filendelsen old, bak eller tmp. Lister også ut filer i underliggende mapper:

Dir –exclude *.old,*.bak,*.tmp -recurse

Grunnleggende CmdLets

La oss ta en titt på de mest grunnleggende CmdLets du må kunne. Vi har allerede hilst på noen, blant annet Set-Location (og aliaset cd) samt Get-ChildItems (og aliaset dir).

Tabell 1 – Grunnleggende CmdLets

Kommando

Beskrivelse

Get-ChildItem

Lister ut objekter som finnes i filsystemet, registry eller andre steder. Har aliaset dir

Set-Location

Brukes for å endre aktivt sted i PowerShell. Dette kan være katalog eller system. Har aliaset cd

Set-Alias

Opprette alias for annen kommando

Set-Date

Endre dato på hostmaskina

Restart-Service

Benyttes for å restarte en service [restart-service Wsearch]

Start-Service

Benyttes for å starte en service [start-service Wsearch]

Stop-Service

Benyttes for å stoppe en service [stop-service Wsearch]

Get-Service

Lister ut services [get-service]

Set-ExecutionPolicy

Setter sikkerhetsmoduen til script – om de kan kjøres, om de må være signerte og lignende

Set-Acl

Benyttes for å sette rettigheter

Add-Content

Legge til noe i ei fil eller objekt, [add-content –path filnavn –value ”Dette er gøy”]

Get-Content

Vise innholdet av ei fil eller objekt, [get-content filnavn]

Clear-Content

Fjerner innholdet, men beholder fila eller objektet [clear-content filnavn]

Compare-Object

Sammenligner innhold.

[Compare-Object -referenceobject $(get-content filA) -differenceobject $(get-content filB) –includeequal]

New-Item

Opprette nye elementer, slik som for eksempel filer og registrynøkler

Start-Sleep

Får scriptet eller Shellet til å sove i angitte tidsperiode (sekunder)

Bruk av parametre

Du påvirker hva en CmdLet skal utføre ved å benytte parametre. Parametre angis med .

Eksempel for å opprette ei fil:

New-Item –type file ”filnavn.txt”

Her angir vi parameteren type med –type og oppgir verdien file og gir inn filnavnet. Disse benytter vi mellomrom på. Hvis vi angir parameternavn med- , spiller ikke rekkefølgen på parametrene noen rolle. Noen parametre er angitt som default, og kan benyttes uten å oppgis med navn.

La oss se på New-Item kommandoen for å opprette mapper:

New-Item –type directory “c:\logs”
New-Item –type directory “c:\temp”
New-Item –type directory “c:\temp\1\2\3\4”

Som du ser i det siste eksemplet opprettes alle mapper som eventuellt mangler for å opprette den mappa du ønsker. I vårt tilfelle betyr det at 1,2,3 og 4 opprettes i samme operasjon.

De flere cmdlets støtter også et utvalgt parametre som kalles for ubiquitous parameters. Disse er som følger:

 -debug angir at vi ønsker å få debuginformasjon hvis utvikleren har lagt det inn i kommandoen.

 -erroraction angir hvordan vi ønsker cmdlet’en skal oppføre seg ved feil. Valgene er NotifyContinue (standardvalget), NotifyStop, SilentContinue,SilentStop og Inquire

 -errorvariable angir navn på variabel som vil inneholde alle objektene som fikk feil under prosessering.

 -outvariable angir navnet på variabel som holder alle objektene i resultatet fra cmdlet.

 -verbose produserer mer informasjon rundt de handleringer cmdlet utfører, samt informasjon rundt fremdrift av prosessering.

Opprette egne alias

Du kan opprette egne alias med kommandoen Set-Alias. I gjeldende versjon av PowerShell kan du ikke sette parametre som en del av et alias. Du kan altså ikke lage et alias for kommandoen Set-Location C: , kun for Set-Location. Det er antydet fra PowerShell utviklerne at denne funksjonaliteten vil komme senere. Hvis du lurer på hvilken kommando et alias peker på, kan du lese av dette med Get-Alias.

Eksemplet lager aliaset go for kommandoen Set-Location.

set-alias go Set-Location

Nå vil go fungere likt som cd eller Set-Location. Hvis jeg lurer på hvilken kommando go er et alias for, kan jeg lese av dette med get-alias go:

get-alias go