12 juillet 2012
[Powershell] Liste des utilisateurs ne s’étant pas connectés au domaine depuis plus de 30 jours
# Nom : Comptes_inactifs.ps1
# Date : 17/02/2012
# Auteur : Johan
# Description : Liste les utilisateurs qui ne se sont pas connectés au domaine depuis
# plus de 30 jours et envoi le résultat par mail
# Commentaire : Exécution tous les 1er du mois
# Recherche dans l'OU souhaité tous les comptes utilisateurs
$ldapquery = [ADSI] 'LDAP://OU=Utilisateurs,DC=em-corporation,DC=fr'
$objrechercher = New-object system.directoryservices.directorysearcher($ldapQuery)
$objrechercher.filter ='(&(objectClass=person)(objectCategory=person))'
$boucle = $objrechercher.findall()
$liste=""
# Fonction Get-UTCAge permettant de transformer la valeur du lastlogon en date afin de calculer le nombre de jours depuis la dernière connexion
Function Get-UTCAge {
Param([int64]$Last=0)
if ($Last -eq 0) {
}
else
{
[datetime]$utc="1/1/1601"
$i=$Last/864000000000
$lastlogon = ($utc.adddays($i))
$today=get-date
$diff=($today)-($lastlogon)
# Si l'utilisateur ne s'est pas connecté depuis au moins 30 jours on ajoute son nom à la liste
if ($diff.Days -gt 30)
{
write "$name`r"
}
}
}
# Pour chaque utilisateur
foreach ($user in $boucle)
{
# On vérifie qu'il possède une adresse email (permettant de différencier les comptes utilisateurs des comptes génériques ou applicatifs)
if ($user.properties.mail)
{
# On récupère le nom et le lastlogon de l'utilisateur
$name = $user.properties.name
$last = $user.Properties.lastlogon
$liste+=Get-UTCAge $user.properties.item("lastlogon")[0]
}
}
# On prépare et on envoi le mail
$expediteur = "bob@em-corporation.fr"
$destinataire = " admin@em-corporation.fr"
$serveur = "@MTA"
$objet = "Active Directory - Utilisateurs inactifs"
$texte = "Bonjour,`r`rVoici la liste des utilisateurs ne s'étant pas connectés au domaine depuis plus de 30 jours :`r`r$liste`rCordialement`r--`rBob"
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
$SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$SMTPclient.Send($message)
8 Comments
Salut Johan,
J’ai essayé ton script et il semble bien fonctionner mis a part le email. je recoit le courriel mais avec seulement:
Bonjour, Voici la liste des utilisateurs ne s’étant pas connectés au domaine depuis plus de 30 jours :
Es-ce que tu as une idée pourquoi ?
Merci !
J’ai trouvé une parti du problème, j’ai changé le $bob pour $liste et j’ai une liste, mais je ne vois pas la dernière connexion.
En effet il y avait une petite erreur de variable dans mon copier/coller.
Pour avoir la date de dernière connexion il suffit de rajouter la variable correspondante dans le write de la fonction.
Merci pour ta réponse ! J’ai trouvé comment ajouter la variable mais elle me l’affiche en format bizzare, es-ce possible de l’avoir en format plus lisible ?
write « $name $last`r »
Merci !
Normalement c’est $lastlogon (je ne suis pas au boulot je ne peux pas tester)
C’est ca, Merci beaucoup pour ton aide.
Es-ce difficile d’ajouter au script qu’il ne donne pas les comptes désactivés dans le résultat ? Ou de mettre un OU a ne PAS vérifier ?
Pas vraiment. Il suffit de faire une boucle sur les OU souhaitées, et dans la boucle des utilisateurs, vérifier l’état du compte avant de l’incorporer dans la liste ou non.