-
Notifications
You must be signed in to change notification settings - Fork 0
Labo 5 Active Directory
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 :
- Sur base d’un CSV dont vous définissez et documentez la structure, créer automatiquement des comptes utilisateurs Active Directory.
- Sur base d’un CSV dont vous définissez et documentez la structure, désactiver automatiquement des comptes utilisateurs AD.
- Débloquer facilement le compte d’un utilisateur ayant dépassé le nombre de tentatives de login erroné.
- 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.
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.
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.
#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 :
- On importe le module
activedirectorypour pouvoir utiliser des commandes AD dans le script. - 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. - On utilise une boucle "foreach" pour cibler les différents utilisateurs, présent dans
$users, à créer. - On stocke les différentes données dans des variables pour pouvoir les réutiliser plus facilement plus tard.
- 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
- 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)
"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.
#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 :
- On importe le module
activedirectorypour pouvoir utiliser des commandes AD dans le script. - 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. - On utilise une boucle "foreach" pour cibler les différents utilisateurs, présent dans
$users, à désactiver. - On stocke le nom d'utilisateur dans une variable pour pouvoir y accéder de manière plus claire.
- Comme pour le script précédent on vérifie si l'utilisateur existe avec la commande
Get-ADUserpour vérifier que l'utilisateur qu'on veut désactiver existe bien. On indique dans le paramètre-SearchBasel'endroit où il doit chercher (dans quel OU). - Si l'utilisateur existe, on le désactive avec la commande
Disable-ADAccountet on affiche un message pour nous prévenir. - Si l'utilisateur n'existe pas, on ne fait rien et on affiche un message pour prévenir que l'utilisateur n'existe pas.
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.
- Dans le Domain Controller, cliquer sur le Menu
Toolset aller dansGroup Policy Management. - Aller dans
Default Domain Policy ... > Computer Configuration > Policies > Windows Settings > Security Settings > Account Policies > Account Lockout Policy. - Faire un clique droit sur
Account lockout thresholdet indiquer le nombre de tentative de mots de passe autorisées. On peut aussi modifierAccount lockout durationetReset account lockout couter aftermais les temps seront mis de base à 30 minutes.
#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 :
- On importe le module
activedirectorypour pouvoir utiliser des commandes AD dans le script. - 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]). - Comme pour les scripts précédent on vérifie si l'utilisateur existe avec la commande
Get-ADUserpour vérifier que l'utilisateur qu'on veut débloquer existe bien. On indique dans le paramètre-SearchBasel'endroit où il doit chercher (dans quelle OU). - Si l'utilisateur existe, on le débloque avec la commande
Unlock-ADAccountet on affiche un message pour nous prévenir. - Si l'utilisateur n'existe pas, on ne fait rien et on affiche un message pour prévenir que l'utilisateur n'existe pas.
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.
#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.
# On indique pour chaque utilisateur : nom d'utilisateur, Department, City, Mobilephone.
"IA","IT",,"0412365545"
"aDoneux","Sales","Nivelles","0412365543"
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.
- Rendez-vous dans le planificateur de taches Windows ("Task Scheduler") et cliquez sur "Create task" à droite de la fenêtre.
- Dans l'onglet "General" donnez un nom et une description à la tache et choisissez
Windows Server 2022pour l'option "configure for".
- 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.
- 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.
- 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.
- 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.
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.
https://www.it-connect.fr/cours/administrer-active-directory-avec-powershell/
https://blog.kaniski.eu/2017/04/scheduling-a-powershell-script-with-arguments/