Gestion des comptes AD
Ce billet décrit les manipulations que j'effectue pour "Actualiser les données" de la base Active Directory d'un domaine Windows.
Elles sont, en particulier nécessaire lorsqu'il faut créer et supprimer couramment de très nombreux comptes utilisateurs comme c'est, par exemple, le cas dans un établissement scolaire à chaque rentrée de septembre.
La plupart des manipulations sont effectuées sous PowerShell ISE (exécuté en mode administrateur), à travers des scripts que je présente ci-dessous.
Les scripts des $2 (suppressions de comptes), $3 (créations de comptes) et $4 (modifications de comptes) utilisent des commandes fournies par le module ActiveDirectory. Il doit donc être importé, dans l'environnement de "Powershell", par l'instruction :
Import-Module ActiveDirectory
Cette instruction figure donc en tête de tous les scripts présentés. Ceux-ci utilisent les commandes :
import-csv pour extraire les données d'un fichier au format csv passé en argument de la propriété -path ;
- foreach_object pour traiter les données extraites.
Les données à manipuler sont donc extraites de fichiers au format csv (dans l'exemple "ad.csv") par le script :
Import-Csv -path "ad.csv"
| ForEach-Object
{ .... }
qui applique les opérations listées entre les accolades sur chacun des éléments listés dans le fichier "ad.csv".
Ce fichier doit avoir une forme similaire à celle présentée ci-dessous, la première ligne comprend les "entêtes" et les suivantes les données.
samAccountName, surName,givenName, displayName, ParentOU, ProfilePath, HomeDirectory, HomeDrive
test1, test, un, test.un, "ou=systeme,DC=lurcat,dc=lan", \\g2020\dh\truc.v6, \\g2020\dh\test1, H
test2, test, deux, test.deux, "ou=systeme,DC=lurcat,dc=lan", \\g2020\dh\truc.v6, \\g2020\dh\test2, H
test3, test, trois, test.trois, "ou=systeme,DC=lurcat,dc=lan", \\g2020\dh\truc.v6, \\g2020\dh\test3, H
Ce même fichier, vu à travers un tableur, est illustré par l'image ci-dessous :
1. Création automatisée du fichier csv
La commande Get-ADUser du module ActiveDirectory, rends en fonction des paramètres qui lui sont fournis, une liste de comptes-utilisateurs et leur attributs.
Dans l'exemple ci-dessous, Get-ADUser liste tous les utilisateurs du domaine lurcat.lan. Grâce au "pipe" |, cette liste est transmise à la commande export-csv qui génère le fichier "dhad.csv".
Get-ADUser
-Filter *
-SearchBase "DC=LURCAT,DC=LAN"
| export-csv dhad.csv
L'image ci-dessous illustre une vue de ce fichier avec le tableur Libre Office Calc.
La modification de l'attribut du paramètre searchBase en "ou=2019,ou=bts,ou=eleves,dc=lurcat,dc=lan" permettra d'obtenir la liste de tous les comptes présents dans cette unité d'organisation (les étudiants de BTS inscrits en 2019 .
En utilisant ce fichier en entrée du script du $2 ci-après, je supprimerai tous ces comptes utilisateurs.
2. Suppression en masse
Le script utilise la commande Remove-ADUser du module ActiveDirectory, pour supprimer l'utilisateur dont le nom est passé dans le paramètre -Identity sous une des formes :
- Distinguished name
- GUID
- Security Identifier
- SAM account name (SamAccountName)
Il utilise également pour "fabriquer" le chemin du répertoire personnel de l'utilisateur, la commande Join-Path avec les propriétés
- -path
- -chidpath
et la commande Remove-Item pour effacer ce dossier personnel à l'aide des propriétés :
- -path
- -recurse
- -force
Import-Module activeDirectory
Import-Csv -Path "ad.csv"
| ForEach-Object {
$name = $_."SamAccountName"
if ((dsquery user -samid $name) -eq $null) {
write-host "le compte $name n existe pas"
}
else {
#suppression du compte
Remove-ADUser -Identity $name -Confirm:$false
Write-host $name "Supprimé"
#suppression du dossier personnel
$basePath = $_."HomeDirectory"
$fullPath = Join-Path -path $basePath -childPath $_.SamAccountName
Remove-Item -path $fullPath -recurse -force
Write-Host "dossier personnel : " $fullPath "supprimé"
}
Le fichier "ad.csv" fournissant les données au script doit donc au minimum contenir une entête nommée "samAccountName" et une entête nommée "HomeDirectory"
3. Création en masse
Le script utilise la commande New-ADUser du module AciveDirectory avec les paramètres
- name
- path
- samAcountName
- userPrincipalName
- givenName
- surname
- displayName
- accountPassword
- changePasswordAtLogon
- profilePath
- homeDirectory
- homeDrive
dont les valeurs sont extraites du fichier "ad.csv".
Pour créer le dossier personnel de l'utilisateur, le script utilise la commande New-Item avec les paramètres
- path
- itemType
- force
Pour placer la permission "Control Total" sur ce dossier personnel, le script utilise la commande Get-Acl pour récupérer l'objet "descripteur de sécurité" du dossier personnel et la commande Set-Acl, qui affecte la permission grâce aux paramètres :
- path
- aclObject
Import-Module activeDirectory
# ad.csv fichier contenant la liste des comptes et leurs propriétés
# samAccountName
# givenName
# surName
# ParentOU
# .....
Import-Csv -Path "ad.csv" | ForEach-Object {
$name = $_."samAccountName"
$userPrincipal = $_."samAccountName" + "@lurcat.lan"
$basePath = $_."HomeDirectory"
$fullPath = Join-Path -path $basePath -childPath $_.SamAccountName
#creation du compte
New-ADUser -name $name -path $_."ParentOU" -samAccountName $name -userPrincipalName $userPrincipal -givenName $_."GivenName" -surname $_.Surname -displayName $_.DisplayName -accountPassword (ConvertTo-SecureString "MyPassword123" -AsPlainText -Force) -changePasswordAtLogon $true -enabled $true -profilePath $_."ProfilePath" -homeDirectory $fullPath -homeDrive $_."HomeDrive"
$user = Get-ADUser $name
#création du dossier perso
$homeShare = New-Item -path $fullPath -itemType "Directory" -force
#mise en place de la permission "control total"
$acl = Get-Acl $homeShare
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"FullControl"
$AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow
$InheritanceFlags = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlags = [System.Security.AccessControl.PropagationFlags]"InheritOnly"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($User.SID, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
$acl.AddAccessRule($AccessRule)
Set-Acl -path $homeShare -aclObject $acl
#Add-ADGroupMember "Domain Admins" $_."samAccountName";
Write-host $name "Ajouté"
}
4. Modification en masse des dossiers personnels
Le script suivant est une variante du script du $3. Ici la commande Set-ADUser du module ActiveDirectory remplace la commande Get-ADUser utilisée pour créer le compte. Elle permet de modifier les propriétés listées à la suite de Set-ADUser -identity $name.
Dans le script ci-dessous, seule la propriété "homeDirectory" de l'utilisateur sera modifiée.
Pour modifier les homeDirectory et profilePath, de l'utilisateur "dupont sandra"; on utilisera par exemple l'instruction
Set-ADUser -identity "dupont.sandra" -homeDirectory "\\g2020\dh\dupont.sandra" -profilePath "\\g2020\profile$\profil.v6
Import-Module activeDirectory
# ad.csv fichier contenant la liste des comptes à modifier
# et le répertoire personnel à associer
# samAccountName
# homeDrive
Import-Csv -path "ad.csv" | ForEach-Object {
$name = $_."samAccountName"
if ((dsquery user -samid $name) -eq $null) {
write-host "le compte $name n existe pas"
}
else {
$basePath = $_."HomeDirectory"
$fullPath = Join-Path
-path $basePath
-childPath $_.SamAccountName
#modification du répertoire personnel
Set-ADUser -identity $name -homeDirectory $fullPath
$user = Get-ADUser $name
#création du dossier perso
$homeShare = New-Item
-path $fullPath
-itemType Directory
-force
#mise en place de la permission "control total"
$acl = Get-Acl $homeShare
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"FullControl"
$AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow
$InheritanceFlags = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlags = [System.Security.AccessControl.PropagationFlags]"InheritOnly"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($User.SID, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
$acl.AddAccessRule($AccessRule)
Set-Acl -path $homeShare -aclObject $acl
#Add-ADGroupMember "Domain Admins" $_."samAccountName";
Write-host "dossier personnel de " $name " modifié"
}
}
4. Les scripts à copier-coller
Import-Module activeDirectory
Import-Csv -Path "ad.csv" | ForEach-Object {
$name = $_."samAccountName"
if ((dsquery user -samid $name) -eq $null) {
write-host "le compte $name n existe pas"
}
else {
Remove-ADUser -Identity $name -Confirm:$false
Write-host $name "Supprimé"
#suppresion du dossier personnel
$basePath = $_."HomeDirectory"
$fullPath = Join-Path -path $basePath -childPath $_.SamAccountName
Remove-Item -path $fullPath -recurse -force
Write-Host "dossier personnel : " $fullPath "supprimé"
}
Import-Module activeDirectory
# ad.csv fichier contenant la liste des comptes et leurs propriétés
# samAccountName
# givenName
# surName
# PrentOU
# .....
Import-Csv -Path "ad.csv" | ForEach-Object {
$name = $_."samAccountName"
$userPrincipal = $_."samAccountName" + "@lurcat.lan"
$basePath = $_."HomeDirectory"
$fullPath = Join-Path -path $basePath -childPath $_.SamAccountName
#creation du compte
New-ADUser -name $name -path $_."ParentOU" -samAccountName $name -userPrincipalName $userPrincipal -givenName $_."GivenName" -surname $_.Surname -displayName $_.DisplayName -accountPassword (ConvertTo-SecureString "MyPassword123" -asPlainText -force) -changePasswordAtLogon $true -enabled $true -profilePath $_."ProfilePath" -homeDirectory $fullPath -homeDrive $_."HomeDrive"
$user = Get-ADUser $name
#création du dossier perso
$homeShare = New-Item -path $fullPath -itemType "Directory" -force
#mise en place de la permission "control total"
$acl = Get-Acl $homeShare
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"FullControl"
$AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow
$InheritanceFlags = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlags = [System.Security.AccessControl.PropagationFlags]"InheritOnly"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($User.SID, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
$acl.AddAccessRule($AccessRule)
Set-Acl -path $homeShare -aclObject $acl
#Add-ADGroupMember "Domain Admins" $_."samAccountName";
Write-host $name "Ajouté"
}
Import-Module activeDirectory
# ad.csv fichier contenant la liste des comptes et leurs propriétés
# samAccountName
# homeDrive
Import-Csv -path "ad.csv" | ForEach-Object {
$name = $_."samAccountName"
if ((dsquery user -samid $name) -eq $null) {
write-host "le compte $name n existe pas"
}
else {
$basePath = $_."HomeDirectory"
$fullPath = Join-Path -path $basePath -childPath $_.SamAccountName
Set-ADUser -identity $name -homeDirectory $fullPath
$user = Get-ADUser $name
#création du dossier perso
$homeShare = New-Item -path $fullPath -itemType Directory -force
#mise en place de la permissio "control total"
$acl = Get-Acl $homeShare
$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"FullControl"
$AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow
$InheritanceFlags = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
$PropagationFlags = [System.Security.AccessControl.PropagationFlags]"InheritOnly"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($User.SID, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType)
$acl.AddAccessRule($AccessRule)
Set-Acl -path $homeShare -aclObject $acl
#Add-ADGroupMember "Domain Admins" $_."samAccountName";
Write-host "dossier personnel de " $name " modifié"
}
}
Si vous êtes allergique à la programmation, regardez ces liens