Skip to content

Labo 5 Active Directory

AlexandreDoneux edited this page Jan 5, 2023 · 9 revisions

But du labo

Le but du labo est de mettre en place 4 scripts PowerShell pour automatiser des taches en lien avec l'Active Directory. Les scripts sont les suivants :

  1. Sur base d’un CSV dont vous définissez et documentez la structure, créer automatiquement des comptes utilisateurs Active Directory.
  2. Sur base d’un CSV dont vous définissez et documentez la structure, désactiver automatiquement des comptes utilisateurs AD.
  3. Débloquer facilement le compte d’un utilisateur ayant dépassé le nombre de tentatives de login erroné.
  4. Sur base d’un CSV dont vous définissez et documentez la structure, modifier automatiquement des informations sur des comptes utilisateur.

[1] Consignes tirées du document Moodle pour le labo 5

Nous devons également automatiser l'utilisation du script 1 pour faire en sorte qu'il tourne toutes les heures. Il gèrera automatiquement la création d'utilisateurs en allant chercher les informations dans un fichier .csv à un endroit précis.

Prérequis

Pour mettre en place ce labo nous avons besoin du Domain Controller sur lequel est installé un Active Directory. Ces points sont abordés lors du laboratoire précédent.

Ressources

Si des termes vous sont inconnus ou pour vous renseigner sur les manipulations effectués par l'équipe au préalable, n'hésitez pas à vous référer aux différents documents :

  • Labo 4 - Active Directory : manipulations sur la création d'un AD et sa gestion.
  • Synthèses : explications concernant certains termes précis, technologies, etc. Cette page de synthèses est agrémentée de manière continue au fil des laboratoires.

1. Script 1 : Ajout d'utilisateurs

Script 1

#Dans le path des scripts : powershell ./addUsers.ps1 'C:\Scripts_et_csv_TP\csvScripts\addUsers.csv'

# import du module Active Directory pour pouvoir lancer des commandes AD 
Import-Module ActiveDirectory


$users = Import-Csv -Path $args[0] -Header "username","firstname","lastname","password"

 
# Boucle qui, pour chaque utilisateur défini dans le csv ....
foreach($user in $users){

    # On récupère les différentes données
    $username = $user.username
    $firstname = $user.firstname
    $lastname = $user.lastname
    $password = $user.password


    # On vérifie s'il n'y a pas déjà un utilisateur existant avec ce nom
    if(Get-ADUser -Filter {samAccountName -eq $username}){
        Write-Host "Il existe déjà un utilisateur $username"
    }

    # Si aucun utilisateur avec ce nom d'utilisateur existe
    else{
        New-ADUser `
            -Name "$lastname $firstname" `
            -SamAccountName $username `
            -GivenName $firstname `
            -SurName $lastname `
            -Enabled $true `
            -DisplayName "$lastname $firstname" `
            -Path "OU=utilisateurs, DC=l1-3, DC=lab" `
            -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) `
            -PasswordNeverExpires $true `
            -ChangePasswordAtLogon $false

        Write-Host "L'utilisateur $username a été créé."

    }
}

Ce script va chercher des données concernant des utilisateurs dans un fichier .csv et il les utilisera pour créer de nouveaux utilisateurs dans l'AD. Dans ce script nous mettons dans le fichier .csv le nom d'utilisateur, le prénom, le nom de famille et le mot de passe utilisé pour se connecter au compte.

On lance ce script dans l'invite de commande en indiquant le path du fichier .csv à utiliser en tant que paramètre :

powershell ./<PATH-SCRIPT> <PATH-CSV>

Déroulement du script :

  1. On importe le module activedirectory pour pouvoir utiliser des commandes AD dans le script.
  2. On récupères les données dans le fichier .csv en utilisant Import-CSV. On fourni son path via le premier (et seul) paramètre de la commande. On indique également les headers via le paramètre -Headers à utiliser pour repérer quelle donnée correspond à quoi. On stocke les données dans une variable $users.
  3. On utilise une boucle "foreach" pour cibler les différents utilisateurs, présent dans $users, à créer.
  4. On stocke les différentes données dans des variables pour pouvoir les réutiliser plus facilement plus tard.
  5. On vérifie si l'utilisateur qu'on veut créer n'existe pas déjà en vérifiant si un utilisateur possède déjà le nom d'utilisateur qu'on veut utiliser. On fait cela grâce à la commande Get-ADUser. Cette commande nous permet de chercher un utilisateur dans l'active directory. On ajoute un filtre à la recherche pour récupérer l'utilisateur avec le même nom d'utilisateur : Get-ADUser -Filter {samAccountName -eq $username}. Si un utilisateur avec ce samAccountName existe déjà, on n'en crée pas un nouveau (si on essayait, on aurait une erreur).

    rem : le samAccountName d'un utilisateur AD est unique

  6. Si aucun utilisateur n'existe avec ce samAccountName, on le crée avec la fonction New-ADUser. On indique le nom du compte, prénom, nom de famille, samAccountName ainsi que :
  • le DisplayName : Le nom du compte affiché sur l'écran de connexion.
  • le fait qu'il soit activé : ps1 -Enabled $true
  • le fait que l'utilisateur ne devra pas modifier son mot de passe la première fois qu'il se connecte : ps1 -ChangePasswordAtLogon $false
  • le fait que le mot de passe n'expire pas : ps1 PasswordNeverExpires $true
  • l'endroit où doit être créé l'utilisateur : ps1 -Path "OU=utilisateurs, DC=l1-3, DC=lab" . Ici on crée l'utilisateur dans l'Organizational Unit "utilisateurs" dans le domaine "l1-3.lab".
  • le mot de passe qu'on convertit d'un String vers un SecureString : ps1 -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force)

exemple de fichier .csv pour le script 1

"jLeblanc","Juste","Leblanc","LePetitChevalDeManege123"
"Doneux","Alexandre","Doneux","User123"
"jFlemal","Jarod","Flemal","User123"
"kKeurvels","Kevin","Keurvels","User123"

On définit une ligne par utilisateur qu'on veut créer. On indique dans l'ordre : le nom d'utilisateur qu'on veut utiliser, le prénom puis le nom de famille et ensuite le mot de passe.

2. Script 2 : Désactivation de comptes utilisateurs

Script 2

#Dans le path des scripts : powershell ./disableUsers.ps1 'C:\Scripts_et_csv_TP\csvScripts\disableUsers.csv'

# import du module Active Directory pour pouvoir lancer des commandes AD 
Import-Module ActiveDirectory


$users = Import-Csv -Path $args[0] -Header "username"

foreach($user in $users){

    # On récupère les différentes données
    $username = $user.username


    # On vérifie s'il y a un utilisateur existant avec ce nom. ATTENTION : ne vérifie pas si le compte est déjà désactivé
    if(Get-ADUser -Filter {samAccountName -eq $username} -SearchBase "OU=utilisateurs,DC=l1-3,DC=lab"){
        Disable-ADAccount $username

        Write-Host "Compte $username désactivé."
    }

    # Si l'utilisateur n'existe pas, on prévient.
    else{
        Write-Host "L'utilisateur $username n'existe pas."

    }

}

Ce script va chercher chercher un ensemble d'utilisateurs présent dans le csv donnée en paramètres. Il désactivera ces utilisateurs s'ils existent. Nous mettons dans le fichier csv uniquement les noms d'utilisateurs.

On lance ce script dans l'invite de commande en indiquant le path du fichier .csv à utiliser en tant que paramètre :

powershell ./<PATH-SCRIPT> <PATH-CSV>

Déroulement du script :

  1. On importe le module activedirectory pour pouvoir utiliser des commandes AD dans le script.
  2. On récupères les données dans le fichier .csv en utilisant Import-CSV. On fourni son path via le premier (et seul) paramètre de la commande. On indique également les headers via le paramètre -Headers à utiliser pour repérer qu'elle donnée correspond à quoi. Ici on aura à chaque fois une seule donnée : le nom d'utilisateur. On stocke les données dans une variable $users.
  3. On utilise une boucle "foreach" pour cibler les différents utilisateurs, présent dans $users, à désactiver.
  4. On stocke le nom d'utilisateur dans une variable pour pouvoir y accéder de manière plus claire.
  5. Comme pour le script précédent on vérifie si l'utilisateur existe avec la commande Get-ADUser pour vérifier que l'utilisateur qu'on veut désactiver existe bien. On indique dans le paramètre -SearchBase l'endroit où il doit chercher (dans quel OU).
  6. Si l'utilisateur existe, on le désactive avec la commande Disable-ADAccount et on affiche un message pour nous prévenir.
  7. Si l'utilisateur n'existe pas, on ne fait rien et on affiche un message pour prévenir que l'utilisateur n'existe pas.

exemple de fichier .csv pour le script 2

"aDoneux"
"jFlemal"
"jLeblanc"

3. Script 3 : Déblocage d'un compte utilisateur bloqué par tentatives de mot de passe

Activer le blocage par échec de mot de passe

Pour pouvoir avoir une utilité à ce script, il faut d'abord mettre en place un blocage de session lorsqu'un certain nombre de tentatives de mot de passe ont échoué. Si cette fonctionnalité n'est pas mise en place aucun utilisateur ne se bloquera jamais.

  1. Dans le Domain Controller, cliquer sur le Menu Tools et aller dans Group Policy Management.
  2. Aller dans Default Domain Policy ... > Computer Configuration > Policies > Windows Settings > Security Settings > Account Policies > Account Lockout Policy .
  3. Faire un clique droit sur Account lockout threshold et indiquer le nombre de tentative de mots de passe autorisées. On peut aussi modifier Account lockout duration et Reset account lockout couter after mais les temps seront mis de base à 30 minutes.
Capture d’écran 2022-12-11 à 17 15 13 Capture d’écran 2022-12-11 à 17 14 54

Script 3

#Dans le path des scripts : powershell ./unblockUser.ps1 aDoneux

# import du module Active Directory pour pouvoir lancer des commandes AD 
Import-Module ActiveDirectory

# On utilise pas de csv. On indique directement comme paramètre le compte qu'on veut débloquer.
$username = $args[0] 

# On vérifie si il y a un utilisateur existant avec ce nom. ATTENTION : il ne vérifie pas si le compte est bloqué
if(Get-ADUser -Filter {samAccountName -eq $username} -SearchBase "OU=utilisateurs,DC=l1-3,DC=lab"){
    Unlock-ADAccount $username

    Write-Host "Compte $username débloqué."
}
# Si l'utilisateur n'existe pas on prévient.

else{
    Write-Host "L'utilisateur $username n'existe pas."

}

Ce script va débloquer un utilisateur qui aurait été bloqué après un nombre trop important de tentatives mot de passe échouées. Le script utilise un seul paramètre : le nom d'utilisateur de l'utilisateur ciblé.

On lance ce script dans l'invite de commande en indiquant le nom d'utilisateur en tant que paramètre. :

powershell ./<PATH-SCRIPT> <USERNAME>

Déroulement du script :

  1. On importe le module activedirectory pour pouvoir utiliser des commandes AD dans le script.
  2. On récupères le nom d'utilisateur de l'utilisateur qu'on veut débloquer en récupérant le premier argument dans la ligne de commande ($args[0]).
  3. Comme pour les scripts précédent on vérifie si l'utilisateur existe avec la commande Get-ADUser pour vérifier que l'utilisateur qu'on veut débloquer existe bien. On indique dans le paramètre -SearchBase l'endroit où il doit chercher (dans quelle OU).
  4. Si l'utilisateur existe, on le débloque avec la commande Unlock-ADAccount et on affiche un message pour nous prévenir.
  5. Si l'utilisateur n'existe pas, on ne fait rien et on affiche un message pour prévenir que l'utilisateur n'existe pas.

4. Script 4 : Modification d'informations sur des comptes utilisateurs

Pour mettre à jour les attributs, nous cherchons d’abord l’utilisateur avec les propriétés requises, puis nous définissons les nouvelles valeurs et mettons à jour l’utilisateur avec Set-ADUser. Si le champ est vide dans le fichier CSV, nous l’ignorons. Avec le paramètre Instance, seules les valeurs modifiées seront mises à jour. Cela nous permet également de gérer les valeurs vides dans le fichier CSV.

Script 4

#Dans le path des scripts : powershell ./updateUsersProperties.ps1 'C:\Scripts_et_csv_TP\csvScripts\updateUsersProperties.csv'

# import du module Active Directory pour pouvoir lancer des commandes AD 
Import-Module ActiveDirectory

#import du CSV
$users = Import-Csv -Path $args[0] -Header "username","department","city","Mobilephone"

write-host $users 
 
# Boucle qui, pour chaque utilisateur défini dans le csv ....
foreach($user in $users){

    # On récupère les différentes données, arrive pas à accéder
    $username = $user.username
    $department = $user.department
    $city = $user.city
    $Mobilephone = $user.Mobilephone

    # On recupère l'utilisateur de AD
    $ADUser= Get-ADUser -Filter {samAccountName -eq $username}

    if($ADUser){
        if ($department) {$ADUser.department=$department}
        if ($city) {$ADUser.city=$city}
        if ($Mobilephone) {$ADUser.Mobilephone=$Mobilephone}
        Write-Host "L'utilisateur $username a été mis à jour."
        Set-ADUser -Instance $ADUser
    }
    else{

        #L'utilisateur n'existe pas
        Write-warning ("L'utilisateur $username n'existe pas.")

    }

}

Nous avons créé un fichier CSV ayant dans la première colonne les noms des utilisateurs et dans la deuxième colonne le nom du département, dans la troisième colonne le nom de leurs villes et dans la quatrième colonne leurs nouveaux numéros de téléphones.

exemple de fichier .csv pour le script 4

# On indique pour chaque utilisateur : nom d'utilisateur, Department, City, Mobilephone.

"IA","IT",,"0412365545"
"aDoneux","Sales","Nivelles","0412365543"

5. Automatisation du script 1

Nous allons mettre une automatisation pour la création d'utilisateurs. Nous allons faire en sorte que le script 1 se lance toutes les heures en allant chercher chercher le fichier .csv et en créant les utilisateurs présents pas encore créés.

  1. Rendez-vous dans le planificateur de taches Windows ("Task Scheduler") et cliquez sur "Create task" à droite de la fenêtre.
Capture d’écran 2023-01-05 à 14 01 54
  1. Dans l'onglet "General" donnez un nom et une description à la tache et choisissez Windows Server 2022 pour l'option "configure for".
Capture d’écran 2023-01-05 à 13 44 43
  1. Dans l'onglet "Triggers" créer un nouveau trigger/déclencheur. Par défaut le trigger est le moment présent. On n'y touche pas. Cochez "Repeat task every :" et choisir une heure.
Capture d’écran 2023-01-05 à 13 48 28
  1. Dans l'onglet "Actions" créer une nouvelle action. On choisit de lancer un programme : le PowerShell. On va donc dans la première case aller chercher l'exécutable de PowerShell (C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe). Dans la case "And arguments" on va mettre la commande Powershell qu'on veut lancer : <path du script> <path du fichier csv>. Référez-vous à la partie plus haut concernant le script 1.
Capture d’écran 2023-01-05 à 15 32 29
  1. Dans l'onglet "Conditions" cochez "Start only if the following network connection is available:" et sélectionnez le domaine adéquat. Vous pouvez laisser le reste comme il est.
Capture d’écran 2023-01-05 à 13 57 35
  1. Dans l'onglet "Settings" cochez "Stop the task if it runs longer than:" et sélectionnez une heure. Cela évitera qu'une tache reste bloquée alors qu'une nouvelle instance de a tache est démarrée. Vous pouvez laisser le reste comme il est.
Capture d’écran 2023-01-05 à 13 56 40

Terminez ensuite la configuration. Vous pourrez voir dans la liste des taches définies quand est la prochaine fois qu'elle est sensée être lancée. Vous pouvez tester la tache en sélectionnant la tache dans la liste et cliquer sur "Run" dans la liste d'actions à droite de la fenêtre.

Capture d’écran 2023-01-05 à 16 44 35

Bibliographie

https://openclassrooms.com/fr/courses/6344196-planifiez-vos-taches-avec-des-scripts-powershell-sur-windows-server/6527998-automatisez-la-configuration-d-active-directory-avec-powershell

https://openclassrooms.com/fr/courses/6344196-planifiez-vos-taches-avec-des-scripts-powershell-sur-windows-server/6528122-automatisez-des-taches-de-sauvegarde-avec-des-scripts-powershell

https://www.it-connect.fr/cours/administrer-active-directory-avec-powershell/

https://blog.kaniski.eu/2017/04/scheduling-a-powershell-script-with-arguments/