Aller au contenu principal


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.

Billet créé le :
19 déc 2022

La plupart des manipulations sont effectuées sous PowerShell ISE (exécuté en mode administrateur), à travers des scripts que je présente ci-dessous.

liquez pour agrandir l'image
 

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 ;

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 :

Cliquez pour agrandir l'mage

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.

Cliquez pour agrandir l'image

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.

information complémentaire disponible en cliquant ici

Note : l'instruction suivante :

Get-ADUser 
         -Identity "dupre.audrey" 
         -Properties *

liste toutes les propriétés du compte "dupre.audrey"

Cliquez pour agrandir l'image

 

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

Cliquez sur le bouton pour copier le code< dans le presse papier
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é"
}
Cliquez sur le bouton pour copier le code dans le presse papier
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é"
}
Cliquez sur le bouton pour copier le code dans le presse papier
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é"
   }
}