[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 !"
}

Add a Comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *