Als je veel met beheer van Microsoft-systemen te maken hebt of krijgt is het meer dan raadzaam je te verdiepen in deze scripttaal. In de (nabije) toekomst zal PowerShell meer en meer gebruikt worden. In veel Microsoft-producten is PowerShell naadloos verweven. Opties die je in de grafi sche interface kiest worden op de achtergrond door PowerShell-commando’s uitgevoerd. Om taken makkelijker en sneller te kunnen herhalen, loont het de moeite hiervoor een PowerShell-script te schrijven.
1 Wat is PowerShell?
Microsoft Windows PowerShell is een object-georiënteerde scripttaal die gebaseerd is op commando’s, de zogenaamde cmdlets. Deze naam is speciaal door Microsoft bedacht en daardoor uniek, zodat het zoeken ernaar via een zoekmachine op internet ook makkelijk gaat. Doel is dat de beheerder zijn/haar taken makkelijker, beter en sneller kan uitvoeren. De leercurve is niet zo steil en daardoor bijvoorbeeld makkelijker te leren dan Visual Basic. PowerShell kan werken met Windows-besturingssystemen vanaf Windows XP en daarnaast ook met diverse andere Microsoft-producten zoals Exchange, System Centre Operations Manager en System Center Virtual Machine Manager. Sterker nog, met het kiezen van diverse opties in de GUI (graphical user interface) wordt op de achtergrond een PowerShell-script opgebouwd en uitgevoerd. Er zijn al verschillende versies van PowerShell de afgelopen jaren voorbijgekomen, waarvan hieronder een kort overzicht.
Versie 1.0 Uitgebracht in 2006 en beschikbaar voor de volgende Windowsversies: Windows XP SP2, Windows Server 2003, Windows Vista, Windows Server 2008.
Versie 2.0 Beschikbaar voor de volgende Windows-versies: Windows XP SP3, Windows Server 2003 SP2, Windows Vista SP 1, Windows 7 en Windows Server 2008 R2.
Versie 3.0 Beschikbaar voor de volgende Windows-versies: Windows 7 SP1, Windows Server 2008 SP1, Windows Server 2008 R2 SP1, Windows 8 en Windows Server 2012.
Versie 4.0 Beschikbaar voor de volgende Windows-versies: Windows 8.1 en Windows Server 2012 R2.
Versie 5.0 Beschikbaar voor de volgende Windows-versies: Windows 8.1, Windows 10, Windows Server 2012 R2 en Windows server 2016.
2 Basisnetwerk
Dit boek starten we met een basisnetwerk en basisconfiguratie. De situatie zie je hieronder weergegeven. We maken in deel 1 gebruik van één Domain Controller in het domein mediatech.lan.
In deel 1 worden de volgede hosts gebruikt:
Naam
Server 1
IP-Adres
172.16.x.1
DNS-server
172.16.x.10
OS
Windows Server 2019
Services
ADDS, DNS
Naam
Router 1
WAN
Automatisch
LAN
172.16.x.1
Subnet
255.255.255.0
Opdracht 1
Om de opdrachten te kunnen maken en testen heb je een labomgeving nodig. Deze bestaat uit een domain controller met Windows Server 2019 . Maak een virtuele machine met Windows Server 2019 als besturingssysteem. Je mag zelf kiezen of je de server als router of een andere router gebruikt. Zorg ervoor dat beide VM’s up-to-date zijn als je met de PowerShell-opdrachten begint.
De PowerShell omgeving
Binnen Windows heb je twee omgevingen waarbinnen je direct kunt werken met PowerShell-commando’s:
Windows PowerShell
Windows PowerShell ISE (Integrated Scripting Environment)
Windows PowerShell
Afb. 1 De klassieke Powershell omgeving zonder al te veel hulpmiddelen
TIP Soms staat de breedte van het venster anders ingesteld dan je monitor of je VM toelaat. Je ziet dan een horizontale schuifbalk, wat niet praktisch is tijdens het schrijven van commando’s. Om dit te veranderen kun je in de eigenschappen van het venster, in het tabblad Layout, de waarde van de screenbuff er size gelijk maken aan de waarde van de Window Size. Overigens zijn er nog veel meer instelmogelijkheden in de eigenschappen te vinden die erg handig kunnen zijn.
Je ziet in het PS-venster eigenlijk niets anders dan wat gegevens en de prompt. Het verschil met een normale command prompt zie je nu niet alleen aan de kleur, maar ook aan de letters PS voor de prompt.
Overigens kun je door het commando cmd te typen ook gewoon naar de command prompt en heb je nog steeds dezelfde achtergrondkleur, maar kun je op dat moment geen PS-commando’s meer uitvoeren. Met het commando exit keer je weer terug naar PowerShell.
Afb. 2 Met het commando cmd verschijnt de command prompt
Windows PowerShell ISE
Er is ook een uitvoering van PowerShell die de toevoeging ISE heeft, wat staat voor Integrated Scripting Environment.
Afb. 3 Windows PowerShell ISE
TIP Eenregelige commando’s kun je direct typen in het commandovenster (blauwe achtergrond). Scripts bestaan vaak uit meerdere regels. Die typ je in het venster met de witte achtergrond. Met een Enter ga je naar de volgende regel om de volgende instructie te typen. Met de afspeelknop (groene driehoekje) voer je het script uit. Dat zie je dan ook gebeuren in het commandovenster.
De ISE-uitvoering kent een aantal handigheidjes waaronder:
gebruik van standaard toetsenbord-snelkoppelingen (CTRL+a = alles selecteren; CTRL+c/CTRL+v = kopiëren/plakken);
door middel van tabs aan meerdere sessies en scripts tegelijk kunnen werken;
handige zoek- en hulpmiddelen;
ingebouwde IntelliSense: tijdens het typen worden suggesties getoond.
Afb. 4 Met de hulp van IntelliSense wordt het allemaal nog makkelijker
In dit boek zullen we voornamelijk de ISE-shell gebruiken. Voor beide uitvoeringen geldt wel dat je een aantal zaken goed moet controleren:
Versienummer: deze moet minimaal versie 5.0 zijn. Controleer dit om problemen te voorkomen met het commando $PSVersionTable. ( Je kunt ook Get-Host of $host.version gebruiken. Deze geven een iets andere output waar de versie ook te vinden is)
Afb. 5 Controleer het versienummer van PowerShell
Het is aan te raden om PS als administrator uit te voeren om beheerswerkzaamheden makkelijker te maken. Dit is te zien in de menubalk. Mocht hier geen Administrator staan, dan moet je PS afsluiten en met een rechtermuisklik kiezen voor de optie Run as Administrator.
De syntax
Zoals in elke scripttaal heeft ook PS een zogenaamde syntax, met andere woorden: de manier waarop een commando in elkaar steekt, waaronder de volgorde. Als voorbeeld het volgende commando:
Om alle mogelijke werkwoorden te zien kun je het commando Get-Verb gebruiken. Niet alle mogelijkheden zijn werkwoorden. Zo zie je ook New staan, dit had wellicht beter Create kunnen zijn.
Afb. 1 Met Get-Verb eenvoudig cmdlets zoeken
TIP Het aantal mogelijkheden in commando’s, parameters en opties is afhankelijk van de installatie van het besturingssysteem. Naarmate er meer rollen of features geïnstalleerd zijn, neemt het aantal mogelijkheden in PowerShell ook toe.
Vervolgens wordt het werkwoord altijd gevolgd door een afbreekstreepje/divisie (-), waarna een zelfstandig naamwoord volgt. In bovenstaand voorbeeld: ChildItem.
Vervolgens komen de parameters (opties) met daarachter de value (waarde). In het voorbeeld staan er drie: -path met daarachter de value (waarde) C:\Windows\System32 -Filter met daarachter de value (waarde) *.exe -Recurse met daarachter geen value (waarde).
Het totale commando betekent dus: laat alle bestanden (Get-ChildItem) zien in de folder C:\Windows\ System32 (-Path) die elke naam mogen hebben (*) maar moeten eindigen met de extensie .exe en daarvoor moet je ook zoeken in de submappen onder System32 (-Recurse)
De * wordt hier gebruikt als een wildcard en kan vervangen worden door alle tekens.
*.txt betekent dus zoiets als: er mag van alles voor de punt staan, maar het moet wel eindigen op .txt. Hier kun je uiteraard handig gebruik van maken. Hieronder nog enkele voorbeelden:
verslag*.docx alle bestanden die beginnen met het woord verslag en eindigen met de extensie .docx
Help Get-Proc* geeft in PS alle commando’s weer die beginnen met Get-Proc zoals Get-Process, maar bijvoorbeeld ook Get-ProcessMitigation
Een tweede wildcard die je kunt gebruiken is het vraagteken (?). Hiermee kun je net als het * werken, met de uitzondering dat een vraagteken maar voor één teken staat. Voorbeelden:
Verslag?.docx geeft wel verslag1.docx en verslagB.docx, maar niet verslag23.docx
Verslag??.docx geeft wel verslag23.docx maar niet verslag_conferentie.docx
Beide wildcards kun je dan ook nog een combineren
Verslag?.*
*Verslag*.txt
*Verslag*.doc?
Afb. 2 Gebruikmaken van wildcards maakt het zoeken eenvoudiger
Opdracht 1
Controleer de versie van PowerShell
Update de help file van PowerShell
Opdracht 2
Maak gebruik van Get-ChildItem. Met welk commando kun je onderstaande opdrachten bereiken? Noteer de gevonden en geteste commando's in je documentatie.
Laat alle tekstbestanden (extensie: txt) zien uit de Windows-folder en de subfolders.
Laat alle tekstbestanden zien waar het woord 'help' voorkomt in de naam uit de Windows-folder en de subfolders.
Laat alle bestanden zien waar het woord 'printer' in voorkomt. De extensie mag maximaal 3 karakters bevatten.
Laat alle bestanden zien die beginnen met het woord 'printer'. De extensie is 'dll'.
De helpfunctie
PowerShell heeft een ingebouwde helpfunctie. Standaard hoeft deze nog niet of niet volledig aanwezig te zijn. In de loop van de tijd wijzigen elementen of worden er fouten uit de helpfunctie gehaald die door middel van de update gecorrigeerd worden in de helpfile. Gelukkig kun je PowerShell Help via internet gemakkelijk downloaden en updaten.
Door in de shell het commando Update-Help te typen wordt de laatste content van internet gehaald.
Afb. 1 Afhankelijk van de aanwezige componenten wordt PowerShell geüpdatet
Aangezien iedere Windows-installatie uniek is en modules/rollen wel of niet geïnstalleerd zijn wordt er meer of minder geüpdatet.
Met het commando Get-Help krijg je meer informatie over het commando waarin je interesse hebt. Het commando kan in dit geval dus zijn:
Get-Help Update-Help -Full
Met de parameter -Full krijg je veel meer informatie, waaronder voorbeelden. Het is dus handig om die parameter altijd te gebruiken.
TIP Als je de uitleg bij de hand wilt houden kun je gebruikmaken van de parameter -ShowWindow (bijvoorbeeld: Get-Help Get-ChildItem -ShowWindow). De help wordt dan in een apart Windows-venster getoond, dat je voor het gemak erbij kunt houden als je jouw commando aan het opbouwen bent.
Alias
In PowerShell kun je gebruikmaken van zogenaamde aliassen. Je kunt ze zelf maken, maar er zitten er ook al enkele ingebouwd. Zo kun je:
het commando dir (directory) gebruiken
of ls (list)
Beide laten ze de bestanden en folders zien, maar eigenlijk wordt het commando Get-ChildItem gebruikt. Zowel dir (in Windows gebruikt als afkorting van directory) als ls (in Linux, Unix en MacOS gebruikt als afkorting van list) zijn aliassen van dit commando.
Afb. 1 dir en Is zijn aliassen van het commando Get-Childitem
Show-Command
Een erg handige optie, zeker in het begin, is de mogelijkheid dat PowerShell ISE je helpt met het opbouwen van de gehele commandoregel.
Als je Show-Command Get-ChildItem typt krijg je een venster waarin je de parameters en hun waarden kunt invullen.
Afb. 1 Het opbouwen van een commando kan ook grafisch
Met de knop Copy kun je het commando uiteindelijk plakken in de shell of je kunt in plaats daarvan direct kiezen voor Run. Door het eerst in de shell te plakken zie je ook wat het uiteindelijke commando inclusief parameters en values geworden is. En daarmee leer je weer sneller hoe PowerShell werkt.
Als je het commando hierboven vergelijkt met het commando hier voor zie je dat de parameters -Filter en -Path omgedraaid zijn. In dit voorbeeld is dat blijkbaar geen probleem. Zeker niet omdat duidelijk aangegeven wordt om welke parameter het gaat.
Soms staat een parameter op een vaste plaats in het commando. Door dan alleen de value op te geven en de parameter zelf weg te laten weet PowerShell nog steeds wat er bedoeld wordt. Om PowerShell goed te leren schrijven we in dit boek altijd de volledige parameter uit en maken we geen gebruik van aliassen.
Providers
Met PowerShell kun je meer dan alleen folders en bestanden van het file system benaderen. Het file system noemen we een provider. Maar er zijn er meer zoals Certificaten en het Windows Register.
Afb. 1 Er zijn meer providers naast het file system
Met het commando Get-PSProvider kun je de lijst van providers opvragen. Met het commando Set-Location (of de alias cd = change directory) kun je door de items bladeren alsof het een file system is, bijvoorbeeld: Set-Location HKCU: en daarna Get-ChildItem geeft je de entries in de registerkey HKey Current User.
Afb. 2 Inhoud HKey Current User tonen in PowerShell
Als IIS (Internet Information Server) bijvoorbeeld als rol geïnstalleerd staat, kun je die ook op deze manier benaderen en beheren. Om een overzicht te krijgen van alle providers gebruik je het commando: Get-PSProvider.
Providers zijn dus erg handig omdat je ze op eenzelfde manier kunt gebruiken als andere objecten in PowerShell.
Opdracht 1
Voer in PowerShell ISE de volgende commando's uit:
Set-Location ENV:
Get-Childitem
Je krijgt de inhoud van de omgevingsvariabelen te zien. Hier vind je ontzettend veel info die je nodig kunt hebben en ook weer kunt ge bruiken in scripts. Denk bijvoorbeeld aan de computernaam (com putername) en de ingelogde gebruiker (username).
Probeer op eenzelfde manier ook eens de volgende providers uit en
zoek het antwoord op de vragen:
alias (Set-Location Alias: en vervolgens Get-Childitem)
Dit geeft je een lijst met alle aliassen die je kunt gebruiken.
Welke aliassen kun je gebruiken in plaats van clear-host?
function (Set-Location Function: en vervolgens Get-Childitem)
Dit geeft je een lijst met alle functies die al bestaan. In de lijst met functies zie je ook mkdir staan.
Welke alias kun je eventueel ook gebruiken?
cert (Set-Location Cert: en vervolgens Get-Childitem) Dit geeft je de certificaten verdeeld over de machine en de user.
Hoe kun je nu zoeken in alle subitems, zodat je alle certificaten ziet?
Wat wordt het commando?
TIP Om weer terug te keren naar PowerShell typ je : C:
Opdracht 2
Typ het onderstaande script over in PS ISE, let goed op dat je geen typfouten maakt en dat elke regel in het script ook op een nieuwe regel in ISE komt te staan. Let op de backtick ( ` ) in regel 2. Met deze backtick koppel je regel 2 aan regel 3 vast. Beide regels mogen dus ook in één regel staan.
Er wordt een folder aangemaakt met de naam datal in C:\
Regels 2 en 3
Allereerst wordt er een verzameling getallen gemaakt van 1 tot en met 50. Zo'n verzameling noemen we een array.
Vervolgens wordt deze verzameling doorgegeven aan het volgende commando met dit teken: | Dat teken noemen we het pipe-teken.
Elk getal in de verzameling is een object. Op elk object (getal) wordt een bewerking uitgevoerd. De bewerking zelf staat tussen accolades {}. Het commando ForEach-Object 'voert' de objecten (getallen) stuk voor stuk aan de bewerking.
De bewerking zelf maakt een nieuw bestand aan (-ItemType) in de folder die wordt genoemd bij de parameter -Path. De bestandsnaam van de file bestaat uit een stukje tekst File_ en dan twee karakters: $_ en vervolgens de extensie .txt.
De karakters $_ zijn speciaal omdat ze een zogenaamde placeholder vormen. Elke keer komt op die plek het volgende object uit de aan geboden verzameling (array) te staan. Dus de eerste keer wordt het object 1 'gevoerd' en ontstaat de naam: File_1.txt. Vervolgens zorgt het volgende object uit de verzameling dat de naam File_2.txt wordt enzovoort.
Op dit moment hoef je dit allemaal nog niet te kunnen of toe te pas sen. We beginnen eenvoudig met de volgende opdracht.
Opdracht 3
Schrijf de PowerShell-commando's waarme je:
Een folder maakt met de naam: data_backup.
De in houd van de folder data1 kopieert naar de folder: data_backup.
3 De Pipeline
De kracht van PowerShell zit deels in het kunnen gebruiken van het pipe-teken ( | ). Met dit pipe-teken kun je de uitkomst van een commando doorgeven aan een volgend commando. Je hebt dat ook in het vorige hoofdstuk gezien. Daar werd een verzameling (array) getallen door middel van het pipe-teken doorgegeven (gevoerd) aan het commando ForEach-Object.
Voorbeeld: de print spooler van de server moet gestopt worden. Dat kunnen we met PowerShell als volgt oplossen.
Get-Service Name Spooler | Stop-Service
Het het eerste deel (Get-Service -Name Spooler) wordt de service Spooler geselecteerd. Deze wordt vervolgens door middel van het pipe-teken ( | ) doorgegeven aan het volgende deel, namelijk het stoppen van de service.
Een controle leert ons dat de spooler service inderdaad gestopt is. Met Start-Service kun je de service uiteraard weer starten.
Afb. 1 De Spooler-service is gestopt
Wat zou er gebeuren als er geen parameter -Name en een value (waar de) opgegeven wordt? Juist, er wordt een poging gedaan om alle services te stoppen. Uiteindelijk krijg je een bulk aan foutmeldingen omdat dit uiteraard niet zomaar kan.
Ongetwijfeld zullen er situaties zijn waarin je eerst graag wilt weten wat er gebeurt als je een bepaald commando uitvoert. In die situaties kun je de paramater -What If gebruiken.
Afb. 2 Met de parameter -whatif kun je eerst zien wat er gebeurt
Een andere mogelijkheid is om de parameter -Confirm te gebruiken. In PowerShell ISE krijg je dan een pop-upvenster waarmee je per item (in dit voorbeeld per service) kunt aangeven of je dit item inderdaad wilt stoppen.
Afb. 3 Om bevestiging vragen met de parameter -Confirm
Exporteren en opslaan
Om de resultaten van diverse commando's te kunnen bewaren in een bestand zijn er exportmogelijkheden. We bekijken er een aantal.
Export naar een csv-bestand
Met behulp van het pipe-teken is het goed mogelijk de output door te sturen naar een bestand. In dit geval een CSV-bestand (comma-separated values).
Dit geeft als resultaat een onopgemaakte tekst. De output in de file is dezelfde als die op het scherm.
Afb. 1 Opslaan in een tekstbestand met het commmando Out-File
Get-ChildItem C:\data1\*.* | Out-GridView
Dit levert een grid op waarin je makkelijk kunt sorteren en zoeken met behulp van een venster.
Ook bestaat de mogelijkheid om Out-Printer te gebruiken. Als je alle opties met het werkwoord 'out' wilt zien gebruik je het volgende
commando:
Get-Command -Verb out
Het is ook mogelijk om output op het clipboard op te slaan, zodat je die elders makkelijk kunt plakken.
Get-Netadapter | Clip
De laatste die we hier aanhalen is de mogelijkheid tot conversie naar HTML:
Als je verder in de help file zoekt zul je zien dat er ook nog mogelijk heden zijn om deze HTML-file van enige opmaak te voorzien.
Opdracht 1
Open zowel Paint als Notepad en gebruik vervolgens PowerShell.
Zorg dat je een lijst krijgt van alle processen.
Sla deze op als processen.csv.
Sluit met één commando zowel Notepad als Paint tegelijk af.
Importeren
Als er mogelijkheden zijn om bestanden te exporteren of op te slaan, dan bestaat er uiteraard ook een mogelijkheid om bestanden te im
porteren.
Import-Clixml -Path C:\logboek.xml
Afb. 1 Importeren kan ook met PowerShell
Om bestanden alleen maar te lezen kun je gebruik maken van het commando Get-Content. Je kunt er daarna verder niets meer mee in een PS commando, in tegenstelling tot het commando Import.
Get-Content -Path C:\archief.txt
Afb. 2 De output van Get-Content kun je verder niet meer gebruiken
Opdracht 1
Gebruik de commando's Import-csv en Get-Content om het eerder gemaakte 'processen.txt' te bekijken
4 Eenvoudig script
Niet alleen kan PowerShell direct in de shell gebruikt worden, het is ook mogelijk meerdere commando's achter elkaar in een tekstbestand te zetten en op die manier een script te maken. Handig om te bewaren en te kunnen hergebruiken.
Voor het maken van een PowerShell-script kun je een simpele tekst editor gebruiken als Kladblok of een scripteditor als Notepad++ maar het kan uiteraard ook in PowerShell ISE. De extensie die je moet gebruiken is '.ps1'.
Uitvoeren van een script
Je kunt een PowerShell-script op twee manieren uitvoeren: Via de commandline: powershell.exe -noexit c:\script.ps1
Of via PowerShell zelf. Hierbij moet je het hele pad naar het script opgeven, anders wordt het script nog steeds niet uitgevoerd. Als je al in dezelfde directory staat van het script, kun je het als volgt uitvoeren .\script1.ps1
Executionpolicy
Scripts mogen binnen een Windows-besturingssysteem niet altijd zomaar worden uitgevoerd. Dat heeft uiteraard te maken met de veiligheid. Het kan dus voorkomen dat je bijvoorbeeld een melding krijgt:
'File <script> cannot be loaded because running scripts is disabled on this system.
Afhankelijk van de Windows-versie is de standaard voor het uitvoe ren van een PowerShell-script anders. Met behulp van het commando Get-Execution Policy kun je achterhalen hoe de policy is ingesteld.
Afb. 1 Opvragen van de status van de execution policy
Er zijn verschillende policies, waar onder:
Restricted: je kunt geen gebruikmaken van scripts; alleen com mando's rechtstreeks in PowerShell worden geaccepteerd. Dit is de standaard voor Windows Server 2012 R2.
AllSigned: alleen scripts die ondertekend zijn door een 'trusted publisher' worden uitgevoerd, de rest wordt geblokkeerd.
RemoteSigned: gedownloade scripts moeten ondertekend zijn door een trusted publisher voordat ze worden uitgevoerd. Zelf gemaaktescripts worden wel uitgevoerd. Dit is de standaard vanaf Windows Server 2012 R2 en dus ook voor Windows Server 2019.
Unrestricted: alle scripts worden uitgevoerd, zonder restricties.
Aangezien we in dit boek gebruikmaken van Server 2019 kun je prima uit de voeten met je eigen gemaakte scripts en de stan daardinstelling. We gaan in dit boek niet verder in op het 'signen' van scripts.
Om een andere policy dan de standaard toe te passen, bijvoorbeeld naar 'Unrestricted', gebruik je het commando:
Set-ExecutionPolicy Unrestricted
Vervolgens verschijnt er nog wel een venster waarin je dit toe moet staan.
Afb. 2 Een wijziging van execution policy moet bevestigd worden
Variabelen
Om gegevens te onthouden tijdens het uitvoeren van een script plaatsen we deze gegevens in een zogenaamde variabele. Dit kun je vergelijken met een lege doos. Als je er iets in stopt kun je op elk moment kijken wat er in die doos zit. Je kunt gegevens aan de doos toevoegen, deze bekijken en gebruiken, terugstoppen of de doos weer leeg maken.
Een variabele wordt in een PS-script geschreven met een dollarteken ervoor ($). Bijvoorbeeld:
$a is de waarde van de variabele. A is de variabele zelf en $a de waarde van de variabele a.
Je kunt een waarde toekennen aan de variabele door er een is-gelijk teken (=) achter te plaatsen en dan de waarde op te geven, bijvoorbeeld:
$a = 5
Door ermee te spelen kun je al een eenvoudig script maken, zoals:
$a = 5 $b = 2
$som = $a+ $b
$keer = $a * $b
'De som van ' + $a + 'en' + $b + is gelijk aan ' + $som
Je ziet meteen het voordeel van het gebruik van variabelen. Door alleen de waarden van $a en $b aan te passen klopt de rest nog steeds. Dat hoef je niet opnieuw te maken / scripten.
Enkele en dubbele aanhalingstekens
In principe gebruik je zoveel mogelijk een 'single quote' als je tekst (en dan hebben we het over een string) gebruikt in variabelen. Je kunt echter ook dubbele aanhalingstekens (") gebruiken.
In onderstaand voorbeeld ga je het verschil tussen beide ontdekken. Let op dat alle commando's rechtstreeks in PowerShell getypt worden en niet in een script.
$a = 'MediaTechnologie'
$b = 'Ik doe de opleiding $a' (let op: enkele aanhalingstekens)
$c = "Ik doe de opleiding $a" (let op: dubbele aanhalingstekens)
De output van de variabelen $b en $c zullen totaal verschillend zijn, zie het voorbeeld hieronder.
<afbeelding 1>
Dat zou ervoor pleiten dat je juist altijd beter dubbele aanhalingstekens kunt gebruiken. Deze hebben echter ook een nadeel. Als je ondertussen de inhoud van de variabele update zal deze niet geüpdatet worden tussen de dubbele aanhalingstekens. Met andere woorden: de waarde van de variabele die je tussen de dubbele aanhalingste kens gebruikt, wordt de eerste keer ingelezen en daarna niet geüpdatet. Dat is wel iets om rekening mee te houden. Overigens heb je hier in een script minder last van omdat de variabelen elke keer bij het invoeren opnieuw worden ingelezen.
<afbeelding 2>
Het scriptje met de sommen eerder in dit hoofdstuk zou je dus ook als volgt kunnen schrijven:
$a = 5
$b = 2
$som $a + $b
$keer = $a * $b
"De som van $a en $b is gelijk aan $som" "Het product van $a en $b is gelijk aan $keer"
Je ziet dat het iets leesbaarder geworden is doordat je de variabelen gewoon tussen de aanhalingstekens kunt laten staan en je niet alle 'stukjes' aan elkaar hoeft te plakken met het + -teken.
Wat nu als je het volgende wilt bereiken?
$d = 'MediaTechnologie'
"$d heeft als waarde $d"
De output wordt dan: MediaTechnologie heeft als waarde MediaTechnologie
Door het `-teken (backtick) als escape-teken te gebruiken vertel je PowerShell dat de variabele niet als variabele gelezen moet worden maar als exacte tekst.
"`$d heeft als waarde $d" geeft "$d heeft als waarde MediaTechnologie".
Bij het maken van een script zul je veel gebruikmaken van variabelen, juist om het script herbruikbaar te maken. Het maken van een script kost veel tijd en het goed testen ook. Het grote voordeel is dat je het daarna veelvuldig kunt gebruiken.
Verwijderen van een variabele
Je kunt de variabelen binnen PowerShell als een drive benaderen:
Get-ChildItem Variable:
Dit geeft een lijst van alle standaard aanwezige en de zelf aangemaakte variabelen. Op eenzelfde manier kun je dus ook een variabele verwijderen:
Remove-Item Variable:c
Heel rigoureus is:
Get-Variable | Remove-Variable
Uiteraard krijg je foutmeldingen vanwege de standaard aanwezige variabelen die niet verwijderd kunnen worden, maar de rest is weldegelijk verdwenen.
De netste manier is echter:
Remove-Variable -Name <variabelenaam>
Let op dat de naam van de variabele zonder $ geschreven wordt. Het dollarteken voor de naam betekent alleen maar dat het om de inhoud van de variabele gaat. Dus:
$a = 3
Remove-Variable -Name $a
Dit geeft als waarde 3 terug aan de parameter -Name. De variabele 3 bestaat niet. De naam van de variabele zelf is a.
$a = 3
Remove-Variable -Name a
Bovenstaand commando is wel correct.
Declareren van een variabele
Een variabele kan dus verschillende soorten inhoud hebben, zoals een getal of een tekst. Het is verstandig om van tevoren aan te geven wat de inhoud van een variabele is. Dat noemen we het 'declareren van een variabele'. Bekijk eens onderstaand voorbeeld.
$a = 5
$b = '3'
$a + $b
Het antwoord zal 8 zijn.
Terwijl het antwoord 35 zal zijn bij:
$a = 5
$b = '3'
$b + $a
De verklaring zit in de inhoud van de variabelen. In de variabele a zit de waarde 5. Omdat deze niet tussen aanhalingstekens staat wordt deze waarde als een getal (integer) gezien. In de som $a + $b gaat PowerShell ervan uit dat het tweede getal dan ook een getal zal zijn. Het telt deze bij elkaar op en geeft het antwoord 8.
In het tweede voorbeeld wordt eerst de waarde van variabele b genomen. Dit is de waarde 3, maar deze staat tussen aanhalingstekens. PowerShell weet daardoor dus dat het om tekst (een string) gaat. Door deze waarde bij de volgende op te tellen gaat PowerShell ervan uit dat de tweede waarde dus ook een tekst is. De twee teksten wor den bij elkaar opgeteld en dus naast elkaar als een 3 en een 5 afgebeeld en dat levert de 35 op.
Zeker als anderen ook gaan werken met een door jou geschreven script is het van belang van tevoren aan te geven welk soort inhoud de variabele heeft. PowerShell kent er een redelijk aantal, waaronder:
Int
32 bits integer (getal)
Long
64 bits integer (getal)
String
Tekst
Byte
8 bits karakter
Bool
Boolean, waarde True or False
Decimal
128 bits decimale waarde
Het declareren van een variabele gaat als volgt:
Getal: [int]$a = 5
Tekst: [string]$b = '3' of [string]$b = 'drie'
Als je in PowerShell nu het volgende opgeeft: $a = 'drie, dan krijg je een foutmelding. Dat komt omdat PowerShell nu alleen Integers accepteert als de inhoud voor de variabele a.
Opdracht 1
Maak een script dat bij het uitvoeren 4 uitkomsten geeft, namelijk:
"De som van $a en $b is gelijk aan $som" Optellen
"Het verschil tussen sa en $b is gelijk aan $verschil" Aftrekken
"Het product van $a en $b is gelijk aan $product" Vermenigvuldigen
"De quotiënt van $a en $b is gelijk aan $quotient" Delen
Uiteraard zorg je dat alle variabelen gedeclareerd zijn en dat je de juiste aanhalingstekens gebruikt. Test je script meerdere malen met diverse getallen om te controleren of het goed en foutloos werkt.
Control structures
Om controle te krijgen binnen een script kun je gebruikmaken van zogenaamde 'control structures. Hieronder volgen de meest gebruikte.
If, elseif en else
Aan de hand van onderstaand voorbeeld bekijken we wat deze structuur doet.
Clear-Host
[int] $number = Read-Host "Vul een getal tussen 1 en 10 in"
if ($number -gt 10) {
write-host "Het getal is groter dan 10"}
elseif ($number -lt 10) {
write-Host "Het getal is kleiner dan 10"}
else {
Write-Host "Het getal is precies 10"}
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uitgevoerd.
Regel 2[int] declareert de variabele number als een geheel getal.Vervolgens wordt met het commando Read-Host de input ge vraagd van een gebruiker.
Regel 3, 6, 9 Hier volgt de if-, elseif- en else-constructie, waardoor er drie mogelijkheden worden gecreëerd.
Regel 3-5 De inhoud van de variabele number wordt vergeleken of deze groter (-gt = greater than) is dan 10. Als dat het geval is wordt het deel dat tussen de accolades ({}) staat uitgevoerd, na melijk er wordt naar het scherm geschreven (write-Host).
Regel 6-8 Als de eerste controle, de eerste if niet waar is wordt de elseif geprobeerd. Wederom wordt de waarde van de variabele gecontroleerd. In dit geval of deze minder (-1t = less than) is dan 10. Indien de controle klopt wordt ook hier de code tussen de accolades uitgevoerd.
Regel 9-11 Als beide controles, de if en de elseif, niet waar zijn wordt de else uitgevoerd. In dit geval: als de waarde van de variabele number niet kleiner en niet groter is dan 10 moet deze zelf de waarde 10 hebben. De code tussen de accolades wordt uitgevoerd en de tekst wordt op het beeldscherm weergegeven.
TIP PowerShell snapt welke regels bij elkaar horen en laat dat zien met behulp van een verticale lijn ervoor. Door op de in het vakje te klikken, 'klapt' de code in en wijzigt de - in een +.
Het volgende is belangrijk te onthouden:
De uit te voeren code staat tussen accolades {}.
Er kan meerdere keren een elseif worden gebruikt.
Als een vergelijking klopt, wordt de code tussen de accolades uit gevoerd, waarna de rest niet meer gecontroleerd wordt. Dus als de eerste if-vergelijking waar is, worden de elseif en de else niet meer geëvalueerd.
Zie ook de helpfile in PowerShell: help about-if
ForEach
Bestudeer eens onderstaand voorbeeld en lees dan de toelichting.
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uitgevoerd.
Regel 2 De variabele number wordt gevuld met een array (verza meling) aan getallen. Om aan te geven dat het om een array gaat staat er een @ teken voor. Eerder in dit boek heb je gezien dat een reeks getallen ook makkelijker gemaakt kan worden:
[array] $number = @(1..10).
Regel 3-6 Elke waarde in de array wordt stuk voor stuk in de variabele a gestopt en op het beeldscherm getoond (Write-Host). Net zolang totdat alle waarden in de array 'gebruikt' zijn. Ook hier wordt de uit te voeren code tussen accolades geplaatst.
Switch
Switch is een prima constructie waarin veel controles zitten zonder de constructies if, elseif of else te gebruiken. Zie onderstaand voor beeld voor de syntax.
Clear-Host.
$number = Read-Host "Vul een getal in tussen 0 en 4"
Switch ($number)
{
1 {Write-Host "Je hebt het getal 1 gekozen"}
2 {Write-Host "Je hebt het getal 2 gekozen"}
3 {Write-Host "Je hebt het getal 3 gekozen"}
Default {Write-Host "Je hebt niet het getal 1,2 of 3 gekozen"}
}
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uitgevoerd (Clear-Host)
Regel 2 De variabele number wordt gevuld door de gebruiker om in put te vragen.
Regel 3 De Switch-constructie wordt gestart en de waarde van de variabele wordt in de constructie geplaatst. De gehele code daar na wordt tussen accolades geplaatst.
Regel 5-9 Elke switch wordt getoetst. Indien de waarde van de va riabele overeenkomt met de switch, wordt de code daarna (ook. weer tussen accolades) uitgevoerd. Vervolgens gaat de constructie verder en wordt er gekeken of er nog meer matches zijn. Dit in tegenstelling tot de constructie If, ElseIf, Else.
Belangrijk:
Om uit een switch te komen zonder alle andere waarden te evalue ren kun je break gebruiken. Voorbeeld:
{Write-Host "Je hebt het getal 1 gekozen"; break}
Daarna wordt de switch-constructie verlaten.
Bij een switch-constructie zijn meerdere matches mogelijk, in tegen stelling tot de constructie If, ElseIf, Else.
Do, While, Until
Er is een aantal constructies mogelijk om een loop te maken. We be spreken er één waarna er nog twee voorbeelden volgen.
Clear-Host
[int] $a = 0
Do
{
Write-Host "De waarde van $a is $a"
$a++
}
While ($a lt 10)
Regel 1 Het scherm wordt leeg gemaakt voordat de code wordt uit gevoerd.
Regel 2 De variabele a krijgt de waarde 0 toegewezen.
Regel 3 De Do-loop start, de code erna staat tussen accolades.
Regel 5 De waarde van de variabele a wordt naar het scherm geschreven. Het backtick-teken (`) zorgt dat niet de waarde, maar de variabele zelf wordt weergegeven.
Regel 6 De waarde van variabele a wordt met 1 verhoogd ($a++).
Regel 8 Zolang de waarde van variabele a minder (-lt = less than) 10 is wordt de Do-loop uitgevoerd.
Een andere mogelijkheid:
Clear-Host
[int] $a = 0
Do
{
Write-Host "De waarde van `$a is $a"
$a++
}
Until ($a -gt 10)
Of:
Clear-Host
[int] $a = 0
While ($a lt 10)
{
Write-Host "De waarde van `$a is $a"
$a++
}
For
Als laatste de For-lus.
Clear-Host
For ([int] $a = 0; $a lt 10; $a++)
{
write-Host "De waarde van $a is $a"
}
Bij de For-lus worden alle condities achter elkaar opgegeven:
startwaarde ($a = 0)
de conditie waaraan voldaan moet worden ($a -lt 10)
de wijziging in de waarde ($a++)
Opdracht 1
Maak een PowerShell-script dat de leeftijd vraagt en daarna aangeeft of de gebruiker:
jonger dan 16 jaar is
jonger dan 25 jaar is
jonger dan 40 jaar is
ouder dan 40 jaar is
Opdracht 2
Met het script in opdracht 2 van het onderdeel Providers heb je 50 bestanden (txt files) aangemaakt in een folder met de naam data1. De bestanden hebben echter allemaal dezelfde datum waarop ze zijn gemaakt (creatiedatum). Voor deze opdracht heb je bestanden met verschillende creatiedata nodig. In bijlage A (aan het eind van het boek) bij opdracht 4.3 vind je een script waarmee je de 'creationtime' kunt wijzigen.
Gebruik het script uit bijlage A opdracht 4.3 om de bestanden in C:\data1 van verschillende creatiedata te voorzien.
Schrijf vervolgens een PowerShell-script waarmee je x aantal dagen oude files uit een folder kunt verwijderen. Uiteraard is x een variabele. Zie ook bijlage B voor bruikbare commando's.
TIP Maak eerst een kopie van de folder voordat je werkelijk bestanden gaat verwijderen. Zodoende kun je makkelijker en vaker testen. Uiteraard kun je ook eerst gebruikmaken van de paramater -whatif.
Opdracht 3
Breid je Powershell-script dusdanig uit dat lege mappen, die misschien ontstaan zijn, daarna verwijderd worden.
Een logfile maken
In onderstaand voorbeeld maken we een script waarbij een aantal gegevens in een tekstbestand wordt geschreven. Een dergelijk script zou je als logfile kunnen gebruiken.
Allereerst moeten we bepalen welke gegevens van belang zijn om te worden opgenomen in de logfile:
de huidige datum en tijd;
het IP-adres van de computer waarop wordt ingelogd;
de computernaam van de computer waarop wordt ingelogd;
de accountnaam van degene die inlogt.
Daarnaast moeten de gegevens aan een tekstbestand worden toe gevoegd zodat de vorige gegevens ook bewaard blijven. Het laatste doel is om die gegevens per maand in een tekstbestand te hebben zodat het makkelijker kan worden gearchiveerd.
De gebruikersnaam en de computernaam zijn vrij eenvoudig. Beide zijn bekend in de omgevingsvariabelen. Die omgevingsvariabelen zijn als provider in PowerShell benaderbaar. Net zoals je het bestandssysteem kunt benaderen door de schijfletter te gebruiken (bij voorbeeld C:), kun je de omgevingsvariabelen bereiken via ENV:
Dus met het commando:
Get-Content Env: USERNAME en Computername krijg je de juiste gegevens retour. Deze leg je vast in een variabele.
De datum en de tijd zijn ook vrij eenvoudig met het commando Get-Date te verkrijgen. Met de parameter -format kun je verder bepalen hoe je wilt dat de datum of tijd wordt vastgelegd. Daarbij zijn:
dd - de dag
MM - de maand
yyyy - het jaar
hh - de uren in 12-uursnotatie of HH in 24-uursnotatie
mm - de minuten
Op die manier wordt de variabele date gevuld. Maar je kunt de datum uiteraard ook gebruiken in een bestandsnaam ($filename).
Het lastigste is eigenlijk het IP-adres. Met het commando Get-NetIPAddress krijg je meer informatie dan alleen het IP-adres terug. Daarnaast kunnen er in een computer meerdere netwerk kaarten aanwezig zijn, naast wellicht een aantal virtuele kaarten. Het vastleggen van bijvoorbeeld het APIPA-adres (169.254.x.x) heeft geen zin. Door de parameter -IPAddress met het begin van een IP-adres op te geven worden alleen de gegevens van de netwerkkaart gekozen die beginnen met het IP-adres, bijvoorbeeld:
Get-NetIPAddress -IPAddress 172.16.*.*
Op de plaats van de * (wildcard!) mag dus elke waarde staan.
Nog steeds worden er te veel gegevens retour gegeven.
Door de juiste netwerkkaartgegevens met het pipe-teken ( | ) door te geven aan het volgende commando, kun je verder met deze gegevens werken. Met het commando Select-Object kun je de gegevens selecteren.
Met de parameter -ExpandProperty en de waarde IPAddress worden alle gegevens van de netwerkkaart in kleine brokjes verdeeld en daarvan alleen het IP-adres geselecteerd. Hierdoor blijft uiteindelijk alleen de waarde van het IP-adres over. Deze kun je vervolgens vastleggen in de variabele $IPAddress.
Vervolgens kun je een tekstregel maken waarin de aangemaakte variabelen worden opgenomen en welke er worden weggeschreven in een tekstfile.
Met de parameter -Append worden de gegevens toegevoegd aan het bestand in plaats van het te overschrijven.
Door ook in de bestandsnaam een variabele op te nemen ($filename) wijzigt de naam per maand. Uiteraard kun je dit bestand opslaan in welke folder dan ook.
Opdracht 1
Maak met behulp van PowerShell een Login script. Sla de scripts op en kopieer de tekst van de scripts in je documentatie.
In Windows Server 2019 kun je via Group Policy een PowerShell-script als login script gebruiken.
Afb. 1 Maak een GPO om een PowerShell loginscript toe te passen
Comments en helpfile
Het is niet een goede gewoonte, maar een vereiste om je script van het juiste commentaar te voorzien. Zo weten jijzelf en ook anderen hoe jouw script in elkaar steekt. Uiteraard weet je dat zelf op het moment dat je het script aan het schrijven bent, maar geheid dat je het over enkele weken of maanden bent vergeten. Dan ben je dankbaar voor het feit dat je ooit de tijd genomen hebt om dit op een degelijke manier te doen.
Een commentaarregel laat je in PowerShell voorafgaan door een #, dus:
# De variabele $Username wordt gevuld met de huidige gebruikersnaam
$Username = Get-Content Env: USERNAME
Als je meer commentaarregels onder elkaar in een blok wilt zetten, kan dat ook. Gebruik hiervoor het zogenaamde comment-block. Deze ziet er als volgt uit:
<#
Hier staat commentaar regel 1
en hier staat regel 2
en dit commentaarblok wordt afgesloten met regel 3
#>
Het mooie van PowerShell is dat je jouw toegevoegde commentaar meteen kunt gebruiken als tekst voor de helpfile van het eigen script. Dit noemen we comment-based help. Deze comments komen dus in het comment-block (tussen <# en #> te staan). Een aantal voorbeelden die je zou kunnen gebruiken:
.SYNOPSIS een korte beschrijving van het script.
.DESCRIPTION een gedetailleerdere beschrijving van het script. .PARAMETER <Parameter-Name> Als je parameters gebruikt, dan be noem je ze hier per stuk, daarbij geef je ook de default-waarde
aan.
.EXAMPLE Voorbeelden die je wilt geven bij gebruik van het script: deze voorbeelden hoef je niet te nummeren.
.NOTES eventueel aanvullende informatie over het script of de func tie.
.LINK eventueel een link waar bijvoorbeeld meer info te vinden is.
Let op! De comment-based help moet aan het begin van het script staan.
Als je een en ander op die manier netjes documenteert (van comments voorziet) en je vraagt vervolgens de helpfile van het eigen script op, dan krijg je deze ook keurig te zien.
Zie onderstaand voorbeeld: Get-Help .\loginscript.ps1 -full (daar mee krijg je alle info te zien!).
<afbeelding van script in bijlage A>
TIP Voor meer informatie over comment-based help geef je binnen PowerShell het commando:
Get-Help About_Comment_Based_Help
Opdracht 1
Maak een passende comment based helpfile voor je login script uit opdracht 1 van het onder deel "Een logfile maken"
Deel 2 : Powershell & Active Directory
5 Basisnetwerk
Dit deel starten we met en basisnetwerk en basisconfiguratie. De situatie zie je hieronder weergegeven. We maken voorlopig gebruik van één domain controller en één client, beide in het domein mediatech.lan.
De domain controller heft dezelfde configuratie als in deel I. Zodoende kun je ook dezelfde server in dit deel blijven gebruiken. Er komt een Windows 10 als client bij. Deze is bedoeld om het inloggen van diverse gebruikers te kunnen testen.
Afb. 1 Overzichtstekening netwerk mediatech.lan
Naam
Server 1
IP-Adres
172.16.x.10
Subnetmasker
255.255.255.0
Default gateway
172.16.x.1
DNS-Server
172.16.x.10
OS
Windoows Server 2019
Services
ADDS, DNS
Naam
WS1
IP-adres
172.16.x.20
Subnetmasker
255.255.255.0
Default Gateway
172.16.x.1
DNS-Server
172.16.x.10
OS
Windows 10
Naam
Router
WAN
Automatisch
LAN
172.16.x.1
Subnetmasker
255.255.255.0
Opdracht 1
Installeer en configureer het netwerk
6 Modules
7 Users en groups
8 Errorhandling
9 Externe data gebruiken
10 User input
Deel 3 : Remote Administration & Core Server
11 Basisnetwerk
12 Remote Server Administration Tools
13 Computermanagement
14 Powershell Remoting
15 Installatie werbservers
16 GPO: Remote management
17 Installatie IIS
18 Websites en DNS
19 Rol verwijderen
20 Domain Services
Deel 4 : Powershell 7, VS Code en GUI
21 Basisnetwerk
22 Powershell 7
23 Visusal Studio Code Editor
24 Graphic User Interface
Bijlage A
Opdracht 2 Hoofdstuk 4
In opdracht 2.5 heb je door middel van een script 50 tekstbestanden gemaakt in de folder C: datal. Deze 50 bestanden hebben echter allemaal dezelfde datum van aanmaken (creatiedatum).
In opdracht 4.3 heb je echter bestanden met verschillende creatiedata nodig. Met onderstaand script kun je de creatiedata van deze bestanden wijzigen.
In de variable $set1 wordt de huidige datum vastgelegd (Get -Date) en daar wordt en aantal dagen vanaf getrokken met behulp van het negatieve getal achter ) .AddDays. De eerste regel levert dus en datum op die 10 dagen eerder ligt dan de huidige datum.
Dat wordt in de variabelen $set2 tot en met $set4 herhaald, maar het aantal dagen dat er vanaf gehaald word wisselt.
Daarna volgen er 4 regels code die bijna identiek zijn. Het verschil is dat er telkens andere bestanden geselecteerd worden en er een andere variabele $set op toegepast wordt.
Eerst worden de bestanden geselecteerd: Get-Item C:\data1\File_?.txt
Door het vraagteken worden alle bestanden met de naam File_ 1. txt t/m File_9. txt geselecteerd. Elk bestand (object) wordt daarna gevoerd' aan het commando achter het pipe-teken, waar de datum van create wordt gewijzigd naar de waarde in de variabele $set1.
In de volgende regel worden andere bestanden geselecteerd omdat er nu File_1?.txt wordt opgevraagd. Daardoor worden de bestanden File_ 11.txt tot en met File_19.txt geselecteerd. Tevens wordt de creatiedatum weer anders doordat variabele $set2 toegepast wordt.
Het arrangement Leer werken met Powershell is gemaakt met
Wikiwijs van
Kennisnet. Wikiwijs is hét onderwijsplatform waar je leermiddelen zoekt,
maakt en deelt.
Auteurs
Martijn Bockstael
Je moet eerst inloggen om feedback aan de auteur te kunnen geven.
Laatst gewijzigd
2022-09-20 11:12:14
Licentie
Dit lesmateriaal is gepubliceerd onder de Creative Commons Naamsvermelding 4.0 Internationale licentie. Dit houdt in dat je onder de voorwaarde van naamsvermelding vrij bent om:
het werk te delen - te kopiëren, te verspreiden en door te geven via elk medium of bestandsformaat
het werk te bewerken - te remixen, te veranderen en afgeleide werken te maken
voor alle doeleinden, inclusief commerciële doeleinden.
Leeromgevingen die gebruik maken van LTI kunnen Wikiwijs arrangementen en toetsen afspelen en resultaten
terugkoppelen. Hiervoor moet de leeromgeving wel bij Wikiwijs aangemeld zijn. Wil je gebruik maken van de LTI
koppeling? Meld je aan via info@wikiwijs.nl met het verzoek om een LTI
koppeling aan te gaan.
Maak je al gebruik van LTI? Gebruik dan de onderstaande Launch URL’s.
Arrangement
IMSCC package
Wil je de Launch URL’s niet los kopiëren, maar in één keer downloaden? Download dan de IMSCC package.
Wikiwijs lesmateriaal kan worden gebruikt in een externe leeromgeving. Er kunnen koppelingen worden gemaakt en
het lesmateriaal kan op verschillende manieren worden geëxporteerd. Meer informatie hierover kun je vinden op
onze Developers Wiki.