Van een HR-export naar een AD-account: de bekende aanpak
Een nieuwe medewerker staat in het HR-systeem. IT krijgt een export, draait een script en het account verschijnt in Active Directory. Dat werkt, totdat de uitzonderingen zich opstapelen.
Bijna elke IT-afdeling met Active Directory op locatie heeft het ooit gebouwd. HR zet nieuwe medewerkers in een export, iemand draait een script, en het script maakt met New-ADUser uit de ActiveDirectory-module een account aan in de juiste OU. Daarna komen de groepen erbij met Add-ADGroupMember, en via Entra Connect Sync of Cloud Sync verschijnt het account een tijd later in Microsoft Entra ID. Dit artikel begint bij dat script, omdat het laat zien welke beslissingen je hoe dan ook moet nemen. Hoe Joinly dit als product doet, staat op Active Directory op locatie.
Het voorbeeld hieronder werkt zoals het er staat, met een CSV met puntkomma's zoals een Nederlandse Excel-export die maakt. Het zoekt eerst op personeelsnummer of het account al bestaat, kiest de OU op afdeling, maakt een tijdelijk wachtwoord en zet de medewerker in de groepen van zijn afdeling.
Import-Module ActiveDirectory
$domein = "bedrijf.nl"
$standaardOU = "OU=Nieuw,OU=Medewerkers,DC=bedrijf,DC=local"
$ouPerAfdeling = @{
"Financien" = "OU=Financien,OU=Medewerkers,DC=bedrijf,DC=local"
"Verkoop" = "OU=Verkoop,OU=Medewerkers,DC=bedrijf,DC=local"
"Logistiek" = "OU=Logistiek,OU=Medewerkers,DC=bedrijf,DC=local"
}
$groepenPerAfdeling = @{
"Financien" = @("GG-Financien", "GG-Alle-medewerkers")
"Verkoop" = @("GG-Verkoop", "GG-CRM-Gebruikers", "GG-Alle-medewerkers")
"Logistiek" = @("GG-Logistiek", "GG-Alle-medewerkers")
}
function New-TijdelijkWachtwoord {
$tekens = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!#%+?"
-join (1..20 | ForEach-Object { $tekens[(Get-Random -Maximum $tekens.Length)] })
}
$regels = Import-Csv -Path "C:\HR\nieuwe-medewerkers.csv" -Delimiter ";"
foreach ($r in $regels) {
# Bestaat er al iemand met dit personeelsnummer? Dan niets aanmaken.
if (Get-ADUser -Filter "EmployeeID -eq '$($r.Personeelsnummer)'") { continue }
$sam = ("{0}.{1}" -f $r.Voornaam, $r.Achternaam).ToLower() -replace "[^a-z0-9.]", ""
if (Get-ADUser -Filter "SamAccountName -eq '$sam'") { $sam = "$sam$($r.Personeelsnummer)" }
$ou = $ouPerAfdeling[$r.Afdeling]
if (-not $ou) { $ou = $standaardOU }
$wachtwoord = New-TijdelijkWachtwoord
$nieuw = @{
Name = "$($r.Voornaam) $($r.Achternaam)"
GivenName = $r.Voornaam
Surname = $r.Achternaam
DisplayName = "$($r.Voornaam) $($r.Achternaam)"
SamAccountName = $sam
UserPrincipalName = "$sam@$domein"
EmployeeID = $r.Personeelsnummer
Department = $r.Afdeling
Title = $r.Functie
Path = $ou
AccountPassword = (ConvertTo-SecureString $wachtwoord -AsPlainText -Force)
ChangePasswordAtLogon = $true
Enabled = $true
}
New-ADUser @nieuw
foreach ($groep in $groepenPerAfdeling[$r.Afdeling]) {
Add-ADGroupMember -Identity $groep -Members $sam
}
Write-Output "$sam aangemaakt in $ou"
}