Powershell

Schrijf je in op onze nieuwsbrief en ontvang elke week het beste van Clickx in je mailbox.

PowerShell is een krachtige tool waarmee je zelf cmdlets en modules kan aanmaken voor het automatiseren van taken in Windows 11. Wist je dat je die mogelijkheden verregaand kan aanpassen aan jouw specifieke behoeften? Bij scripting worden aan de computer opdrachten gegeven in de vorm van een instructie. Een computer begrijpt deze instructie niet, omdat een computer werkt op basis van het binair talstelsel (1 en 0). De instructie moet hierdoor omgezet worden naar enen en nullen. Dit noemt men compileren. Een compiler zal het originele programma volledig omzetten naar machinetaal.

Binnen de opdrachten in de instructie worden onder meer variabelen en datatypen gebruikt. Een variabele is een plek waar informatie wordt opgeslagen. Een variabele komt overeen met één of meerdere geheugenplaats(en) in het werkgeheugen van de computer, waarin die informatie wordt opgeslagen. Zo’n geheugenplaats heeft een bepaald adres, waarnaar een link gelegd wordt via de variabelenaam die wordt opgegeven. Als een variabele wordt aangesproken, zal de inhoud worden opgeroepen van één of meer geheugenplaatsadressen.

De variabelen die worden gebruikt, moeten herkenbaar gemaakt worden aan de compiler. Daarom bestaan er variabelen van verschillende soorten datatype: bijvoorbeeld een string voor tekst en een int voor gehele getallen. Een datatype toont aan welk soort informatie een variabele zal bevatten en hoeveel plaats deze zal innemen in het werkgeheugen. Een integer (int) kan bijvoorbeeld gebruikt worden om te rekenen en zal hiervoor vier bytes gebruiken.

Waarde toekennen aan een variabele

Een variabele krijgt een naam door er een $-teken voor te plaatsen. Aan de variabele zal normaal een waarde worden toegevoegd. Welke naam de variabele draagt maakt niet uit (afgezien van enkele uitzonderingen die online terug te vinden zijn). Dit betekent dat deze constructies beide kunnen:

•             $getal = 4
•             $woord = 4

Beide zijn correct, want de naam van de variabele maakt niet uit. Vanaf het moment dat de variabele bestaat, moet deze wel in het vervolg van de code met diezelfde naam worden aangesproken. Vaak zal gebruik worden gemaakt van korte namen: $a, $x, $y. Belangrijk: het is beter om dit niet te doen en eerder te kiezen voor lange, goede namen, bijvoorbeeld $computernaam. Dit maakt het duidelijker wanneer de code later wordt herlezen of wanneer een andere persoon de code leest. Hierdoor hoeft er ook minder commentaar te worden opgenomen. De waarde die aan de variabele wordt toegevoegd zal PowerShell bekijken en er zelf een datatype aan toekennen. Indien dit om tekst gaat, zal dit door de gebruiker tussen aanhalingstekens (“ ” of ‘ ‘) geplaatst zijn, waardoor PowerShell er het datatype string aan zal geven. Gaat dit om een geheel getal, dan zal dit een integer (int32) worden en bij een kommagetal een double. Dit is makkelijk op te vragen via variabelenaam.gettype().

Opbouwen van een stevige instructie

Waartoe PowerShell in staat is, wordt met dit eerste voorbeeld aangetoond. Het is bedoeld om dit te begrijpen en naar mate meer kennis in PowerShell wordt opgedaan dit zelfstandig uit te voeren.

Op de client wordt een nieuwe gebruiker toegevoegd, waarvoor de cmdlet enkele waarden toegekend moet krijgen via de parameters die in de afbeelding weergegeven worden. De parameters zonder [ ] hebben een verplichte waarde nodig om het cmdlet te kunnen uitvoeren. In dit geval gaat dit om -Name en -Password, waarbij vermelding van -Name niet hoeft. We maken een gebruiker student met wachtwoord Server*:

new-localuser student -password “Server*”

Helaas werkt dit niet omdat Server* niet toegevoegd kan worden als securestring. Dit wordt in de foutboodschap gemeld.

Wat wel werkt is new-localuser student. Nadat op Enter wordt gedrukt zal het wachtwoord gevraagd worden en wordt Server* opgegeven. Nu zal PowerShell dit afhandelen, waardoor Server* wel als securestring toegevoegd kan worden.

Eveneens was het mogelijk om de gebruiker student te maken zonder wachtwoord, door gebruik te maken van de andere versie die new-localuser aanbiedt. Van ieder cmdlet kunnen meerdere versies bestaan.

Versie 2: we maken gebruiker gebruiker zonder wachtwoord:

new-localuser gebruiker -nopassword

Via Computerbeheer kunnen vervolgens de lokale gebruikers worden opgevraagd.

Bekijk nu de andere parameters die meegegeven kunnen worden bij het toevoegen van de nieuwe gebruiker. Vergelijk hierbij de twee afbeeldingen die beide versies opleveren om een lokale gebruiker toe te voegen. De volgende instructie kan bijvoorbeeld worden opgesteld. Voer deze uit:

new-localuser -name beheerder -accountneverexpires -description “Beheerder van fictieve organisatie” -Fullname ‘Beheerder_Organisatie’

Na het bevestigen van bovenstaande instructie wordt opgemerkt dat opnieuw een wachtwoord moet worden ingevoerd. Geef Server* op of indien geen wachtwoord nodig is, bevestig met Enter. Dit heeft dezelfde werking als de parameter -NoPassword toevoegen, waardoor de eerste versie van gebruikersaanmaak dus eigenlijk wel kon. Aangezien dit om een beheerdersaccount gaat, wordt Server* opgegeven. Merk op dat in deze instructie waarden aan de parameters werden toegevoegd met geen of verschillende soorten aanhalingstekens. In dit geval moet enkel description over aanhalingstekens beschikken, omdat er spaties gebruikt worden. Of dit dubbele of enkele aanhalingstekens zijn, maakt in dit geval weinig uit. Later wordt duidelijk welke wanneer gebruikt moeten worden. Maar wat als er meerdere gebruikers in één keer moeten worden toegevoegd en dit op verschillende machines? Maak dan in Kladblok een bestand met de namen apart en voeg er extra info aan toe, telkens gesplitst door een komma:

Maak het bestand zo na dat op iedere regel een nieuwe gebruiker wordt opgegeven.

Sla het bestand vervolgens op als een .csv-bestand users.csv in de map c:\powershell-scripts. Ga naar deze map in PowerShell ISE via het consolepaneel: cd c:\powershell-scripts (zorg er altijd voor dat de locatie juist is). Neem het .csv-bestand op in de variabele $csv:

$csv = import-csv .\users.csv

Typ $csv om de inhoud van $csv te bekijken.

Via $csv wordt de inhoud uitgelezen en overzichtelijk weergegeven.

Voeg onderstaande instructie toe aan het scriptpaneel. Deze instructie zal alle gebruikers een voor een uit $csv halen en toevoegen. Tip: aangezien de sessie reeds gestart is in het consolepaneel, zal wat uitgevoerd wordt vanuit het scriptpaneel rekening houden met wat al in het consolepaneel staat. $csv zal dus herkend worden.

Let op dat de volledige code vanaf new-localuser na elkaar geschreven wordt of op meerdere regels telkens eindigend op een backtick als escapeteken (zie bijvoorbeeld na $u.name) daar waar nodig. In de code wordt opgemerkt hoe $wachtwoord een secure string wordt en hoe het aantal jaren wordt toegevoegd wanneer het account vervalt.

Vervolgens kunnen de eigenschappen van een username worden opgevraagd:

get-localuser karen | fl *

fl * wordt gebruikt om alle eigenschappen op te vragen.

Dit is nu werkend op één machine. Stel dat dit op meerdere pc’s geïmplementeerd moet worden, dan kan dit ofwel via een remote sessie (via computer op afstand, zie later), of kan het script en de .csv-file in één map bewaard worden. Vervolgens kan vanaf die map op iedere machine de code worden uitgevoerd. Aan de code moet hiervoor nog één kleinigheidje worden aangepast:

Er is enkel de eerste regel toegevoegd met de importopdracht. Merk op dat verwezen wordt naar .\users.csv, waarbij .\ staat voor de huidige directory. Als het script uitgevoerd wordt, zal PowerShell users.csv ophalen in dezelfde map als waar het script staat. Users.csv moet zich dus op deze locatie bevinden. Alles ziet er goed uit, maar toch werken de nieuwe accounts nog niet. In het aanmeldvenster zijn ze namelijk nog niet aanklikbaar. Test dit uit door af te melden en een poging te doen om aan te melden met een nieuw account. Dit komt omdat de accounts nog niet toegevoegd zijn aan een lokale gebruikersgroep, in dit geval de standaardgroep users. Dit kan op volgende manier in een administrator-PowerShell-sessie:

$users = get-localuser student, gebruiker, toon, karen, wesley

foreach ($u in $users){add-localgroupmember users $u.name}

Tip: indien het om een Nederlandstalige Windows-versie gaat, zal een fout getoond worden dat de groep users niet bestaat. Wijzig de groepsnaam naar gebruikers in dit geval. Eenvoudiger is het om in de instructie waar de gebruiker werd toegevoegd een volgende regel toe te voegen: add-localgroupmember users $u.name

Hier werd een zeer klein script gebouwd, dat van toepassing kan komen. Vaak zullen zulke (grotere) scripts online gevonden worden en is het belangrijk deze op de juiste manier te lezen en te interpreteren, om deze vervolgens zelf te bewerken naar de huidige netwerksituatie.

Handboek PowerShell vlot gebruiken 3e editie

Dit artikel is een hoofdstuk uit PowerShell Vlot gebruiken van Frederik Vanhoo.

In deze geactualiseerde editie van het Handboek PowerShell leer je hoe je zowel Windows PowerShell 5.1 als de nieuwste versie, PowerShell 7.5 kunt gebruiken voor diverse automatiseringstaken en systeembeheer. Je krijgt gedetailleerde Nederlandstalige uitleg om PowerShell-instructies te begrijpen, te wijzigen en toe te passen, waardoor je snel de benodigde kennis en vaardigheden opdoet. Daarnaast maak je gebruik van de PowerShell Integrated Scripting Environment (ISE) en Visual Studio Code als ontwikkelomgevingen. Met deze tools kun je complexe en uitgebreide instructies, scripts en modules creëren. Tot slot biedt het boek een uitgebreid onderdeel met diverse extra’s waarin PowerShell wordt gebruikt. Hierdoor leer je het maximale uit deze krachtige scripttaal te halen.

PowerShell Vlot gebruiken is onder meer te koop bij Standaard Boekhandel.

Schrijf je in op onze nieuwsbrief en ontvang elke week het beste van Clickx in je mailbox.