Windows Powershell – The Basics 1
Windows Powershell is sinds Windows XP SP2 Microsoft’s scriptingtaal. Powershell is een “task automation and configuration management framework”. welke bestaat uit een “command-line” en bijbehorende scriptingtaal. Er zijn al heel wat boeken geschreven over Powershell en de meeste mensen die ik spreek vinden Microsoft Powershell moeilijk te begrijpen en lastig te leren. Commando’s zijn lang en lijken minder structuur te bevatten dan andere scriptingtalen zoals MS-DOS, Python, en C++. Speciaal voor iedereen die Powershell iets beter wilt begrijpen schrijf ik deze nieuwe serie posts “Windows Powershell – The Basics” waarvan dit deel 1 is. Enjoy!
Windows Powershell bestaat dus al een tijdje, maar is in deze periode ook erg vaak geüpgrade. Windows Powershell is niet alleen de opvolger van MS-DOS maar Microsoft wilde ook graag een shell naar hun OS brengen die net zo krachtig was als de Shell systemen van o.a. Linux. De ontwikkelaar van Powershell, Jeffrey Snover is namelijk een groot bash fan.
Microsoft bedacht hiervoor het Monad project en dit project is uitgegroeid tot Windows Powershell. Ondertussen zitten we op versie 6 maar ook versie 7 komt er alweer aan. Powershell is gebaseerd op .NET Framework and .NET Core (Windows componenten dus). In februari 2015 kondigde Microsoft aan dat de CORE CLR (Common Language Runtime) open-source was geworden en beschikbaar was voor Linux. Op 18 augustus 2016 is Powershell volledig open-source geworden en draait op MAC en Linux systemen (Debian and Ubuntu). Het grote voordeel hiervan is dat onze Powershell scripts zo herschreven kunnen worden dat ze op zowel Windows als op Linux of MacOS werken. Powershell gebruikt namelijk al Linux aliassen waardoor powershell met een beetje Bash kennis al veel herkenbaarder overkomen. Let wel, Linux systemen hebben andere architecturen dan Linux systemen. Zo beschikt Linux niet over Internet Explorer en WMI of CIM. Niet alles is dus automatisch en makkelijk over te dragen van systeem naar systeem. Powershell op Linux zorgt er wel voor dat zeer bekwame Windows Powershell programmeurs nu ook aan de slag kunnen met Linux en hier mooie dingen voor de community kunnen betekenen. Andersom kan men met Bash voor Windows ook aan de slag. Welke shell er uiteindelijk gaat winnen is nog onduidelijk. Beide systemen zijn mooi en goed doordacht. Voor mij persoonlijk is Bash de scripting engine naar keuze maar Powershell is in sommige gevallen wel overzichtelijker.
Powershell soorten en versies
Wie op zijn PC naar Powershell zoekt vindt diverse versie van Powershell. Deze soorten zijn er:
- Windows Powershell
Windows Powershell Command Line Shell (op x64 systemen is deze 64-bit en op x32 systemen is deze 32 bit). - Windows Powershell ISE / Windows PowerShell Integrated Scripting Environment
Powershell ISE is een host applicatie voor Windows Powershell. In Powershell ISE kun je commando’s uitvoeren en scripts schrijven, testen en debuggen. Powershell ISE is een Windows based grafische GUI met multiline-editing, tabbladen en syntax kleur codering. Powershell ISE geeft ook de mogelijkheid om gebruik te maken van menu-items en sneltoetsen om veel repeterende taken uit te voeren. Windows Powershell ISE is een krachtige lichtgewicht editor. Om meer professionele functies toe te voegen aan Powershell ISE kun je overwegen om ISESteroids te installeren. Hiermee wordt je editor nog krachtiger met veel extra functies. Uiteraard kun je ook andere Editors zoals Sublime en Notepad++ gebruiken om Powershell te schrijven. Powershell ISE is echter een prachtige editor om mee te beginnen. Windows Powershell ISE is op x64 systemen de 64-bits variant en op x32 systemen is deze 32 bits. - Windows Powershell (x86)
Windows Powershell (x86) komt alleen voor op x64 systemen en is de x32 variant van Windows Powershell. De core functionaliteiten van Powershell x64 en x32 zijn grotendeels gelijk. Mocht je echter gebruik maken van Powershell Snap-ins (gecompileerde CMDlets) dan moet je er goed op letten welke snap-in versie je gebruikt. 64 Bits snap-ins zullen niet werken om x32 bit Powershell versies. Voor deze snap-ins moet dus de x86 versie van Powershell gebruikt worden. - Windows Powershell ISE (x86) / Windows PowerShell Integrated Scripting Environment (x86)
Windows Powershell ISE (x86) komt alleen voor op x64 systemen en is de x32 variant van Windows Powershell ISE. Deze variant bestaat om dezelfde redenen als dat de Windows Powershell (x86) aanwezig is op x64 systemen.
Daarnaast heb je nog te maken met diverse versies van Powershell. Om te kijken van welke versie je zelf gebruik maakt kun je het volgende commando uitvoeren:
$PSVersionTable |
Verschillende van deze versies zijn compatible met elkaar. De gouden regel die hier van toepassing is dat PS (afkorting voor Powershell) script (ofwel CMDLED)geschreven op een nieuwere versie van Powershell (gebruik makend van nieuwe Powershell functies) nooit werken op oudere versies van Powershell. Oude scripts werken vaak wel op nieuwere Powershell varianten. Deze versies zijn compatible met elkaar:
- Powershell v5 – default op Windows 10 en server 2016 – backwards compatible met v4
- Powershell v4 – default op Windows 8.1 & server 2012 R2 – backwards compatible met v3 en v2
- Powershell v3 – default op Windows 8 & server 2012 – backwards compatible met v2
- Powershell v2 – default op Windows 7 & server 2008 R2
- Powershell v1 – default op Windows server 2008
Powershell v2 is beschikbaar in alle Windows varianten v.a. Windows 7 en server 2008 R2. Om er zeker van te zijn dat je script werkt op elke versie van Windows (en dus feitelijk een Powershell v2 script is) switch dan naar de Powershell v2 command-line door Powershell te starten met het volgende commando:
PowerShell.exe -Version 2 |
Let op, dit werkt alleen als het .NET Framework 2.0 is geïnstalleerd. Zo niet dan zal Powershell een error retourneren.
Om scripts en commando’s te testen in Powershell ISE welke compatable zijn met Powershell v2 gebruik je het volgende commando in ISE:
PowerShell -Version 2 Get-Process –IncludeUserName |
Voor we starten met Powershell
Voor dat we echt gaan starten met de Powershell code zijn er nog een aantal zaken die je moet weten. Powershell kent o.a. de volgende bestandsformaten:
- PS1 – Windows PowerShell Script
- PSD1 – Windows PowerShell data file (Versie 2)
- PSM1 – Windows PowerShell module file (Versie 2)
- PS1XML – Windows PowerShell format en type definitions
- CLIXML – Windows PowerShell serialized data
- PSC1 – Windows PowerShell console file
- PSSC – Windows PowerShell Session Configuration file
De extensie die je het meeste zult zien zijn de PS1 extensies ofwel de feitelijke Powershell scripts.
Windows PowerShell hanteert net als Linux Bash het concept van een “piping” (|), waarmee de uitvoer van een commando de invoer wordt voor een andere commando. Door gebruik te maken van Powershell Pipelines kunnen complexte commando’s worden uitgevoerd.
Daarnaast werk Powershell met 4 verschillende profielen. Powershell profielen kunnen specifieke instellingen bevatten en speciale functies en variabelen die meteen starten tijdens het starten van het profiel. Indien geen profiel gedefinieerd is kun je ervan uitgaan dat je werkt onder het “Current User, Current Host” profiel. Uiteraard kun je zelf profielen aanmaken (in essentie zijn het simpele Powershell scripts). Je huidige profiel bekijk je middels het commando:
$Profile |
Om de paden van alle profiel scripts te tonen pipe je $profiel naar de cmdlet Select-Object met de parameter -Property *:
$Profile | Select-Object –Property * |
De 4 Default profielen zijn:
- AllUsersAllHosts
- AllUsersCurrentHost
- CurrentUserAllHosts
- CurrentUserCurrentHost
ISE gebruikt ook nog 2 profielen, namelijk:
- AllUsersCurrentHostISE
- CurrentUserCurrentHostISE
Om een nieuw profiel te maken of om sowieso een Powershell script uit te voeren kan het zijn dat de Powershell Execution Policy aangepast moet worden. Deze policy kent 4 instellingen:
- Restricted (default) – Geen scripts kunnen draaien
- AllSigned – Alleen scripts ondertekend (signed) door vertrouwde publishers kunnen draaien
- RemoteSigned – Alleen gedownloade scripts moeten ondertekend zijn door een vertrouwde publisher om te kunnen draaien
- Unrestricted – Alle Powershell scripts kunnen draaien
Mocht je de policy willen aanpassen naar b.v. “RemoteSigned” gebruik je daarvoor het commando:
Set-ExecutionPolicy RemoteSigned |
Mocht je tijdens het werken geblokkeerd worden om bepaalde functies uit te voeren dan heeft dat er waarschijnlijk mee te maken dat PowerShell niet is gestart als Administrator. Wanneer je Powershell uitvoert als Administrator dan heb je volledige toegang en dus ook de meeste kans om zaken definitief om zeep te helpen Be carefull. Powershell uitvoeren als administrator doe je door rechts te klikken op het Powershell icoon en in de dropout te kiezen voor “Uitvoeren als Administrator”. Ook kun je Powershell als Administrator starten met het commando:
Start-Process powershell -Verb runAs |
Zoals je misschien al gezien hebt vallen er nog meer dingen op aan Powershell commando’s. Ze zijn laaaaaang en er zitten hoofdletters in. De hoofdletters zijn over het algemeen om de commando’s zo duidelijk mogelijk weer te geven. Powershell zelf is niet hoofdlettergevoelig. Echter kunnen sommige zaken die middels Powershell aangesproken worden wel hoofdlettergevoelig zijn zoals LDAP en ADSI. Wanneer deze onderdelen aangesproken worden moet dus wel rekening gehouden worden met de hoofdletters. De lengte van de commando’s is eveneens voor duidelijkheid. Door het lezen van een Powershell commando weet je eigenlijk al exact wat het commando gaat doen. En daarnaast kun je de TAB toets gebruiken om commando’s af te maken. Typ de eerste letters en maak het commando af door herhaaldelijk op de TAB toets te klikken. Weer zo’n functie die mooi afgekeken is vanuit Bash.
En dat is niet het enige dat afgekeken is uit Linux. Diverse Linux commando’s kunnen rechtstreeks ik Powershell gebruikt worden. Denk b.v. eens aan de volgende:
- ls – Opvragen directoryinhoud
- mv – Verplaatsen en hernoemen van bestanden
- cp – Bestanden kopieren
- pwd – Huidige directory bekijken
- rm – Bestanden verwijderen
- cat – Tekstbestanden bekijken
Er zijn er echter nog veel meer zoals ps, diff en kill.
Het laatste commando welke ik aan wil halen is het hulp commando. Algemene hulp wordt geboden door simpelweg het “Get-Help” commando te gebruiken. Specifieke hulp wordt geboden door het “Get-Help” commando gevolgd door het commando waar je meer informatie over wilt. Meer hulp over b.v. het “ls” commando ziet er dan als volgt uit:
Get-Help ls |
De volledige help documentatie is te raadplegen middels de toevoeging “full”:
Get-Help ls -full |
Alle beschikbare parameters kunnen bekeken worden middels de toevoeging “-parameter”:
Get-Help ls –parameter * |
Tot zover het einde van deze Powershell intro. Nu ben je klaar om wat dieper in Powershell te duiken en dat gaan we dan ook gezellig samen doen in de volgende post!