Download as pdf or txt
Download as pdf or txt
You are on page 1of 43

Powershell en Active

Directory

• Hoofdstuk 8

Elfde-Liniestraat 24, 3500 Hasselt, www.pxl.be


Powershell & Active Directory
1. Modules
2. Users en groups
SamAccountName vs User Principal Name
3. Errorhandling
4. Externe data gebruiken
5. Folders en permissies
1.Modules
• ook andere producten gebruiken met PowerShell.
• Exchange
• MSSQL
• SCCM
• applicaties van derden.
• Het lijk dat deze applicaties of services hun eigen PowerShell
Management Shell hebben, dat is niet waar.
• menu Tools : “Active Directory Module for Windows PowerShell”
• Bijv Exchange installeren : icoon erbij “Exchange Management Shell”
• beide snelkoppelingen => normale PowerShell en laden desbetreffende module.
Modules

• Het geheim schuilt dus in de diverse modules die er voor PowerShell


zijn.
• Door een module te importeren heb je er commando’s, eigenschappen en
parameters bij, specifiek gericht op het product waarvoor je de module laadt.
• Met het commando Get-Module -ListAvailable kun je een overzicht
opvragen van de modules die bruikbaar zijn.
Modules
Modules
• module laden => Import-Module
• Bijv module Active Directory laden : Import-Module ActiveDirectory

• Vervolgens: opvragen welke cmdlets beschikbaar zijn :


Get-Command -Module ActiveDirectory
Modules
2.Users en groups
get-help *user*

• Via PS gegevens gebruiker opzoeken:


• Als je de cmdlets in de module Active Directory hebt bekeken zie je dat er
diverse commando’s zijn, waaronder Get-ADUser.
• Voor meer uitleg kun je gebruikmaken van
Get-Help Get-ADUser -Full
• Daaruit blijkt dat we de parameter - Identity kunnen gebruiken.
Get-ADUser -Identity administrator
Get-ADUser administrator
• Om alle gebruikers te zien is het volgende commando handig:
Get-ADUser -Filter *

Get-ADUser (ActiveDirectory) | Microsoft Learn


Users en groups
• Of, om alle eigenschappen van een gebruiker te zien:
Get-ADUser -Identity administrator -Properties *
• Andere mogelijkheden om bijv. maar een aantal eigenschappen te tonen:
Get-ADUser -Identity administrator | Format-Table Name, SamAccountName,
Enabled

• Ook kun je deze informatie natuurlijk weer opslaan in een bestand.


SamAccountName vs User Principal Name
• SamAccountName
• The samAccountName attribute is the user logon name used to support clients and servers from a
previous version of Windows ( Pre-Windows 2000).

• The user logon name format is : DomainName\testUser.

• samAccountName must be unique among all security principal objects within domain.

• The samAccountName should be less than 20 characters.

• Query for the new name against the domain to verify that the samAccountName is unique in the
domain.

• The USERNAME environment variable is the samAccountName even when logging with UPN
SamAccountName vs User Principal Name
• UserPrincipalName - (UPN)
• UPN = Internet-style login name based on the Internet standard RFC 822.

• The user logon name format is : testUser@DomainName.com.

• UPN must be unique among all security principal objects within the directory forest.

• advantage using UPN: same as users email address (remember only 1 name)

• UPN is optional, it can be assigned or not when the user account is created.

• UPN : unaffected by changes to other attributes of the user object,


• for example, if the user is renamed or moved, or changes to the domains in the tree, for example, if a parent domain
was renamed or a domain was moved. Thus, a user can keep the same login name, although the directory may be
radically restructured.
Users en groups
• identiteit gebruiker bewerken
• => bij de gebruiker ‘administrator’ is een aantal velden in AD niet voorzien van
gegevens, waaronder ‘company’ en ‘country’.
• => deze velden waarde geven met Set-ADUser.
Set-ADUser -Identity administrator -Company PXL -Country BE
Users en groups
• gebruiker in security-groep plaatsen
• eerst groep aanmaken
• Vb Global Group met naam “IT”
New-ADGroup -GroupScope Global -Name IT

• gebruiker (testuser) lid maken van de groep IT


• => cmdlet Add-ADGroupMember.
Add-ADGroupmember -Identity IT -Members testuser
Users en groups
• We gaan eens kijken naar de mogelijkheden van de cmdlet
New-ADUser.

New-ADUser (ActiveDirectory) | Microsoft Learn


Users en groups
• deze cmdlet heeft ontzettend veel parameters.
• deze komen overeen met de eigenschappen van het AD account

• opbouw van een PowerShell-regel.


New-ADUser -name "Voornaam Achternaam" -AccountPassword `
(ConvertTo-SecureString -AsPlainText "#1Geheim" -Force) `
-Displayname "Voornaam Achternaam" `
-SamAccountName "achternaam" `
-Enabled $true

• Example 4: New-ADUser -Name "ChewDavid" -Accountpassword (Read-Host -


AsSecureString "AccountPassword") -Enabled $true
Users en groups
• bij het toevoegen van een wachtwoord : nog wat extra’s nodig is.
• wachtwoord moet eerst omgezet worden naar een SecureString.

• Ander parameters : ‘homefolder’ , wel of niet verlopen wachtwoord, …

• Belangrijk : wachtwoorden veilig bewaren.


• Wachtwoord opnemen in een script kan soms niet anders.
3. Errorhandling
• Natuurlijk kunnen er fouten ontstaan tijdens het uitvoeren van een
PowerShell-script.
• Dat kan komen doordat er een fout in de code zit of het script kan
gewoonweg niet worden uitgevoerd.
• In onderstaand voorbeeld wordt een commando uitgevoerd naar
een bepaalde computer. De computer is echter onvindbaar,
waardoor een foutmelding wordt gegenereerd.
Errorhandling

• Het is netter en vaak efficiënter om dergelijke fouten al eerder af te


vangen en waar nodig een melding te geven.
Errorhandling
• PowerShell => Try, Catch en Finally voor errorhandling
• In blok Try: Hetgeen je wil testen
• In blok Catch: Fouten opvangen en doorgeven aan blok Catch.
• In blok Finally: wordt altijd uitgevoerd (blok is niet verplicht, je mag
het ook weglaten)
Try { server niet online => uitvoer wordt gestopt door
Get-Service -ComputerName server2 ` de parameter -ErrorAction stop en wordt de fout
onmiddellijk doorgegeven aan het blok Catch.
-ErrorAction Stop
}
Catch {
Write-Host "Niet gelukt!"
}
Errorhandling
• principe verder bekijken: bijv gebruiker zoeken in AD
• Het doel is:
• opvragen van een naam via userinput en deze naam opslaan in een variabele;
• de gebruiker met deze naam zoeken in Active Directory;
• als de gebruiker niet gevonden kan worden de foutmelding weergeven.
$error.Clear() = variabele $error leeg maken (=verwijderen oude foutmeldingen
uit het geheugen)
blok Try:

Errorhandling
Get-ADUser zoekt gebruiker in AD
-ErrorAction stop = stopt verdere uitvoering als gebruiker niet bestaat
blok Catch
fout : ook “uitzondering” of “exception” genoemd.
hier wordt naar de fout verwezen door type aan te geven [System.exception].
$error.Clear() Je mag [System.exception] in dit geval ook weglaten
= onderliggende .NET exception die overeenkomt met de fout die gebeurde.
[string] $username = Read-Host ` $_ = huidige object (variable) (om variable niet opnieuw te typen)
-Prompt "Vul gebruikersnaam in ..." $_.Exception.Message : bevat het eigenlijke antwoord van server/AD
twee meldingen : “gewone tekst” + “ foutbericht zelf”
blok Finally = altijd uitgevoerd: goed voor foutmeldingen
Try { If-statement om te bepalen of er fouten zijn of niet.
Indien MEER dan 0 => foutmelding naar het scherm geschreven
Get-ADUser -Identity $username ` anders wordt een succesmelding weergegeven.

-ErrorAction Stop }
Catch [System.exception] {
Write-Warning "Gebruiker niet gevonden"
Write-Warning -Message ($_.exception.message) }
Finally {
If ($error.Count -gt 0) {write-Host "Er zijn fouten opgetreden"}
else {Write-Host "Gebruiker $username is gevonden"} }
Errorhandling
• Door de variabele $error leeg te maken ($error.Clear()) verwijder je
eventuele foutmeldingen die ervoor zijn opgetreden uit het geheugen.
• Het commando in het blok Try zoekt de gebruiker in Active Directory.
• Door de parameter -ErrorAction stop toe te voegen, stopt de verdere
uitvoering van de cmdlet als de gebruiker niet bestaat.
• Een fout wordt ook wel een uitzondering of exception genoemd. In het
blok Catch wordt daarnaar verwezen door het type aan te geven
[System.exception].
• Je mag [System.exception] in dit geval ook weglaten
• Meer info: https://www.gngrninja.com/script-ninja/2016/6/5/powershell-getting-
started-part-11-error-handling
Errorhandling
• In het blok Catch worden er twee meldingen naar het scherm
geschreven.
• De eerste is een gewone tekst.
• De tweede geeft het foutbericht zelf.
Errorhandling
• Dan blijft nog over het optionele blok Finally.
• Alles wat hier staat wordt sowieso uitgevoerd en is daardoor
uitermate geschikt voor het verwerken van de foutmeldingen. Zo kun
je de foutmeldingen schrijven in een logbestand of per mail
versturen.
Finally {
If ($error.Count -gt 0) {write-Host "Er zijn fouten opgetreden"}
else {Write-Host "Gebruiker $username is gevonden"}
}
Errorhandling
• In bovenstaand voorbeeld wordt een If-statement gebruikt om te
bepalen of er fouten zijn of niet. Als er mee dan 0 fouten zijn wordt
een foutmelding naar het scherm geschreven en anders wordt een
succesmelding weergegeven.
Errorhandling
• Je kan hetzelfde met onderstaande constructie bekomen
$error.Clear()
[string] $username = Read-Host `
-Prompt "Vul gebruikemnaam in ..."
Try {
Get-ADUser -Identity $username `
-ErrorAction Stop
Write-Host "Gebruiker $username is gevonden“ # deze cmdlet wordt niet
# uitgevoerd bij een fout
}
Catch [System.exception] {
Write-Warning "Gebruiker niet gevonden"
Write-Warning -Message ($_.exception.message) # niet noodzakelijk
Write-Host "Er zijn fouten opgetreden"
}
4. Externe data gebruiken
• Creatie nieuwe gebruikeraccounts
• => soms aardige klus als het handmatig gebeurt en foutgevoelig
• => soms heeft personeelszaken een DB met
• alle namen
• Andere persoonlijke gegevens
• => Deze DB kan geëxporteerd worden naar een CSV-formaat
(comma-separated values) – waarden gescheiden door komma
• Met Microsoft Excel kan bijv dergelijk bestand worden gemaakt
Externe data gebruiken
CSV bestand gebruiken om gebruikeraccounts te creëren in AD
• 1) leeg Excel-bestand (dataAD.xlsx)
• 2) kolomnamen invoeren
• 3) data/kolommen invullen (5 lijnen)

• 4) Excel menu - Opslaan als CSV (import_ADUsers.csv)


• 5) Inhoud tonen met Powershell: Get-Content -path c:\import_ADUsers.csv
script waarmee 1 gebruiker in AD wordt gemaakt:
New-ADUser -name "Voornaam Achternaam" -AccountPassword `
(ConvertTo-SecureString -AsPlainText "#1Geheim" -Force) `

Externe data gebruiken


-DisplayName "Voornaam Achternaam" `
-SAMAccountName "achternaam" `
-Enabled $true

CSV bestand importeren:


• 1) cmdlet Import-CSV gebruikt CSV lijst voor het maken van de gebruikeraccounts:
Import-Csv -delimiter ";" -path C:\import_ADUsers.csv
• 2) koppelen (of ‘mappen’) $users = Import-Csv -Delimiter ";" -path C:\Import_ADUsers.csv
kolomnamen van CSV-bestand ForEach ($user in $users)
{
aan de veldnamen die AD $fullname = $user.firstname + " " + $user.lastname
verwacht (via variabelen) $firstname = $user.firstname
$lastname = $user.lastname
$domain = "@pxl.local"
$upn = $user.lastname + $domain
$ou = $user.ou
$password = $user.password
$driveletter = "H:"
$homefolder = $user.homefolder
$setpassword = ConvertTo-SecureString $password -AsPlainText –Force

OPGELET: HIER KOMT NOG CODE => zie slide 36


}
Externe data gebruiken
• ln de eerste regel sla je het importeren van het CSV-bestand op in de
variabele ($users). Tevens geef je aan dat de velden in het CSV- bestand
van elkaar gescheiden worden door een ;
• Vervolgens ga je met een ForEach-loop elk object ($user) in de ver-
zameling ($users) langs en sla je eigenschappen van het object op in
variabelen. Bijvoorbeeld bij de variabele $homefolder.
• Van het object $user wordt de eigenschap homefolder (= kolomnaam)
opgeslagen in de variabele $homefolder.
• De waarde achter de punt is dus de kolomnaam in je CSV-bestand.
• Uiteraard kun je waardes combineren.
• Dat zie je bijvoorbeeld gebeuren bij de variabele $fullname of $upn.
script waarmee 1 gebruiker in AD wordt gemaakt:
New-ADUser -name "Voornaam Achternaam" -AccountPassword `
(ConvertTo-SecureString -AsPlainText "#1Geheim" -Force) `

Externe data gebruiken


-DisplayName "Voornaam Achternaam" `
-SAMAccountName "achternaam" `
-Enabled $true

• Nu je alle waardes hebt opgeslagen in variabelen kun je deze gaan


gebruiken in combinatie met het commando New-ADUser:
New-ADUser -Name $fullname -Displayname $fullname `
-GivenName $firstname -surname $lastname `
-SamAccountName $user.lastname -Homedrive $driveletter `
-HomeDirectory $homefolder -UserPrincipalName $upn -Path $ou `
-AccountPassword $setpassword -Enabled $true -PassThru
• veldnamen van AD worden ‘gevuld’ met de waarden die opgeslagen
zijn in de variabelen. => noemen we ‘mappen’ van de veldnamen.
Externe data gebruiken
• Als je de variabelen en de code hierboven gaat combineren ben je al
aardig op weg naar een werkend script.
• Wat in de code nog niet staat is het maken van de homefolders zelf.
Met het script wordt in de eigenschappen van het AD-account alleen
aangegeven waar de homefolder te vinden is.
5.Folders en permissies
• PS: ook voor het maken, wijzigen en verwijderen van folders en het
lezen, kopiëren en wijzigen van rechten.
• => echter gebruikmaken van het onderliggende framework (.Net) als je iets
meer met rechten wilt doen.
• 1) met Get-ACL permissies van een folder (C:\Homefolders) opvragen.
• Maak de folder aan als deze niet bestaat
ACE = access control entry

Folders en permissies
• Vervolgens voegen we daar voor de groep personeel leesrechten (read) aan toe.
Uiteraard moet de groep wel in AD bestaan.
$path = "C:\Homefolders" $path krijgt een waarde toegewezen
$group = "personeel" $group krijgt een waarde toegewezen
$acl = Get-Acl $path $acl krijgt als inhoud de huidige permissies van de variabele $path.

$rule = New-Object ` $rule wordt gevuld met een commando (New-Object) waarna het
framework wordt aangesproken om deze uit te voeren.
System.Security.AccessControl.FileSystemAccessRule ` • $group = groep personeel
($group, "read", "ContainerInherit, ObjectInherit", "none", ` • Read = Leesrechten
"allow") • ContainerInherit = ACE wordt geërfd door
subfolders
•Objectinherit = ACE wordt geërfd door de
bestanden in de folder(s)
$acl.AddAccessRule($rule) De rule uit regel 4 wordt toegevoegd aan de variabele $acl
Set-Acl $path $acl permissies (variabele $acl) worden toegepast op de va- riabele $path.

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule ($group, "read", "ContainerInherit, ObjectInherit", "none", "allow")


Folders en permissies
• Regel 1 De variabele $path krijgt een waarde toegewezen.
• Regel 2 De variabele $group krijgt een waarde toegewezen.
• Regel 3 De variabele $acl krijgt als inhoud de huidige permissies van
de variabele $path.
• Regel 4 De variabele $rule wordt gevuld met een commando (New-
Object) waarna het framework wordt aangesproken om deze uit te
voeren.
• Regel 8 De rule uit regel 4 wordt toegevoegd aan de variabele $acl.
• Regel 9 De permissies (variabele $acl) worden toegepast op de va-
riabele $path.
Folders en permissies
• Regel 5 behoeft wat extra uitleg. Zoals eerder aangegeven kan
PowerShell zelf (nog) niet ACL’s (access control lists) wijzigen. Daar-
voor wordt teruggevallen op het .Net Framework. In de code zie je
dat terug als:
System.Security.AccessControl.FileSystemAccessRule
Folders en permissies
• Vervolgens worden tussen haakjes de waarden doorgegeven:
• $group
In dit voorbeeld de groep personeel
• Read
Leesrechten
• ContainerInherit
De ACE (access control entry) wordt geërfd door subfolders
• Objectinherit
De ACE wordt geërfd door de bestanden in de folder(s)
Folders en permissies
Folders en permissies
• Vervolgens worden tussen haakjes de waarden doorgegeven:
• None
In dit voorbeeld staat deze voor de Propagationflag, hiermee kun je de ACE
verspreiden naar alle child-objecten die zich al in de folder bevinden.

• Allow
Hiermee wordt het access control type op allow gezet. Een andere
mogelijkheid is deny.
Folders en permissies
• The table below details how a rule will be apply to the current object
and child objects based on the flags set in the access rule.
Folders en permissies
• De vier access controls kun je eventueel ook onderbrengen in varia-
belen en dat is weer makkelijk om in een script te kunnen gebruiken:
$rights = [System.Security.AccessControl.FileSystemRights]::Read
$inheritance = [System.Security.AccessControl.InheritanceFlags] `
"ContainerInherit,ObjectInherit"
$propagation = `
[System.Security.AccessControl.PropagationFlags]::None
$allowdeny = `
[System.Security.AccessControl.AccessControlType]::Allow
Folders en permissies
• Dit kun je vervolgens op deze manier verwerken:
$ace = New-Object `
System.Security.AccessControl.FileSystemAccessRule `
($group, $rights, $inheritance, $propagation, $allowdeny)
$acl = Get-Acl -Path $path
$acl.AddAccessRule($ace)
Set-Acl $path $acl
Folders en permissies
• Meer info
• https://blog.netwrix.com/2018/04/18/how-to-manage-file-system-acls-with-
powershell-scripts/

You might also like