14 juillet 2017
[Powershell] Lister les postes inactifs
#
# Get-Inactive-Computers
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 03/12/15
# Version : 1.0
# Description : Ce script récupère tous les postes présents dans la l'AD et dresse la liste des postes ne s'étants pas connectés depuis X mois
# Commentaire : Le résultat est envoyé par email
# Requis : Module ActiveDirectory
#
# Variables
#
# Base de recherche
$base="OU=postes,DC=slashroot,DC=fr"
# Seuil d'inactivité (en mois)
$seuil="6"
# Parametres de messagerie
$expediteur = "bob@slashroot.fr"
$destinataire = "admin@slashroot.fr"
$serveur = "mx.slashroot.fr"
# On filtre le résultat selon l'OS (on ne prend pas en compte les Linux)
$os_filter="W*"
# Date d'il y a X mois
$date_seuil=$(Get-Date).addMonths(-$seuil)
$resultat=""
#
# Au boulot
#
# On importe le module ActiveDirectory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
# Si le module est bien présent
if ($? -eq 'true')
{
# Requête LDAP pour récupérer tous les postes Windows
$strCategory = “computer”
$objDomain = New-Object System.DirectoryServices.DirectoryEntry(“LDAP://$base”)
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomain,”(&(objectCategory=$strCategory)(operatingSystem=$os_filter))”,@(‘name’))
$liste=$objSearcher.FindAll() | %{$_.properties.name} | sort
# Liste de tous les DC du domaine
$liste_DC = (Get-ADDomainController -Filter *).HostName
# Pour chaque poste on récupère son lastlogon sur chaque DC afin de trouver le plus récent
foreach ($poste in $liste)
{
# On fixe les variables
$lastLogon = 0
$logonDC = $null
# Pour chaque DC du domaine
foreach ($dc in $liste_DC)
{
$res = Get-ADComputer $poste -Properties LastLogon -Server $dc
# Si le lastlogon est plus récent, on prend la valeur et le nom du DC
if ($lastLogon -lt $res.LastLogon)
{
$lastLogon = $res.LastLogon
$logonDc = $dc
}
}
# On converti le lastlogon au format date
$lastLogon = [DateTime]::FromFileTime($lastLogon)
# Si le lastlogon est plus vieux que le seuil fixé, on ajoute le poste à la liste (en ne gardant que la date JJ/MM/YYYY)
if ($lastLogon -lt $date_seuil)
{
$resultat+="$poste - $lastLogon `r"
}
}
# Si on a des postes problematiques
if ( $resultat -ne "" )
{
# On envoi le résultant par email
$objet = "[Active Directory] Postes inactifs"
$texte = "Bonjour,`r`rVoici la liste des postes ne s'étant pas connectés au domaine depuis plus de $seuil mois :`r`r$resultat`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)
}
}
else
{
# Si le module est absent, on abandonne le script
echo "Il faut le module ActiveDirectory !"
}