Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

Script pour rappeler à l’utilisateur de changer son mot de passe

Par Florentin GARREAU Publié le 23/10/2016 à 23:26:07 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Introduction

Nous sommes d’accord pour dire que la majorité des sociétés, pour ne pas dire toutes, possède un domaine Active Directory. C’est un gros avantage pour ces dernières :

  • Gestion des utilisateurs : Pouvoir lister et gérer les comptes utilisateurs

  • Gestion des postes informatique : Pouvoir lister les ordinateurs de l’entreprise

  • Gestion des groupes utilisateurs : Pouvoir simplifier la gestion du réseau comme par exemple gérer les droits sur les partages réseau.

  • Gestion des politiques (GPO : Group Policy) : Pouvoir créer des politiques de sécurité, l’une des stratégies de sécurité est la gestion des mots de passe de ces comptes.

Nous pouvons demander à l’utilisateur un mot de passe d’une longueur bien précise, en cas d’échec de mot de passe, le compte se verrouille, ou tout simplement demander à l’utilisateur de changer son mot de passe tous les x nombres de jours.

Dans cet article, nous allons parler de cette dernière stratégie, cette stratégie force l’utilisateur à changer son mot de passe. Cependant ce dernier, même s’il est averti par une petite fenêtre en bas à droite de sa session. L’utilisateur ne change pas toujours son mot de passe car il n’a pas le temps ou se dit qu’il le fera plus tard. Un Week-end passe ou une période de vacances, à son retour son compte est verrouillé et il ne peut pas ouvrir sa session. A ce moment-là, il est obligé de contacter son administrateur réseau pour pouvoir déverrouiller son compte. Donc dans cet article, je vais vous présenter un script Powershell qui avertit l’utilisateur par un petit pop-up, qu’il doit changer son mot de passe.

Nous allons le mettre en place, à l’aide de deux scripts, le premier va permettre au serveur de tester l’ensemble des comptes pour voir si le mot de passe expire dans moins de 15 jours, dans ce cas, le script écrit dans un fichier nommé expiration.txt le SAM-Account-Name du compte. Nous allons lancer ce script à l’aide d’une tâche planifiée, qui va se lancer tous les 30 minutes. Le deuxième script se lance sur le poste à l’ouverture de sa session. Il va lire le fichier expiration.txt, si le SAM-Account-Name de ce compte est présent, il affiche un pop-up, sinon il ferme le script.

Script pour lister les comptes dont le mot de passe va bientôt expirer.

Le script expiration.ps1

Ci-dessous, voici le premier script nommé expiration.ps1 dans sa globalité :

import-module activedirectory

# Récupérer la date du jour

$date = Get-Date

# Création du fichier $fichier="C:\Windows\SYSVOL\sysvol\garreau.local\scripts\users_expire.txt"

Remove-Item $fichier -Force

New-Item $fichier -ItemType file

ADD-content -path $fichier -value "sam;"

ADD-content -path $fichier -value $date.DateTime

$Listusers = Get-ADUser -SearchBase 'OU=Utilisateurs, DC=garreau, DC=local'-Filter {UserAccountControl -ne "514"}

foreach ($user in $Listusers)

{

$foruser= $user.SamAccountName

# Récupérer date d'expiration du MDP du compte

$expiration = [datetime]::FromFileTime((Get-ADUser -Identity $foruser -Properties "msDS-UserPasswordExpiryTimeComputed")."msDS-UserPasswordExpiryTimeComputed")

# Afficher les dates en Ticks

$exp = $expiration.Ticks

$d = $date.Ticks

# Calculer la différence de jours

$comp = $exp - $d

# 12750000000000 = 15 jours

# Si $comp est inférieur à 15 jours, ecrire

if ($comp -le 12750000000000) {

ADD-content -path $fichier -value $foruser";"

}

}

Explication

Je vais à présent vous expliquer le script ligne par ligne en mettant un commentaire dans la ligne en dessous :

import-module activedirectory

#Import du module Active Directory car nous allons travailler sur des éléments qui sont au sein de l’AD.

# Récupérer la date du jour

$date = Get-Date

#Nous voulons récupérer la date du jour, pour l’afficher au début du script mais aussi pour la comparer plus loin avec la date d’expiration du mot de passe.

# Création du fichier

$fichier="C:\Windows\SYSVOL\sysvol\garreau.local\scripts\users_expire.txt"

#Nous mettons le lien vers le fichier dans la variable $fichier

Remove-Item $fichier –Force

#Nous supprimons l’ancien fichier, de la dernière demi-heure.

New-Item $fichier -ItemType file

#Nous créons le fichier ou nous allons marquer le SAM des comptes expirés en s’appuyant sur la variable $fichier.

ADD-content -path $fichier -value "sam;"

#Nous ajoutons une ligne sam ; pour pouvoir réaliser un foreach plus loin (Je ne suis pas sûr que cette ligne est encore utile).

ADD-content -path $fichier -value $date.DateTime

#Nous ajoutons la ligne avec la date, en DateTime pour avoir la date et l’heure.

$Listusers = Get-ADUser -SearchBase 'OU=Utilisateurs, DC=garreau, DC=local'-Filter {UserAccountControl -ne "514"}

#Nous listons l’ensemble des comptes utilisateurs de la GPO UTILISATEURS du domaine garreau.local et les stockons dans une variable $Listusers

foreach ($user in $Listusers) {

#Nous réalisons un foreach sur la liste stocker dans la variable $Listusers

$foruser= $user.SamAccountName

#Nous mettons le SamAccountName de l’utilisateur dans la variable $foruser

# Récupérer date d'expiration du MDP du compte

$expiration = [datetime]::FromFileTime((Get-ADUser -Identity $foruser -Properties "msDS-UserPasswordExpiryTimeComputed")."msDS-UserPasswordExpiryTimeComputed")

#Nous récupérons la date d’expiration du compte, vous pouvez voir des informations sur cette commande à ce lien : http://superuser.com/questions/836438/returning-user-password-expiry-date-powershell

# Afficher les dates en Ticks

$exp = $expiration.Ticks

# Passage de la date d’expiration en Ticks dans la variable

$exp $d = $date.Ticks

# Passage de la date du jour en Ticks dans la variable $d

#Pour pouvoir calculer la différence de jours entre la date d’expiration du compte et la date du jour, nous avons mis les deux dates en Ticks, car le Ticks est plus simple à calculer qu’une date en jour/mois/année. Vous pouvez trouver toutes les informations à ce lien : http://stackoverflow.com/questions/1140576/powershell-convert-ticks-to-time

# Calculer la différence de jours

$comp = $exp - $d

#Nous calculons la différence entre les deux dates et la mettons dans la variable $comp

# 12750000000000 = 15 jours

#Nous avons décidé d’avertir l’utilisateur 15 jours avant l’expiration de son mot de passe. 15 jours correspondent à 12750000000000 Ticks.

# Si $comp est inférieur à 15 jours, écrire

if ($comp -le 12750000000000)

{

#Nous testons si notre variable $comp, qui correspond aux nombres de jours en Ticks avant l’expiration du mot de passe, est inférieur ou égal à 15 jours.

ADD-content -path $fichier -value $foruser";"

#Si, oui, nous ajoutons une ligne avec le SamAccountName qui est stocké dans la variable $foruser du compte dans le fichier users_expire.txt

}

# Fin de la boucle if (Si en Français).

}

# Fin de la boucle foreach et fin du script.

Mise en place de la tâche planifiée

Sur le serveur, aller sur Planificateurs de tâches :

Cliquer sur Bibliothèque du Planificateur de tâches :

Dans action, sélectionner sur Créer une tâche de base :

Dans l’onglet Général, Nommer votre script, Expiration mot de passe dans mon cas. Puis cliquer sur Exécuter même si l’utilisateur n’est pas connecté :

Dans l’onglet Déclencheurs, cliquer Nouveau. Renseigner comme ceci :

  • Lancer la tâche : A l’heure programmée

  • Paramètres : Chaque jour, 17 Octobre 2013 à 17h30 et répéter tous les 1 jours

  • Paramètres avancés : Cocher Répéter la tâche toutes les 30 minutes pour une durée de 1 jour.

  • Cocher sur Activée

Nous pouvons voir notre déclenchement s’afficher :

Passer à l’onglet Actions et cliquer sur Nouveau :

Renseigner comme ceci :

  • Action : Démarrer un programme

  • Programme/Script : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

  • Ajouter des arguments (facultatif) : - File C:\Windows\SYSVOL\sysvol\garreau.local\scripts\expiration.ps1

Nous pouvons voir s’afficher notre action s’afficher :

Passer à l’onglet Conditions, ne modifier rien.

Sur l’onglet Paramètres, ne rien modifier non plus.

Cliquer sur OK et renseigner le mot de passe du compte Administrateur :

Nous pouvons voir notre tâche planifier s’afficher :

Script pour afficher une fenêtre pop-up à l’ouverture de session

Le script popup_expiration.ps1

Ci-dessous, voici le second script nommé popup_expiration.ps1 dans sa globalité, comme dit précédemment, ce dernier se lance à l’ouverture de la session sur le poste de l’utilisateur :

$connect = $env:USERNAME

$fichier = Import-Csv -Delimiter ";" -Path "\\garr-dc01\SYSVOL\garreau.local\scripts\users_expire.txt"

foreach ($line in $fichier)

{

$l = $line.sam

if ($connect -eq $l) {

$wshell = New-Object -ComObject Wscript.Shell

$wshell.Popup("Veuillez modifier votre mot de passe Ctrl + Alt + Suppr > Modifier un mot de passe Merci")

}

}

exit

Explication

$connect = $env:USERNAME

#Nous récupérons dans la variable $connect le SamAccountName de l’utilisateur qui lance sa session.

$fichier = Import-Csv -Delimiter ";" -Path \\garr-dc01\SYSVOL\garreau.local\scripts\users_expire.txt

#Nous importons dans la variable $fichier, le chemin vers le fichier texte où sont stockés les SamAccountName des comptes où le mot de passe va expirer.

foreach ($line in $fichier)

{

#Lancement du foreach en passant sur chaque ligne du fichier (users_expire.txt) ou le chemin est stocké dans la variable $fichier.

$l = $line.sam

#Nous sélectionnons pour chaque ligne, seulement la colonne sam. En fait, nous la forçons juste car c’est la seule colonne.

if ($connect -eq $l)

{

#Nous comparons le SamAccountName du compte connecté au poste avec la ligne du fichier que nous lisons dans la boucle foreach.

$wshell = New-Object -ComObject Wscript.Shell

#Nous créons notre pop-up.

$wshell.Popup("Veuillez modifier votre mot de passe

Ctrl + Alt + Suppr > Modifier un mot de passe

Merci")

#Nous mettons le texte qui va s’afficher dans la Pop-up. Ce message va expliquer la marche à suivre à l’utilisateur pour changer son mot de passe. Car c’est possible que des utilisateurs ne savent pas comment faire.

}

#Fin de la boucle If

}

#Fin de la boucle foreach

Exit

#Nous fermons le script. #Fin du script !

Mise en place de la GPO de script d’ouverture de session

Nous allons mettre en place une GPO (Group Policy) pour lancer le script popup_expiration.ps1 à l’ouverture de session des utilisateurs qui sont dans l’Unité Organisation (OU).

Veuillez ouvrir Gestion des stratégies de groupe :

Clic-droit sur l’OU UTILISATEURS et faites Créer un objet GPO dans ce domaine, et le lier ici…

Nommer le, GPO-GARR-ScriptMDP dans mon cas,

Aller dans Configurateur utilisateur > Paramètres Windows > Scripts (Ouverture/fermeture de session) :

Sélectionner Ouverture de session :

Vous arrivez sur l’onglet Scripts, passer sur l’onglet Scripts PowerShell :

Cliquer sur Ajouter… :

Renseigner le chemin vers le script, dans mon cas : \\garreau.local\SYSVOL\garreau.local\scripts\popu_expiration.ps1 et cliquer sur OK :

Nous pouvons voir notre script s’afficher, cliquer sur OK :

Nous pouvons voir le récapitulatif de la GPO :

La Pop-up

Ci-dessous nous pouvons voir le résultat de la Pop-up :

Cette dernière s’affiche sur le poste à l’ouverture de sa session. Elle n’est pas très dissuasive mais rappelle à l’utilisateur que son mot de passe de session doit être changé. L’utilisateur voyant depuis quelques jours ce message, va prendre l’initiative de le changer. De plus, ce message apparait à l’ouverture de sa session. Il n’a pas commencé à travailler donc peut réaliser cette manipulation sans problème.

Conclusion

Nous avons pu voir dans cet article que ces scripts sont très simples à mettre en place et peut faire gagner du temps à l’administrateur réseau en charge du réseau et du contrôleur de domaine de l’entreprise. D’une part, le message sous forme de pop-up à l’ouverture de la session s’affiche en automatique. D’autre part, cela peut lui permettre en regardant le fichier .txt nommé users_expire, de voir les utilisateurs qui n’ont pas changé leur mot de passe et leur dire de vive voix.

Ce script est très simple, il peut être facilement amélioré, comme par exemple pour mettre le jour de jours restant avant l’expiration du mot de passe. Cependant, dans le script présent dans l’article, l’employé ne sait pas combien de temps il lui reste et pense qu’il faut le faire maintenant. On aurait pu aussi mettre en place, au lieu d’une Pop-up, un envoi de mail directement sur la boite à lettre de l’utilisateur ou de son responsable hiérarchique. Cependant les employés sont souvent submergé de mails, donc pour moi la bonne solution est bien la Pop-up.

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels