Category Archives

2 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.

Powershell/remoting

Remoting med Powershell 2.0

Posted by ragnar harper on

Med remoting kan du utføre kommandoer på andre maskiner enn du sitter på. Du kan med andre ord utføre kommandoer på andre maskiner, og få resultatet overført til din egen maskin. Resultatet vil som vanlig være objekter. Remoting er en universell teknologi i Powershell som ikke setter bestemte krav til hver enkelt CmdLet. Det finnes Cmdlets i Powershell som benytter Microsoft .NET Framework metoder for å innhente informasjon fra andre maskiner enn du sitter på. Disse cmdlets benytter ikke remoting, og kan fortsatt benyttes uten at man setter opp remoting. Eksempel på disse cmdlets er Get-Service,Get-Process,Get-WmiObject, Get-EventLog og Get-WinEvent.

Oppsett av Remoting

For å benytte remoting med Powershell 2.0 kreves følgende:

· Windows Powershell 2.0 eller nyere

· Microsoft .NET Framework 2.0 eller nyere

· Windows Remote Management 2.0

Windows 7 og Windows Server 2008 R2 kommer med Powershell 2.0. Du kan sjekke dette med

$PSVersionTable.Version.Major

Windows 7 og Windows Server 2008 R2 kommer også med Windows Remote Management 2.0. Windows Remote Management kan også installeres separat på Windows XP samt Windows Server 2003 og nyere.

Krav til brukerrettigheter

For å etablere en fjerntilkobling og eksekvere kommandoer må brukeren være medlem av den lokale administrator gruppa på maskinen det kobles til. Eventuellt må brukeren kunne oppgi brukernavn og passord på en bruker som er medlem i administrator gruppa på maskina.

Når kreves det administrator rettigheter (Run As Administrator)?

Kjører du Windows Vista , Windows Server 2008 eller nyere må du starte Powershell som administrator for å utføre følgende oppgaver knyttet til remoting:

· Etablere fjerntilkobling til lokal maskin (loopback scenario)

· Gjøre konfigurasjonsendringer på remoting

· Se eller endre WS-Management innstillinger på lokal maskin. (egenskaper under WSMAN:)

Konfigurering av maskinen for remoting

Remoting er basert på WinRM tjenesten som er Microsoft sin implementering av WS-Management

(Web Services for Management).

Prosedyre for å aktivere remoting:

· Start Powershell med administrator rettigheter (Run As Administrator)

· Kjør følgende commando:

Enable-psremoting

clip_image002

Etter å ha kjørt enable-psremoting kan du sjekke om miljøet fungerer lokalt gjennom bruk av kommandoen new-pssession

clip_image004

New-PsSession cmdlet etablerer en egen remote tilkobling til lokal maskin. (loopback).

Problemer?

Merk at nettverkstilkoblingen må være av typen Work eller Home for at brannmuren skal tillate Remoting forespørsler. Hvis nettverkstilkoblingen har status Public vil remoting være blokkert i brannmuren.

Bruk av Invoke-Command

Vi kan bruke Invoke-Command til å utføre ad-hoc Powershell kommandoer mot en eller flere maskiner.

MERK! I eksemplet under benytter vi . (dot) til å angi lokal maskin.

Invoke-Command –ComputerName . -ScriptBlock {get-process}
Invoke-command -computername maskin1,maskin2, maskin3 -Scriptblock {get-process}

Vi kan også angi script som skal kjøres ved bruk av Invoke-Command cmdlet gjennom parameteren –FilePath :

Invoke-Command –ComputerName maskin1,maskin2,maskin3 –FilePath c:\scripts\report-usage.ps1

Bruk av PSSession

I eksemplene over så kjører du kommandoene uten å ta vare på kontekst. Med dette mener jeg at du ikke kan kjøre en serie med kommandoer som deler data, slik som funksjoner, alias eller variabler mellom kallene. Om du ønsker å ta vare på kontekst oppretter du en PSSession (Poweshell session). Denne gir deg en sesjon som kjører på maskinen, slik at data kan ivaretas mellom kallene.

Følgende eksempel illustrerer dette:

clip_image005

Legg merke til at linje 13 og 14 benytter en PSSession $s til å ivareta kontekst mellom kallene. Derfor fungerer det å sette $a lik 3, for så å lese ut verdien.

I linje 15 og 16 benyttes ikke sesjon. Det betyr at variabelen $a forsvinner etter at den er satt i linje 15, og den har derfor ingen verdi å returnere når jeg leser den i linje 16.