Windows: H10 - PowerShell
Pagina 1 van 30
Introductie
Windows PowerShell getting started
• a new Windows command-line shell, designed especially for system administrators
• includes an interactive prompt and a scripting environment (onafhankelijk of in combinatie)
• built on top of the .NET Framework common language runtime (CLR) and the .NET Framework
• accepts and returns .NET Framework objects
• introduces the concept of a cmdlet
o a simple, single-function command-line tool built into the shell
o you can use each cmdlet separately, but their power is realized when you use these
simple tools in combination to perform complex tasks
o more than one hundred basic core cmdlets
o you can write your own cmdlets and share them with other users.
• gives you access to the file system on the computer
• Windows PowerShell providers enable you to access other data stores
o such as the registry and the digital signature certificate stores
o as easily as you access the file system
• Windows PowerShell is not a scripting language, or at least it is not only a scripting language.
• PowerShell is an engine designed to execute commands that perform administrative tasks.
o Creating user accounts, Configuring services, Deleting mailboxes, …
• The Windows PowerShell ISE required the Microsoft .NET Framework 3.5 with Service Pack 1.
Interesting keys
Page up Jumps to the first command in the history buffer
Page down Jumps tot he last command in the history buffer
Up Arrow goes back one command in the history buffer
Down Arrow goes forward one command in the history buffer
Home jumps tot he beginning of the command line
End jumps tot he end of the command line
Ctrl+LeftArrow goes to the left one word at a time
Ctrl+RightArrow goes to the left right on word at a time
Tab Completes input (in the console type get-c and press tab, press tab again…)
F7 Shows history buffer (use the up and down arrow keys to navigate the buffer)
Verifying PowerShell version
Control your PowerShell version: $PSVerionTable
How to Start with the Import System Modules Task?
• you can add all available modules to a Windows PowerShell session.
get-module -listAvailable | import-module
How to Start with Administrator Privileges?
WinServer1 & eigen PC
• Rechtermuisknop PowerShell > Run as Administrator
start-process powershell-verb runAs Update-Help
Windows: H10 - PowerShell
Pagina 2 van 30
Asking for Help
Get-Help commandName
• You can also use Help
• PowerShell’s help system uses several parameters to reveal more information about commands
o -detailed
o -examples
o -full (toont alles, inclusief detailed help, per-parameter help, and usage examples)
o -online (opent een webbrowser en toont de cmdlet help van de Microsoft Web site)
Reading Help and Using Parameters
• Sommige parameters verwachten geen waarde (bvb. switches): -Recurse
• Voor andere parameters is er een waarde vereist, waarbij het helpbestand aangeeft wat voor
soort waarde de parameter verwacht: -Exclude <string[]>
• Andere parameters hebben waarden nodig die moeten worden opgegeven om de cmdlet te
laten functioneren: [-Name] <string>
• Sommige parameters zijn optioneel: [-Include <string[]>]
Extending the Shell
Extra cmdlets zijn beschikbaar via snap-ins en modules.
• Get-PSSnapin
• Add-PSSnapin
• Remove-PSSnapin
• Import-Module
• Remove-Module
• Get-Module (Get-Module -ListAvailable | Import-Module)
Navigating the File System
• PowerShell recognizes many command names you already know o Most common file-and-folder management commands from both cmd.exe and common
Unix shells are available o However, the parameters of the commands are often different. o For example, the following command will generate an error: dir /s
• External commands, such as ipconfig.exe, pathping.exe, and so on, continue to run exactly as they always have
o The distinction is that external commands are external executables, whereas commands such as “dir” are internal (or, intrinsic) commands
Hierarchical Storage
• The Windows file system is a hierarchical storage system o It consists of containers (folders, directories), which can contain leaf objects (files) as
well as other containers
• The file system is not the only hierarchical storage system in Windows o The registry, The certificate store, Active Directory
• One of PowerShell’s key design strategies is to adopt a set of techniques or processes, and then use them for similar tasks
o The commands to navigate the registry are the same as those used to navigate the file system
o The commands to navigate Active Directory are the same as those used to navigate the file system
Windows: H10 - PowerShell
Pagina 3 van 30
On Set of Commands for Many Forms of Storage
• The ability to use a single set of commands to navigate many forms of storage is made possible by a PowerShell feature called a PSDrive provider
• The PSDrive provider is an adapter that connects to a storage system and presents it to PowerShell o This enables common commands, like cd and dir, to be used against different kinds of
storage o Commands are passed to the provider of the drive you are accessing, and the provider does
whatever is necessary to implement the command
• Several providers ship with PowerShell by default: o The file system, The registry, The environment variables, The certificate store, IIS,
SQL Server, Active Directory
Managing PSDrives
• Get-PSDrive: geeft een overzicht van alle momenteel beschikbare schijven.
• New-PSDrive: creëert een nieuwe schijf. U moet de naam van de drive opgegeven, de naam van de te gebruiken provider en een startlocatie of pad.
• Remove-PSDrive: verwijdert een bestaand schijf.
PowerShell as cmd.exe or Bash
Path Manipulation
PowerShell Cmdlet
PowerShell alias
cmd.exe bash Purpose
Set-Location sl, cd, chdir ch, chdir cd Verander dir
Get-Location gl, pwd cd pwd Toont huidige dir
Get-ChildItem gci, dir, ls dir ls lijst van de huidige dir-inhoud
Push-Location pushd pushd pushd Bewaar het huidige pad op een stack
Pop-Location popd popd popd Verander neet de laatst pushed dir
File Manipulation
PowerShell Cmdlet
PowerShell alias cmd.exe bash Purpose
Copy-Item cpi, copy, cp copy cp Kopieër file of dir
Remove-Item ri, del, erase, rmdir, rd, rm
del, erase, rmdir, rd rm, rmdir Verwijder file of dir
Rename-Item rni, ren ren, rename mv Hernoem file of dir
Move-Item mi, move, mv move mv Verplaats file of dir
Tekst Manipulation
PowerShell Cmdlet
PowerShell alias
cmd.exe bash Purpose
Get-Content gc, type, cat type cat Geef file inhoud
Select-String ◇ find, findstr grep Toon teksten die overeenkomen met een patroon
Env var Manipulation
PowerShell Cmdlet
PowerShell alias
cmd.exe bash Purpose
Write-Output echo, write echo echo Print strings, variabelen, … naar standaarduitvoer
Set-Variable sv, set set set Stel de waarde van een variabele in / maak een variabele
Windows: H10 - PowerShell
Pagina 4 van 30
Process Manipulation
PowerShell Cmdlet
PowerShell alias
cmd.exe bash Purpose
Get-Process gps, ps tlist, tasklist ps Lijst van alle huidige runnende processen
Stop-Process spps, kill kill, taskkill kill Stop een runnend proces
Help Manipulation
PowerShell Cmdlet
PowerShell alias
cmd.exe bash Purpose
Clear-Host cls, clear cld clear Wis het scherm
Get-Help help, man help man Help over commands
Consistency is Discoverability
• Get-Command
o Geeft eenvoudige lijst met beschikbare commando’s (cmdlets) en functies van alle geladen
modules
o retourneert meer dan Get-Help (ook applications)
o Get-Command accepteert wildcards, Get-Command *proc* toont cmdlets die “proc”
bevatten
o Get-Command heeft een verb parameter, Get-Command -verb get: je ziet alle “Get”
cmdlets
o Get-Command heeft een noun parameter, Get-Command -noun *event* toont alle cmdlets that “event” hebben als deel van noun
Managing Aliases
• You can create your own aliases. You can import and export aliases to share them with
colleagues and coworkers.
• Get-Alias toon teen lijst van alle gedefinieerde aliassen. U kunt ook Dir Alias uitvoeren om een
directory lijst te zien van ALIAS: drive
• New-Alias creëert een nieuwe alias. Je moet de aliasnaam opgeven en de naam van het
commando waar het een alias voor is.
• Del of Rm kan gebruikt worden om aliassen te verwijderen van de ALIAS: drive
• Import-Alias en Export-Alias: aliaslijsten van en naar een bestand importeren en exporteren
Windows: H10 - PowerShell
Pagina 5 van 30
Hoofdstuk 1: Algemeen overzicht
Starten met PowerShell
Tips:
• “Ctrl+C”: uitvoer script afbreken
• commando “CLS”: shell interface schoonmaken
• Tab-completion: PowerShell commando automatisch aanvullen De Shell
• 2 omgevingen: Windows PowerShell
• Windows PowerShell ISE (Integrated Scripting Environment)
Syntax
Get-ChildItem -Path C:\Windows\System32 -Filter *.exe -Recurse
Meestal een WW; met een “Get-Verb” vraag je alle mogelijke werkwoorden; soms geen ww
zoals “New”. Wordt gevolgd door een ‘-e’ of een ‘/’.
WW wordt gevolgd door ZN
Parameters (opties) met daarachter de value (waarde)
Betekenis: toon alle bestanden (Get-ChildItem) uit de map “System32” (-Path) die eindigen op
extensie “.exe” (-Filter), alsook uit alle submappen (-Recurse)
Wildcards
‘*’: vervanging voor alle tekens (*.txt, verslag*.docx, Get-Serv*, *verslag*.txt)
‘?’: vervanging door 1 teken (verslag?.docx, verslag??.docx, verslag?.*, *verslag*.doc?)
Commando’s
• Show: “Show-Command Get-ChildItem” → u krijgt een venster om parameters in te vullen,
vervolgens kiest u copy om commando in de shell te kunne plakken
• Provider: “Get-PSProvider” → lijst van providers zoals: FileSystem, Certificaten, Windows
Register, …
Pipeline
|-teken → uitkomst van een commando doorgeven aan een volgend commando
Vb. print spooler stoppen: Get-Service -Name Spooler | Stop-Service
Cmdlets in de shell
Get commando
• Get-Help
• Get-Command
• Get-History
• Get-Item
• Get-ChildItem
Set commando
• Opgelet: Voorzichtig!
• Set-ACL: rechten op files en shares aanpassen
• Set-ADGroup: AD groepen aanpassen of toevoegen
• Set-ADUser: AD gebruikers aanpassen of toevoegen
• Set-Alias: aliassen aanmaken of wijzigen
• Set-Date: datum en tijd aanpassen
Windows: H10 - PowerShell
Pagina 6 van 30
In- & output
Exporteren
• Export-CSV “Get-ChildItem -Path ‘C:\windows’ | Export-Csv C:\scripts\archief\log.csv”
• Export-XML “Get-ChildItem -Path ‘c:\windows’ -Recurse | Export-Clixml
C:\scripts\archief\log.xml”
• Out-File “Get-ChildItem ‘C:\scripts\archief\*.*’ | Out-File -FilePath
C:\scripts\archief.txt”
• Out-Gridview “Get-ChildItem ‘C:\scripts\archief\*.* | Out-GridView”
• Get-Command -verb out = alle opties met “Out”
• Conversie: “Get-ChildItem -Path C:\scripts\archief\*.* |
• ConvertTo-Html \ Out-File c:\scripts\archief.html” (inhoud van de map “archief”
wegschrijven naar html)
Importeren
• “Import-Clixml -Path C:\scripts\archief\log.xml”
• “Get-Content -Path c:\ scripts\archief\log.xml” (enkel lezen)
Werken vanaf de commandline
Door een bestandsysteem “browsen”
PowerShell ondersteunt oude DOS-commando’s (mbv. aliassen)
• cd: Set-Location
• dir: Get-ChildItem
Aanmaken en verwijderen van bestanden
• Idem als van een object
• New-Item: “New-Item -ItemType file C:\scripts\new.txt”
• Remove-Item: “Remove-Item -Path C:\scripts\new.txt”
• Ook aliassen “del” en “rd” zijn mogelijk
PowerShell drives
• PowerShell herkent standaard uw drives (bv. “C:”)
• Echter is er veel meer mogelijk, nl.: certificaten (Cert), register (HKCU, HKLM), …
Eenvoudige scripts
Een aantal commando’s na elkaar uitvoeren (automatiseren!)
Vereiste: eenvoudige teksteditor als Kladblok of scripteditor als Notepad++
Kan ook in de PowerShell Integrated Scripting Environment (ISE)
Extensie: “.ps1”
Uitvoeren van een script
2 manieren om een script uit te voeren:
1. Via de commandline (cmd): “powershell.exe -noexit c:\script.ps1”
2. In PoweerShell zelf (volledige pad moet worden opgegeven): “.\script.ps1”
Windows: H10 - PowerShell
Pagina 7 van 30
Executionpolicy
• Standaard geen scripts uit te voeren
• Get-ExecutionPolicy
o Restricted: scritps niet toegelaten
o AllSigned: enkel scripts ondertekend door trusted publisher
o RemoteSigned: gedownloade scripts ondertekend door trusted publisher & eigen
scripts
o Unrestricted: alle scripts worden uitgevoerd
• “Set-ExecutionPolicy RemoteSigned” of via ISE (pop-up)
Variabelen
Variabelen in PowerShell
$-teken om variabele te definiëren (Vb. $var = ‘computername’ en ${My Variable} = 5 )
=-teken om waarde toe te kennen
Enkele en dubbele aanhalingstekens
• Enkele aanhalingstekens: letterlijke weergave van een tekst (zoveel mogelijk toepassen)
• Dubbele aanhalingstekens: variabelen worden ingevuld in de tekst; echter niet meer
geüpdatet achteraf
• ‘-teken: variabele als exacte tekst lezen
Verwijderen van een variabele
• “Dir Variabele” → lijst variabelen opvragen
• “Del Variable:<variabele>” → variabele verwijderen
• “Get-Variable | Remote-Variabele” → alle variabelen verwijderen (foutmelding:
standaardvariabelen kunnen niet verwijderd orden, de rest is wel verdwenen)
• “Remove-Variable -Name <variabelenaam>” → nette manier om variabele te verwijderen
• Opgelet: geen $-teken plaatsen, enkel de naam!
Declareren van een variabele
• Van tevoren aangeven wat de inhoud/type (getal, tekst, …) van een variabele is
• Getal: [int]$a = 5
• Tekst: [string]$b = ‘3’ of [string]$b = ‘drie’
Condities
De If-conditie
if(conditie){if actie}[optioneel]elseif(conditie){elseif actie}[optioneel]else{else actie}
PowerShell-conditie Betekent Ook wel bekend als
-eq gelijk aan =
-lt kleiner dan <
-gt groter dan >
-le kleiner of gelijk aan =<
-ge groter of gelijk aan =>
-like lijkt op & of *
Windows: H10 - PowerShell
Pagina 8 van 30
Geneste If
Switch
Loops
Do until
Do {actie} until (conditie)
Expressies gescheiden door ‘;’
Do while
Do {actie} while (conditie)
Nieuwe expressie op nieuwe regel
For loops
For (conditie){actie}
Oneindige lus? Afbreken met Ctrl+C!
Foreach loop
Foreach (item IN set){actie}
Een set kan ook opgevraagd worden…
Een array (@-teken)
Procedures en functies
• Procedure
o Afgescheiden blok code dat een duidelijk op zichzelf staand doel of gebruik heeft
o Meestal niet als zodanig in een script aangeduid
• Functie
o Met keywords aangeduid en duidelijk gedefinieerd
o Blokken code die vaak meermaals worden uitgevoerd
o Heeft duidelijk een kop en een staart
Functies – Argumenten en return codes
Function naam ($arg1, $arg2)
{actie; return $output}
Windows: H10 - PowerShell
Pagina 9 van 30
Werken met COM en WMI
• Wat PowerShell niet zelf kan, kunt u doen met .COM en .WMI
• COM (Component Object Model)
o softwaremodel dat als basis staat van veel MS toepassingen, zoals Office
o Bv.: Excel vanuit de shell of script aansturen
• WMI (Windows Management Instrumentation)
o alle Windows objecten beschikbaar maken
o Windows besturingssysteem uitlezen en managen
COM (Component Object Model)
• Eerst definiëren
o “$variabele = New-Object -comobject Comapp.application”
• Voorbeeld (excel opstarten en waarden invullen)
• Voorbeeld (Internet Explorer opstarten):
WMI (Windows Management Instrumentation)
• “Get-WMIObject -class Win32_class”
• Alles uit Windows besturingssysteem bekijken en bewerken
o opvragen geïnstalleerde besturingssysteem of updates ervan
o uitlezen van hardware specificaties
• Alle WMI-objecten weergeven
o “Get-WmiObject -List -Namespace root\wmi”
• Alle Win32 Cmdlets weergeven
o “Get-WmiObject -List | Where-Object `
{ $_.name -match ‘Win32’}”
Handig om te weten
• Commentaar
o # → 1 regel commentaar
o <# … #> → meerdere regels commentaar
• Parameter – WhatIf
o kijken wat commando doet zonder actie op object te ondernemen
o werkt enkel met acties die bewerking doen op een object (Set, New-, Add-, Remove-, …)
o Voorbeeld: Remove-Item -Path C:\scripts -WhatIf
• Parameter – Confirm
o pop-up-venster in PowerShell ISE waarbij bevestiging wordt gevraagd
• Write-output
o meestal wegschrijven naar console met “Write-Host”
o Andere manier: “Write-Warning”
o Voorbeeld 1:
o Voorbeeld 2:
Windows: H10 - PowerShell
Pagina 10 van 30
Hoofdstuk 2: Variables & constants
Variables & Naming
• New-Variable
• Set-Variable
• Clear-Variable
• Remove-Variable
• Get-Variable
• Dir variable
Managing Variables
$wmi = Get-WmiObject
Win32_OperatingSystem
$wmi.Caption
$wmi.Reboot()
Variable Types
• Common types
o String, Int, Single and Double, Boolean, Array, Hashtable, XML, Char
[int]$a = “5”
[string]$ = “Hello”
Variable Declaration &Strict Mode
• Je moet variabelen niet op voorhand declareren
o PowerShell heeft de Set-StrictMode cmdlet, die de strict mode optie instelt.
Set-StrictMode -version 2.0
Function MyFunction {
Write $var
$var = 1
Write $var
}
MyFunction
Write $var
Enkele en dubbele aanhalingstekens kunnen worden gebruikt voor het afbakenen van tekenreeksen.
Escape Character
• PowerShell’s escape-teken ` wordt gebruikt om de speciale betekenis van het volgende
onmiddellijk weg te nemen.
o Conversie van een spatie naar een letterlijke letter. Dit is handig voor padnamen die
spaties bevatten
o Conversie van een $-teken naar een letterlijk dollarteken. Dit is handig als het
dollarteken als tekst nodig is
• Het escape-teken kan ook de speciale betekenis van de carriage return verwijderen
o Dit proces kan worden gebruikt om een PowerShell-opdracht met één regel in meerdere
regels te splitsen voor een betere leesbaarheid
• Kan worden gebruikt om een speciale betekenis toe te voegen aan bepaalde niet-speciale tekens
o `t creëert een tab
o `n creëert een nieuwe regel
o `r is een return
• help about_escape_characters
Windows: H10 - PowerShell
Pagina 11 van 30
Arrays
• Het toewijzen van variabelen aan objecten, in tegenstelling tot tekst, kan arrays van objecten in
de variabele plaatsen
$var = Get-Service
• Door komma’s gescheiden tekstlijsten worden automatisch geconverteerd naar arrays door de
schaal
$myarray = 1,2,3,4,5,6,7,8,9,0
• Indexnummers worden gebruikt om te verwijzen naar afzonderlijke elementen, waarbij het
eerste object in de array een index van 0 heeft.
$services = Get-Service
$services[0]
$services[1]
• Arrays hebben ook een property Count, waarmee het aantal elementen in de array wordt
weergegeven
$services.count
Hashtables
• Hashtables zijn speciale soorten arrays waarbij elk element bestaat uit key-value pair
o Elke key bevat een value. Van elke value kan worden verwezen door een stipverwijzing
naar de key
PS C:\> $hash = @{"Server1"="192.168.15.4";
"Server2"="192.168.15.11“;"Server3"="192.168.15.26"}
PS C:\> $hash.Server1
192.168.15.4
o Hashtables hebben ook een property Count
o Hashtables kunnen doorgestuurd worden naar Get-Member om andere eigenschappen
en methoden te zien
$hash | Get-Member
Arithmetic operatoren
• Rekenkundige operatoren kunnen wiskundige berekeningen uitvoeren in de shell en worden
door de shell geëvalueerd in standaard order-of operation regels
o Vermenigvuldiging (*), deling (/) van links naar rechts
o Optellen (+) en aftrekken (-) van links naar rechts
o Parenthetische uitdrukkingen worden van links naar rechts geëvalueerd en van de meest
diep geneste expressie naar buiten
• De shell herkent algemene Base-2 values
o KB,MB, GB, TB, KB als 1,024 enzovoort
• Het +-teken kan ook gebruikt worden voor string aaneenschakeling ($var1 + $var2)
+= x += y x = x + y
-= x -= y x = x – y
*= x *= y x = x * y
/= x /= y x = x / y
++ x += 1 x = x + 1
-- x -= 1 x = x - 1
Windows: H10 - PowerShell
Pagina 12 van 30
Vergelijkingsoperatoren
Hoofd vergelijkingsoperatoren
Case-sensitive operatoren
Case-Insensitive operatoren
-eq -ceq -ieq equal to
-ne -cne -ine not equal to
-le -cle -ile less than or equal to
-ge -cge -ige greater than or equal to
-gt -cgt -igt greater than
-lt -clt -ilt less than
Boolean operatoren
• -and returns $True wanneer beide kanten true zijn
• -or returns $True met een of beide kanten zijn true
• -not keert True and False om
– gt 10 –or 10 –gt 4
4 –gt 10 –and “Hello” –ne “Hello”
(4 –gt 10 –and (10 –lt 4 –or 10 –gt 5) –and 10 –le 10
(-not 5 –eq 5) –and (10 –eq 10)
Meer vergelijkingsoperatoren
• -contains vertelt u of een bepaald object binnen een collection bestaat
• -like voert niet-hoofdlettergevoelige vergelijkingen van wildcard strings uit
• -clike voert hoofdlettergevoelige vergelijkingen van wildcard strings uit
• -notlike het logische omgekeerde van -like
• -cnotlike het logische omgekeerde van -clike
• -is vertelt u of een object van een bepaald type is of niet
• -as converteert een bepaald object naar een ander type
Hoofdstuk 3: Scripts & constructs
Scripts
Scripts bevatten een of meerdere opdrachten die u wilt dat de shell in de juiste volgorde uitvoert.
• Het bewerken van scripts kan worden uitgevoerd in elke teksteditor; de PowerShell ISE
o Het schrijven van scripts in de shell is geen goede gewoonte
• Talloze externe partijen bieden alternatieve commerciële en gratis bewerkingsomgevingen
o Idera’s PowerShellPlus
o iTriopoli’s AdminScriptEditor
o SAPIEN Technologies’ PrimalScript
o Quest Software’s PowerGUI
• Schrijf opdrachten direct in een script in Windows PowerShell ISE en test commands door ze te
markeren en op F8 te drukken.
• Houd er rekening mee dat cmdlets zoals Read-Host een invoervenster voor grafische dialoog
genereren in plaats van een command line prompt.
• Breek lange lijnen in verschillende fysieke lijnen door te drukken op Return after the pipe line
character
Get-Process |
Sort-Object VM –descending |
Select-Object –first 10 |
Export-CSV procs.csv
Windows: H10 - PowerShell
Pagina 13 van 30
Prompting
The Read-Host cmdlet
• Enables de creatie van een prompt voor invoer bij scriptuitvoering
Enabling scripting support
• Default zal Windows het uitvoeren van scripts verhinderen
o Kan aangepast worden via Group Policies
o Kan aangepast worden met Set-ExecutionPolicy
• Zes levels die ingesteld kunnen worden:
o Restricted = default
o AllSigned = alle scripts moeten digital getekend worden door een trusted publisher
o RemoteSigned = scripts gedownload vanaf het publieke netwerk moet digitaal getekend
worden
o Unrestricted = alle scripts worden uitgevoerd, mits positief antwoord op prompt v/h
systeem
o Bypass = alle scripts worden uitgevoerd, zonder waarschuwing of prompts
o Undefined = wist de huidige execution policy, behalve wanneer deze bepaald werd via
GPO
• Je kan ook de scope instellen van de execution policy
• Scope van de execution policy: 3 mogelijkheden
o Process: Execution policy is enkel geldig voor het huidige PowerShell proces
o CurrentUser: Execution policy enkel geldig voor de huidige gebruiker
o LocalMachine: Execution policy geldig voor alle gebruikers van de computer
• Meest geschikte instelling?
Set-ExecutionPolicy RemoteSigned
Get-ExecutionPolicy -List
Scripts uitvoeren
• File association aanpassen en .ps1 bestand dubbelklikken wordt afgeraden
• In de console de naam van het script intypen
o Indien locatie script opgenomen is in de path parameter zal het script uitgevoerd worden
o Zoniet: in de map gaan staan waar het script staat
• Script triggeren van buiten de console
o -noexit: houdt console open na uitvoering
Oefening 1
Maak het volgende script aan (bestand met .ps1 extensie) en sla het op in een map. Bedenk wat dit
script doet, en voer het nadien uit van buiten de powershell console.
Windows: H10 - PowerShell
Pagina 14 van 30
Oefening 2
Zoek op wat de speciale betekenis is van de variabele $args. Gebruik je kennis van providers en
oplijstingen opvragen. Zoek ineens ook uit welke speciale variabelen powershell allemaal in huis
heeft!
Oefening 3
Pas het overgetypte script uit oefening 1 aan zodat je bij het oproepen van het script
computernamen kan doorgeven die in het script gebruikt worden. Test uit!
Scripting Constructs
• If…ElseIf…Else
• Switch
• Break
• For
• While / Do / Until
• ForEach
Onthoud altijd: scripting constructs zijn geen vereiste functie van de shell. Gebruik alleen als dat
nodig is. Vaak zijn opdrachten met 1 regel voldoende!!
If … ElseIf … Else
General Construct Notes
Nested Constructs
Typing Constructs
Windows: H10 - PowerShell
Pagina 15 van 30
Switch The Break Keyword
Switch Options
For
While / Do / Until
ForEach
Onhoud: ForEach en ForEach-Object zijn vaak helemaal overbodig!
Changing Your Thinking
• Onthoud: PowerShell hoeft geen scripttaal te zijn!
o PowerShell is echter vooral een oplossing voor administratieve automatisering. Er zijn
meestal opdrachtsequenties die taken uitvoeren en vereisten geen echte scripting.
• Gebruik de PowerShell-gerichte manier om taken te vervullen
o efficiënter
o benodigde taken sneller volbrengen
o vermogen om opdrachtsequenties on the fly te bouwen verbeteren, problemen oplossen
en de klus van IT veel beter te klaren!
Windows: H10 - PowerShell
Pagina 16 van 30
Hoofdstuk 4: WMI, Active Directory en reading/writing files
Working with WMI
WMI = Windows Management Instrumentation
WBEM = Web Based Enterprise Management
WMI = een object georiënteerde interface naar de CIM
WMI zit verankerd in Windows en kan gebruikt worden binnen verschillende soorten scripts, o.a.
VBscript, PowerShell, …
Met WMI hebben we een krachtige tool om
• parameters van het Windows OS op te vragen en/of in te stellen (BIOS instellingen)
• netwerkeigenschappen van systemen op te vragen en/of te manipuleren (TCP/IP)
• services van systemen op te vragen en/of te manipuleren
WMI model
WMI communicatie maakt gebruik van RPC protocol.
• WMI is een uitdaging in combinatie met firewalls
• Windows Firewall aangepast aan werken met WMI
WMI opgebouwd uit verschillende providers die toegang geven tot andere delen van MS
technologie.
WMI geeft op die manier toegang tot een repository van data die gestructureerd is in zogenaamde
namespaces. Elke namespace vertegenwoordigd een andere MS technologie.
Een namespace = een verzameling van gelijksoortige informatie. Aanwezige namespaces kan je
opvragen via WMI control properties (computer management). Alternatief: opvragen van
namespaces met behulp van de powershell scriptomatic.
WMI namespaces & klassen
• Meest gebruikte namespace voor ons: root\CIMv2
• in een namespace zijn klassen aanwezig
o deze definiëren de properties en de methodes van de objecten
o alle klassen opvragen met Get-WmiObject-List
o de juiste klasse vinden die voor jou probleem de (property) of de methode bevat?
o Werken met wildcards en keywords, bvb. Get-WmiObject-List “*bios*”
o Alternatief 1: zoeken op MSDN of scriptcenter
o Alternatief 2: CIM studio gebruiken
• Gebruik CIM studio en Powershell Scriptomatic
o CIM studio enkel in IE gerund als administrator, IE versie instellen op < 9 via F12
o active X toelaten, verrekijker icoon om te zoeken op keywoord (alles aanvinken)
o properties en methodes browsen in CIM studio
o script maken dat alle properties op lijst in scriptomatic
gwmi win32_Volume | get-member
• WMI is constant aan veranderingen en evolutie onderhevig, dus research blijft noodzakelijk!
• Nieuwe namespaces, nieuwe klassen, nieuwe properties en methodes bij nieuwe producten
Get-WmiObject win32_desktop | Select *
Get-WmiObject win32_desktop | Select name, screensaverexecutable
Windows: H10 - PowerShell
Pagina 17 van 30
De manier waarop credentials worden doorgegeven, wordt bepaald door het impersonation leven
1. Anonymous: credentials worden NIET doorgegeven
2. Identify: andere partij mag je credentials zien, maar niet gebruiken
3. Impersonate: andere partij mag je credentials zien en enkel gebruiken om request uit te voeren
4. Delegate: andere partij mag je credentials zien en onbemerkt gebruiken en doorgeven.
Staat default ingesteld op “impersonate”.
Andere credentials dan die van de logged-on user kunnen worden doorgegeven met de
switch -credential (en dan username opgeven, paswoord wordt gevraagd bij uitvoering).
Oefeningen
1. Connecteer met de klasse win32_computersystem
2. Zorg dat je uit die klasse alle properties te zien krijgt
3. Formatteer de output zodanig dat je de systeemproperties wegfiltert (beginnen met een _)
4. Connecteer met de klasse win32_logicaldisk
5. Gebruik de filter switch om enkel de lokale drives te tonen (drivetype 3). Andere drive-types zijn
4 (networkdrive), 5 (CD drive) en 6 (RAM disk)
6. Connecteer met de klasse win32_service en toon van alle services de displayname en hun state
7. Connecteer met de klasse win32_processen en filter op naam explorer.exe
Info opvragen met WMI
• Ook mogelijk om met SQL achtige syntax informatie op te vragen
• gebruik maken van de -query switch
• bovenaan in je script de query definiëren
• in de query definitie hoef je niet alles op te vragen met *, je kan ook selectief te werk gaan
• je kan ook info opvragen van meerdere computers tegelijk op volgende manieren:
Get-WmiObject Win32_Service -computername “PC1”, “PC2”
Get-WmiObject Win32_Service (Get-Content c:\namen.txt)
• De opgelijste computers worden sequentieel gecontacteerd voor de info. Als er een computer
afstaat of niet reageert, zal dit dus de nodige vertragingen en errors veroorzaken.
• Werken met WMI is meestal werken met grote hoeveelheden data = computationally expensive
• om performatie te optimaliseren, is het filteren van data belangrijk
o via Where-Object
o via de -filter mogelijkheid
Windows: H10 - PowerShell
Pagina 18 van 30
Instellingen wijzigen met WMI
• WMI methoden
o Sommige methoden hebben argumenten nodig, andere niet, maar altijd ronde haken
gebruiken!
o Sommige methoden kunnen enkel uitgevoerd worden met voldoende privileges,
mogelijkheid tot gebruik van -enabledAllPrivileges switch
• als de methode argumenten nodig heeft, dan moeten deze doorgegeven worden in de juiste
volgorde!
• Hoe weet je of een methode argumenten nodig heeft?
o Via WMI CIM studio: via edit method parameters
o Via powershell console
([wmiclass]’class-name’).GetMethodParameters(‘method-name’)
• Aanroepen van methoden kan rechtstreeks: Invoke-WmiMethod
invoke-wmimethod -class win32_networkadapterconfiguration -name enableDHCP
• Als er argumenten moeten opgegeven worden voor de methode doe je dit via -argumentlist
invoke-wmimethod -class win32_process -name create -argumentlist notepad.exe
• aanroepen van methoden kan ook onrechtstreeks door eerst object aan te maken end an met de
. notatie de methode op te roepen
$NICs=Get-WmiObject Win32_NetworkAdapterConfiguration | Where {$_.IPEnabled -eq “TRUE”}
foreach($kaart in $NICs) {$kaart.EnableDHCP()}
• Machine rebooten
$ToBoot = get-wmiobject Win32_OperatingSystem
$ToBoot.Reboot()
Restart-Computer
Remoting met WMI
• windows server laat WMI remoting default toe, Windows clients niet!
• Te wijten aan de instelling van de Windows firewall
o instellen via Windows Firewall with advanced security
o nieuwe inbound rule aanmaken
o kiezen voor een pre-defined rule en WMI selecteren
o in domein omgeving doe je het bovenstaande in een GPO
• Get-WmiObject: remote systemen specifiëren om te connecteren; credentials specifiëren
waarmee dit moet gebeuren.
• Probleem: als je de -crendential switch gebruikt moet je voor elk systeem waar je naar
connecteert opnieuw een paswoord ingeven
• Oplossing: Get-Credential gebruiken om een credential object in een variabele op te slaan
$comps= @(“Server1”, “Server2”, “Server3” )
@creds= Get-Credential -credential domein\administrator
Get-WmiObject -computername $comps -credential $creds
• De namen van de machines waar je de informatie van opvraagt, zitten opgeslagen in de _Server
variabele. Default wordt dit echter niet getoond bij het weergeven van output
• Oplossen met een pipeline naar Select-Object
$comps= @(“Server1”, “Server2”, “Server3” )
@creds= Get-Credential -credential domein\administrator
Get-WmiObject -computername $comps -credential $creds |
Select-Object smbiosbiosversion, manufacturer, name, serialnumber, _server
Windows: H10 - PowerShell
Pagina 19 van 30
• Een Powershell remote sessie opzetten naar een andere machine en binnen deze sessie met
WMI aan de slag gaan
• Je hebt dan bepaalde nadelen van WMI niet meer
o WMI = firewall aanpassingen nodig
o WMI remoting moet met local admin account
o de naam van het remote system niet default in output
$comps= @(“Server1”, “Server2”, “Server3” )
@creds= Get-Credential -credential domein\administrator
Invoke-Command -computername $comps -ScriptBlock {Get-WmiObject win32_bios}
-Credentials $creds
• Opgelet voor de consumptie van beschikbare bandbreedte als je WMI informatie van remote
systemen opvraagt!
• Best-practice: de opgevraagde data aan de bron al voldoende filteren en de return data
stockeren (in een variabele of een file) om er op een later tijdstip terug mee te kunnen werken
• Stockeren van return data is uiteraard niet geschikt voor data die vaak aan verandering
onderhevig is.
Readin’ and Writin’ Files
De eenvoudigste en meest directe plaats om gegevens voor langdurig gebruik op te slaan is een
bestand.
PowerShell maakt het lezen en schrijven van eenvoudige tekstbestanden niet alleen gemakkelijk,
maar stelt u ook in staat nog complexere bestanden te maken, zoals XML- en HTML-bestanden.
Manipulation files includes: Creating, Deleting, Copying, Moving, Renaming files and folders.
Navigating the File System
Navigeren naar een andere locatie: Set-Location of Cd
• 1 directory hoger: (relatief) Set-Location ..
• Bovenliggende directory of huidige drive: (relatief) Set-Location \
• Specifiek directory: (absoluut) Set-Location c:\windows
• Directory naam van de omgevingsvariabele: (absoluut) Set-Location $env:windir
• Directory naam van de variabele: (absoluut) Set-Location $home
Relatief pad is afhankelijk van de huidige directory.
• .\test.txt : verwijst naar het bestand test.txt in de huidige directory.
• ..\test.txt : verwijst naar het bestand test.txt in de bovenliggende directory
Absoluut pad is altijd uniek en onafhankelijk van de huidige directory.
Relatief pad omzetten in absoluut pad: Resolve-Path .\test.txt
Character Meaning Example Result
. Huidige directory
ii . Opent de huidige directory in Windows Explorer
.. Bovenliggende directory
Cd .. Verandert naar de bovenliggende directory
\ Root directory Cd \ Verandert naar de bovenste map van een drive
~ Home directory
Cd ~ Verandert naar de directory die PowerShell automatisch aanmaakt in eerste instantie
Nieuwe directories creëren
md test1
New-Item Test2 -type Directory
Windows: H10 - PowerShell
Pagina 20 van 30
Directories en bestanden verwijderen
Remove-Item C:\temp
Remove-Item -Recurse C:\temp Remove-Item testfile.txt -force
Als een directory zeker verwijderd mag worden, gebruik -Recurse (inclusief subdirectories)
Als een bestand tegen schrijven is beveiligd moet u -force gebruiken
Directory contents verwijderen: $recents = [Environment] ::GetFolderPath(“Recent”)
Remove-Item $recents\*.* -whatIf
Directories en bestanden verplaatsen en kopiëren
Move-Item en Copy-Item
Copy-Item C:\temp C:\temp2 Copy-Item -Recurse C:\temp C:\temp2
Wildcard karakters gebruiken:
Copy-Item $home\*.ps1 ([Environment]::GetFolderPath(“Desktop”))
$desktop = [Environment]::GetFolderPath(“Desktop”)
New-Item ($desktop + “\PS Scripts”) -ItemType Directory
Move-Item ($desktop + “\*.ps1”) ($desktop + “\PS Scripts”)
Directories hernoemen
Rename-Item C:\temp C:\temp2 Bestand hernoemen: Rename-Item testfile.txt testfile.csv
Nieuwe bestanden creëren
• Leeg bestand New-Item “new file.txt” -type File
• Out-File en Set-Content Dir > info1.txt
Dir | Out-File info2.txt
Dir | Set-Content info3.txt
Set-Content info4.txt (Get-Date)
Toegang tot bestanden en directories
Vermelding van directory inhoud: Get-ChildItem
Enkel geïnteresseerd in de namen ervan: Get-ChildItem *.ps1 -name
• -recurse : als je wilt dat je zoekopdracht ook elke subdirectory bevat
• -filter of -include : lijst van alle bestanden van een type
• -exclude : bepaalde bestanden onderdrukken
In tegenstelling tot -filter accepteren -include en -exclude wel arrays.
Get-ChildItem: $file = Get-ChildItem c:\autoexec.bat
$ file | Format-List *
Get-Item gebruikt een andere benadering voor toegang tot het bestandsobject, maar met hetzelfde
resultaat: $file = Get-Item c:\autoexec.bat
$file | Format-List *
Speciale directories vinden
• Application data = $env:localappdata
• User profile = $env:userprofile
• Data used in common =
$env:commonprogramfiles
• Public directory = $env:public
• Program directory = $env:programfiles
• Roaming profiles = $env:appdata
• Temporary files (private) = $env:tmp
• Temporary files = $env:temp
• Windows directory = $env:windir
GetFolderPath() methode geeft meer opties
Windows: H10 - PowerShell
Pagina 21 van 30
Paths construeren
• Gebruik Join-Path $path = Join-Path ([Environment]::GetFolderPath(“Desktop”)) “test.txt”
• Gebruik de methoden van Path .NET klas:
$path = [System.IO.path]::Combine([Environment]::GetFolderPath(“Desktop”),“test.txt”)
Methode Beschrijving
ChangeExtension() Verandert de bestandsextensie
Combine() Combineert pad strings; komt overeen met Join-Path
GetDirectoryName() Geeft de directory weer; komt overeen met Split-Path -parent
GetExtension() Geef de bestandsextensie weer
GetFileName() Geef de bestandsnaam weer; komt overeen met Split-Path -leaf
GetFileNameWithoutExtension() Geeft de naam zonder bestandsextensie weer
GetFullPath() Geeft het absolute pad weer
GetInvalidFileNameChars() Lijst van alle karakters die niet toegestaan zijn in een bestandsnaam
GetInvalidPathChars() Lijst van alle karakters die niet toegestaan zijn in een pad
GetPathRoot() Geeft de root directory, komt overeen met Split-Path -qualifier
GetRandomFileName() Geeft een willekeurige bestandsnaam
GetTempFileName() Geef een tijdelijke bestandsnaam in de directory Temp
GetTempPath() Geeft het pad van de directory voor tijdelijke bestanden
HasExtension() True, als het pad een bestandsextensie heeft
IsPathRooted() True, als het pad absoluut is, komt overeen met Split-Path -isAbsolute
• New-PSDrive : Nieuwe schrijf creëren
• Remove-PSDrive : Schijf verwijderen
• Get-PSDrive : Overzicht van schijven krijgen
De inhoud van tekstbestanden lezen
• Get-Content : inhoud van een tekstbestand op te halen
• Select-Object : als je enkel de eerste x lijnen van een bestand wilt lezen
• Select-String : informatie filteren
Bestanden schrijven
1. Omleiden van de uitvoer naar een bestand met behulp van de operator >
2. Out-File
3. Set-Content
Out-File opties:
-encoding Specificeert de karaktercodering die in het bestand wordt gebruikt. Deze codering kan een van de volgende waarden zijn: Unicode, UTF7, UTF8, UTF32, ASCII, BigEndianUnicode, Default of OEM. Unicode is de default encoding type.
-append Wordt toegevoegd aan het bestand in plaats van de inhoud te overschrijven.
-width Bepaalt het maximale aantal karakters op elke regel. Als de regel die wordt geschreven meer dan deze waarde bevat, wordt deze gewoon afgekapt. Default volgt deze switch de waarde die wordt gebruikt door de huidige instellingen van de Windows PowerShell-console.
-force Probeert eventuele beperkingen te overwinnen voor het schrijven naar het uitvoerbestand, zoals het overschrijven van het alleen-lezen attribuut v/h bestand.
-noClobber Voorkomt dat Out-File probeert te schrijven naar het uitvoerbestand als het al bestaat.
-Confirm Vragen om bevestiging voordat u verder gaat met de opdracht.
Windows: H10 - PowerShell
Pagina 22 van 30
Werken met WML
XML = Extensible Markup Language
XML = een documentindeling waarmee u uw eigen markeringen in het document kunt definiëren.
In het algemeen beschrijft en definieert XML gegevens, niet hoe de gegevens op het scherm moeten
verschijnen. Bij XML maakt het niet uit hoe het document er uiteindelijk uit zal zien; zijn enige zorg is
om betekenis te geven aan de gegevens die het bevat.
Een boomstructuur:
XML bestanden lezen
• Get-Content : retourneert alleen de inhoud van het bestand
Om aan Windows PowerShell te vertellen dat u wilt dat het bestand wordt behandeld als een
XML-bestand, moet u de variabele casten met de [xml] tag
[xml] $myXMLfile = Get-Content C:\temp\sample.xml
U hebt toegang tot de verschillende elementen van het XML-bestand door de punt operator te
gebruiken om toegang te krijgen tot elk onderliggende element in de structuur
XML gegevens wijzigen
• .CreateElement() : nieuwe node creëren
• .SetAttribute() en psbase.innertext : de verschillende kenmerken en gegevens invullen
• .AppendChild() : in een boom steken
XML bestanden schrijven
Nu de gegevens zijn bijgewerkt, wilt u misschien doorgaan en de wijzigingen opslaan. U slaat XML-
gegevens op in een bestand door de save methode van het XML-object aan te roepen.
$myXMLFile.save(“C:\temp\sample.xml”)
Objecten opslaan in XML bestanden
Objecten kunnen elk aantal eigenschappen en waarden bevatten en zonder XML is de enige andere
optie om de objecten in een binair formaat op te slaan.
Windows PowerShell biedt u de mogelijkheid om objecten naar en van XML-bestanden net zo
gemakkelijk te exporteren en importeren
• Export-CliXML
• Import-CliXML
Het verwerken van door komma’s gescheiden lijsten
• Import-Csv : als u informatie wilt verwerken uit door komma's gescheiden lijsten
Import-Csv begrijpt de komma-indeling en geeft de gegevens kolom voor kolom weer.
De eerste regel wordt gelezen als een kolomkop
Windows: H10 - PowerShell
Pagina 23 van 30
Administration of Active Directory under Windows 2012
Active Directory module bevat:
• cmdlets bieden de functionaliteit die de grafische Active Directory beheercentrumconsole
van kracht voorziet
• cmdlets communiceren met een webservice die deel uitmaakt van Active Directory in
Windows Server 2008 R2
o De webserver moet op slechts 1 domeincontroller op uw lokale site worden
geïnstalleerd
• Deze webservice kan worden toegevoegd aan Windows Server 2003 en Windows Server
2008 door de AD Management Gateway-service te downloaden en te installeren
Een module toevoegen
Import-Module ActiveDirectory
Eenmaal geladen, voegt de module een reeks opdrachten toe voor het beheer van Active Directory.
U kunt de lijst met opdrachten ophalen met behulp van: Get-Command -module ActiveDirectory
Active Directory: Drive
Naast het toevoegen van de Active Directory module, wordt er ook een PSDrive provider toegevoegd
• Deze provider wijst de AD: drive to uw aanmeldingsdomein
• Het belangrijkste doel van deze schijf is om een beveiligingscontext te bieden voor het
uitvoeren van cmdlets
Wanneer u een Active Directory cmdlet uitvoert, worden automatisch de legitimatiegegevens en het
domein van het huidige AD: drive gebruikt
• Dit elimineert de noodzaak om referenties voor elke opdracht in te voeren
• Omdat het een toegewezen drive is, wordt het ook mogelijk andere drives aan andere
domeinen en inloggegevens toe te wijzen. Cmdlets worden uitgevoerd met de referenties die
aan die drive zijn gekoppeld
• Als u een andere set referenties of een ander domein wilt gebruiken, moet u eerst naar de
juiste toegewezen drive gaan en vervolgens cmdlets uitvoeren
dc Domain component De componenten van een domeinnaam worden gescheiden door punten. De volgorde van componenten in AD gaat van het laagste niveau → hoogste niveau. Als uw domein bvb deploy.com wordt genoemd, verwijst u ernaar in LDAP-terminologie als dc = deploy, dc = com.
ou Organizational unit Gebruik dit om naar OU's te gaan. De financiële OU in het domein deploy.com zou ou = finance zijn, dc = deploy, dc = com. Als u geneste OU's hebt, geeft u eerst een lijst met de diepere OU's. De OU van Cleveland in de OU van Finance in het domein deploy.com zou dat bvb zijn ou = cleveland, ou = finance, dc = deploy, dc = com.
cn container In AD kunt u hiermee navigeren in speciale containers, zoals Gebruikers. De gebruikerscontainer in het deploy.com-domein zou cn = Users, dc = deploy, dc = com zijn.
Active Directory: Forest Info
Forests bieden een beveiligingsgrens voor uw organisatie in AD.
• Get-ADRootDSE = map informatiestructuur voor het domein weergeven
• toont de basisinformatie over uw domein en naamgevingsconventies
Windows: H10 - PowerShell
Pagina 24 van 30
Active Directory: Domain Controllers
Get-ADDomainController -Discover = alle domeincontrollers weergeven
Voeg het domein toe waarnaar u kijkt en u kunt alle DC's in uw omgeving vinden:
Get-ADDomainController -Discover -DomainName contoso.com
Active Directory: Global Catalog servers
GCs bevatten een subset van de gegevens die zijn opgeslagen in AD.
GC's omvatten meerdere domeinen, ze helpen bij gebruikersverificatie en verwerking van het
universele groepslidmaatschap
• weten waar uw GC's zich bevinden, helpt uw AD-omgeving soepel te laten verlopen.
Get-ADForest deploy.com | Format-List GlobalCatalogs
Active Directory: FSMO Roles
Rolnaam PowerShell naam Beschrijving
Schema Master SchemaMaster Houdt het schema of definitie vast voor alle AD-objecten in uw forest. Er kan er maar één zijn voor de hele forest.
Domain Naming Master DomainNamingMaster Bepaalt de toevoeging en verwijdering van domeinen in uw forest. Er kan er maar één zijn voor de hele forest
PowerShell naam Beschrijving
PDCEmulator Verwerkt alle aanvragen voor wachtwoordwijzigingen van uw gebruikers. Het repliceert ook de wijziging in het gehele domein. Er is er één per domein in uw forest.
RIDMaster Sequences the relative IDs (RIDs) voor het hele domein wanneer u nieuwe objecten maakt. De relatieve ID wordt gecombineerd met de domein-SID om ervoor te zorgen dat voor elk nieuw object in het domein een unieke ID wordt gemaakt. Er is er één per domein in uw forest
InfrastructureMaster Hiermee wordt informatie over objecten in het domein bewaard. Het primaire doel is ervoor te zorgen dat de groepen waartoe gebruikers behoren van andere domeinen, correct zijn. Er is er één per domein in uw forest en over het algemeen wordt het niet op dezelfde server geplaatst als een GC.
Get-ADForest deploy.com | Format-Table SchemaMaster, DomainNamingMaster
Get-ADDomain contoso.com | FT PDCEmulator, RIDMaster, InfrastructureMaster
De FSMO-rollen naar een andere server brengen:
Move-ADDirecotryServerOperationMasterRole -Identity server2 -InfrastructureMaster
Active Directory: Forest functional level
Om de forest mode te veranderen:
Set-ADForestMode -Identity deploy.com -ForestMode Windows2008R2Forest
Implicit remoting = proces om de cmdlets van een andere host te gebruiken
Filtering
Filter accepteert wildcard:
Get-ADUser -Filter ‘Name -like “*SvcAccount”’
Get-ADUser -Filter {Name -eq “GlenJohn”}
Windows: H10 - PowerShell
Pagina 25 van 30
Werken met gebruikers, groepen en OU’s
• Get-ADObject = Geeft een overzicht van meerdere AD-objecten, inclusief gebruikers en groepen.
Gebruikt filter, ldapfilter en zoekbasis om de informatie op te vragen. Gebruik dit met format en
out switches om met de uitvoer van de opdrachten te werken.
• Get-ADUser = Geeft de AD-gebruikers in het domein weer. Gebruikt filter, ldapfilter en
searchbase om de informatie op te vragen. Gebruik dit met format en out switches om met de
uitvoer van opdrachten te werken.
• New-ADUser = Creëert een nieuwe gebruiker in uw AD-omgeving. U kunt ook de meeste
eigenschappen beheren. U moet een wachtwoord instellen en het account inschakelen voor
gebruik.
• Set-ADAccountpassword = Stelt het wachtwoord in voor een AD-account. Afhankelijk van hoe u
deze opdracht gebruikt, kunt u een reeks aanwijzingen krijgen om het wachtwoord in te stellen.
• Remove-ADUser = Verwijdert een gebruiker uit AD.
• New-ADGroup = Creëert een nieuwe groep. U kunt ook het groepstype, het bereik en andere
eigenschappen van de groep opgeven.
• Add-ADGroupMember = Hiermee kunt u het lidmaatschap van een AD-groep wijzigen. Gebruik
de opdracht get-ADgroup om een groep te selecteren.
• New-ADOrganizationalUnit = Creëert een nieuw AD organizational unit.
Organizational Units beheren
• Structuur om het enorme aantal objecten te beheren dat het in de loop der jaren zal verzamelen
• Structuur vaneen bedrijf vertegenwoordigen
• Een slecht geplande OU-structuur heeft de neiging een eigen leven te gaan leiden
• Zorg ervoor dat uw model op de juiste manier is gepland voor uw bedrijf
Organizational Units creëren
New-ADOrganizationalUnit “Sales” -Path “OU=departments,DC=tactig,DC=local”
Organizational Units verwijderen
Remove-ADOrganizationalUnit “OU=Sales,OU=departments”,DC=tactig,DC=local”
Wanneer er submappen zijn, -Recursive meegeven
Organizational Units wijzigen
Set-ADOrganizationalUnit “OU=departments”,DC=tactig,DC=local”
-Description “Department-level OUs”
Manager beheren:
1. binden aan het gebruikersobject van de person die de manager wordt
$user = Get-ADUser -Filter {samAccountName -eq “nora”}
2. Stel de manager in op de OU
Set-ADOrganizationalUnit “OU=departments,DC=tactig,DC=local” -ManagedBy $user
Gebruikeraccounts creëren
New-ADUser -SamAccountName “Kimberly” -Name “Kim” -Surname “De Clercq” -DisplayName
“Kimberly De Clercq” -Path “CN=users,DC=tactig,DC=local”
Hiervoor zijn vele parameters beschikbaar.
Gebruikeraccounts wijzigen
Set-ADUser -Identity “CN=Kimberly,CN=users, DC=tactig, DC=local” -AccountExpirationDate
12/10/2019
Windows: H10 - PowerShell
Pagina 26 van 30
Welke wachtwoorden verlopen binnenkort?
Search-ADAccount -AccountExpiring -TimeSpan 90.00:00:00
Wachtwoorden wijzigen
Set-ADAccountPassword -Identity “CN=Kimberly,CN=users, DC=tactig, DC=local”
Set-ADAccountPassword -Identity Kimberly
-oldPassword (ConvertTo-SecureString -AsPlainText “p@ssw0rd” -Force)
-NewPassword (ConvertTo-SecureString -AsPlainText “azert@12345” -Force)
Reset het wachtwoord van een gebruiker als de gebruiker het is vergeten of als het huidige
wachtwoord van de gebruiker niet beschikbaar is:
Set-ADAccountPassword “CN=Kimberly,CN=users, DC=tactig, DC=local” -Reset
-NewPassword (ConvertTo-SecureString -AsPlainText “p@ssw0rd” -Force)
Wachtwoord wijzigen bij de volgende login:
Set-ADAccountPassword “CN=Kimberly,OU=users,DC=tactig,DC=local”
-ChangePasswordAtLogon $true
Gebruikersaccount beheren
$user = Get-ADUser -Identity Kimberly
Properties wijzigen van het huidige object: $user.Enabled = $true
Verplaats het huidige object terug: Set-ADUser -Instance $user
Gebruikersaccount verwijderen
Remove-ADUser -Identity “CN=Kimberly”,OU=users,DC=Tactig,DC=local”
Gebruiker identificiëren:
• Distinguished Name (DN)
• SamAccountName
• Globally Unique Identifier (GUID)
• SID
AD opzoeken voor gebruikersobjecten die aan bepaalde criteria voldoen:
Search-ADAccount -AccountDisabled | where
{$_.ObjectClass -eq ‘user’} | Remove-ADUser -Confirm
Default locatie voor gebruikeraccounts
• CN=Users,<domain DN>
• CN=Computers,<domain DN>
U kunt de default locatie omleiden waar nieuwe gebruikersobjecten worden gemaakt:
Redirusr.exe OU=DefaultUsers,DC=Tactig,DC=Local
Gebruiker groepen beheren
Maak groepsobjecten die 1 of meer AD-beveiligings-principals bevatten: gebruikers, computers,
MSA's en groepsobjecten die in andere groepen zijn genest.
Resourcemachtigingen toewijzen aan een groepsobject
• die machtigingen worden toegewezen aan elke beveiligings-principal in die groep
• i.p.v. de machtigingen voor afzonderlijke beveiligings-principals 1 voor 1 toe te wijzen
Windows: H10 - PowerShell
Pagina 27 van 30
Gebruikersgroepen toevoegen en verwijderen
Distribution Groups:
New-ADGroup -Path “CN=users,DC=Tactig,DC=local” -name “Mailing” -GroupScope Universal
-GroupCategory Distribution -DisplayName “Mailing”
Remove-ADGroup -Identity “CN=Mailing”,OU=Users,DC=Tactig,DC=local”
Gemeenschappelijke attributen
GroupScope DomainLocal 0
Global 1
Universal 2
GroupCategory Distribution 0
Security 1
Security Groups:
New-ADGroup -Path “OU=Users,DC=Tactig,DC=local” -name “Boekhouding” -GroupScope Universal
-GroupCategory Security -DisplayName “Boekhouding”
Remove-ADGroup -Identity Boekhouding
De scope en Type van een groep veranderen
Set-ADGroup -Identity Boekhouding -GroupCategory Distribution
Set-ADGroup -Identity Maililng -GroupScope Global
Alle informatie van een groep weergeven
Get-ADGroup -Filter * -Properties Name, ManagedBy | Format-Table Name, ManagedBy
Een groep verplaatsen naar een andere OU
Move-ADObject -Identity “CN=SalesAdmin,OU=Sales,DC=Tactig,DC=local”
-TargetPath “OU=Groups,DC=Tactig,DC=Local” -server “FRABRIKAM-SRV1:60000”
Lidmaatschap van een groep weergeven
Get-ADGroupMember -Identity Users
Om het lidmaatschap van geneste groepen binnen de opgegeven groep op te nemen: -Recursief
Gebruikers toevoegen en verwijderen in een groep
Add-ADGroupMember -Identity “CN=Mailing,CN=Users,DC=Tactig,DC=Local” -Members Demo
Remove-ADGroupMember -Identity “CN=Mailing,CN=Users,DC=Tactig,DC=Local” -Members Demo
Lidmaatschap van een groep kopiëren naar een andere groep
Add-ADGroupMember -Identity SalesUsers -Recursive |
Foreach {Add-ADGroupMember -Identity ProjectUsers -Member $_ }
Computeraccounts beheren
New-ADComputer: Creëert een nieuw computer object in het domein
Remove-ADComputer: Verwijdert een bestaand computer object van het domein
Get-ADComputer: 1 of meer computerobjecten worden opgehaald op basis van de criteria die u
opgeeft bij het uitvoeren van de cmdlet
Set-ADComputer: Kan worden gebruikt om de eigenschappen van een computerobject te wijzigen
Pre-creërende computeraccounts
Stel de eigenschappen in op het moment dat deze wordt gemaakt:
New-ADComputer <computername>
Windows: H10 - PowerShell
Pagina 28 van 30
Computeraccount properties beheren
Het enige dat u hoeft te doen, is de naam van de computer en de kenmerken die u wilt wijzigen
specifiëren
• Het is niet nodig om te weten waar de computer zich bevindt in de OU structuur
Set-ADComputer tom-laptop -Description “Toms Windows 7 Laptop”
Er is geen parameter voor elk attribuut dat u wilt aanpassen
• Gebruik de parameter Replace om de waarde van een kenmerk op naam te vervangen
Set-ADComputer tom-laptop -Replace @{department=”Sales”}
Computeraccount verwijderen
Remove-ADComputer tom-laptop -Confirm:$false
De aanwezigheid van de parameter Confirm aan het einde van de opdracht zorgt ervoor dat u
volgende melding niet krijgt: 'Weet u zeker dat u wilt doorgaan?
PowerPoint PowerShell
Commando’s
Net zoals in linux mogelijkheid om opdrachten uit te voeren vanuit prompt
Soorten commando’s
• Rekenkundige bewerkingen: 2 + 2 (drukt 4 af naar console)
• Afdrukken van tekst: “Dit is tekst” of Write-Host <tekst>
• Oproepen van een functie: functienaam
• Uitvoeren van een script: . .\scriptNaam.ps1
Eerste keer Set-ExecutionPolicy RemoteSigned uitvoeren voor rechten
Opgelet: .123 zal 0,123 afdrukken en geen script uitvoeren!
Regels die beginnen met # zijn commentaar
Verschillende instructies combineren op 1 rij met behulp van >>
• Voorbeeld:
switch ($var) {>> 1 { "Je koos voor de eerste optie" }>> 2 { "Je koos voor de tweede optie" }>>
3 {"Je koos voor de derde optie" }>> default { "Je maakte een ongeldige keuze" }>> }
Variabelen
Variabele-naam
Beschrijving
$^ Bevat het eerste teken van de laatste lijn die ingevoerd werd in de shell
$$ Bevat het laatste teken van de laatste lijn die ingevoerd werd in de shell
$_ Het huidige object in de pipeline; kan onder andere gebruikt worden in scripts, filters, where-clausules en switch-statements.
$? Bevat de ‘success/fail’ – status van het laatst uitgevoerde statement
$Args Wordt gebruikt bij het creëren van functies die parameters vereisen
$Error Bevat de laatste error die gegenereerd werd tijdens het uitvoeren van een statement
$foreach Verwijst naar de enumerator in een foreach-lus
$HOME The homedirectory van de gebruiker; verwijst naar %HOMEDRIVE%\%HOMEPATH%
$true Boolean ‘waar’
$false Boolean ‘vals’
$null Een null-object
Gereserveerde variabelen
$Args.Count = aantal argumenten
Windows: H10 - PowerShell
Pagina 29 van 30
Gebruiker kan ook variabelen definiëren
• $variabeleNaam(combinatie van a-z, A-Z, 0-9)
• Indien niet standaard teken in de naam, dan naam binnen accolades:
${dit#is@alternatief}, ${!@#$%|*()}
Type variabele
Type variabele hangt af van de inhoud
Voorbeelden:
• $x = 4 type = integer
• $x = “4” type = string
Bijna alle basistypes uit .Net zijn bruikbaar in Powershell
Expliciet casten
$var = [type]waarde
Voorbeelden:
• $x = [int]”4”
• $a = [xml]”<ouder><kind>Hello</kind><kind>World</kind></ouder>”
Tabellen
Verschillende warden scheiden door komma
Voorbeelden:
• $tabel = 1,2,3,”test”
Waarde ophalen door variabelen te indexeren
• $tabel[3] Drukt “test” af in console
Eigenschappen en methodes
Welke eigenschappen en methodes zijn beschikbaar voor een bepaald type?
• Get-Member
Operaties (analoog aan .Net)
= Kent de waarde v/h argument toe aan de variabele
+= Telt waarde v/h argument op bij waarde v/d variabele en slaat resultaat op in variabele
-= Trekt waarde v/h argument af v/d waarde v/d variabele en slaat resultaat op in variabele
*= Vermenigvuldigt waarde v/h argument met de variabele en slaat resultaat op in variabele
/= Deelt de waarde v/d variabele door het argument en slaat het resultaat op in de variabele
%= Slaat de rest van de deling v/d variabele door het argument op in de variabele
-lt Kleiner dan
-le Kleiner dan of gelijk aan
-gt Groter dan
-ge Groter dan of gelijk aan
-eq Gelijk aan
-ne Niet gelijk aan
-contains Controleert of het argument na de operator voorkomt in het argument voor de operator
-notcontains Controleert of het argument na de operator niet voorkomt in het argument voor de operator
-like Vergelijkbaar met -eq, maar kan wildcards verwerken.
-notlike Vergelijkbaar met -ne, maar kan wildcards verwerken.
-match Controleert of het argument voldoet aan een reguliere expressie
-notmatch Controleert of het argument niet voldoet aan een reguliere expressie
Windows: H10 - PowerShell
Pagina 30 van 30
Conditiestructuren
Analoog aan .Net
If(conditie) { instructies }
else { instructies }
Switch(var) {
waarde1 { instructies }
waarde2 { instructies }
…
default { … }
}
Herhalingsstructuren
Analoog aan .Net
For($i=0; $i-lt 10; $i++) { instructies }
Foreach($i in $collectie) { instructies }
While(conditie) { instructies }
Tips en Tricks
PowerShell ISE
Gebruik de PowerShell ISE (Integrated Scripting Environment) om PowerShell aan te leren.
CmdLet "Get-Help"
Met de CmdLet "Get-Help", gevolgd door een commando, krijgt u meer info te zien over dit
commando (bv. "Get-Help Set-Alias"). Gebruik de parameter -Full om voorbeelden te zien van hoe
het commando kan worden gebruikt en de parameter -ShowWindow om de info in een apart
venster te tonen.
CmdLet "Get-Command"
Zoekt u een CmdLet en de info hierover, dan gebruikt u best "Get-Command" die u meer info zal
bezorgen dan "Get-Help" (bv. "Get-Command *util*" voor een lijst van CmdLets met "util" in de
naam).
Parameter "WhatIf"
Met Set-, New-, Add-, Remove- CmdLets wijzigt u de configuratie of data op uw systeem. Om zeker te
zijn dat u de juiste zaken wijzigt, kunt u met de parameter "-WhatIf" na uw commando zicht krijgen
op wat PowerShell exact aan het systeem zal veranderen. Op die manier is er nog een controle
vooraleer u de wijzigingen definitief doorvoert.