Professional Documents
Culture Documents
8 Powershell en Active Directory - Lector
8 Powershell en Active Directory - Lector
Directory
• Hoofdstuk 8
• samAccountName must be unique among all security principal objects within domain.
• 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.
• 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.
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)
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.
• 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/