Catégorie : Powershell

[Powershell] Récupérer la date de dernière connexion

#
# Get-Lastlogon
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 24/03/14
# Version : 1.0
# Description : Récupère la date de dernière connexion d'un utilisateur ou d'un ordinateur
# Commentaire : Le lastlogon n'etant pas replique entre les DCs, le script recupere les valeurs de chaque DC puis selectionne la plus recente 
# Requis : Module ActiveDirectory

# On importe le module ActiveDirectory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue

# Si le module est bien présent
if ($? -eq 'true')
{
    # On lance la boucle pour chaque demande (utilisateur/ordinateur)
    do {
        # On lance la boucle pour la séléction du type (utilisateur ou ordinateur) afin de prendre en compte les fautes de frappe
        $i=0
        while ($i -eq 0)
        {
            # Mise en forme de l'affichage
            echo "`nAfficher la date de derniere connexion d'un :`n"
            echo "1 - Utilisateur"
            echo "2 - Ordinateur`n"

            # Demande du type
            $choix = Read-host "Choix"
            echo ""

            # Demande du login utilisateur ou nom de machine puis test de l'existence du compte
            # Si l'utilisateur existe, on continue le script, sinon, on recommence le script
            switch ($choix){
                 1 {$name = Read-host "Login de l'utilisateur "; echo "" ; if ((Get-ADUser -Filter {sAMAccountName -eq $name}) -ne $null) { $i=1 } else { echo "L'utilisateur n'existe pas !`n" }; break}
                 2 {$name = Read-host "Nom de la machine "; echo "" ; if ((Get-ADComputer -Filter {name -eq $name}) -ne $null) { $i=1 } else { echo "L'ordinateur n'existe pas !`n" }; break}
                 default {"Mauvais choix !`n"; break}
                 }
        }

        # On récupère la liste de tous les DC du domaine
        $liste_DC = (Get-ADDomainController -Filter *).HostName

        # On fixe les variables
        $lastLogon = 0
        $logonDC = $null

        # Pour chaque DC du domaine
        foreach ($dc in $liste_DC)
        {
            # On formule la requête selon le type et on récupère la valeur
            switch ($choix){
                 1 {$res = Get-ADUser $name -Properties LastLogon -Server $dc ; break}
                 2 {$res = Get-ADComputer $name -Properties LastLogon -Server $dc  ; break}
                 }
    
            # 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)

        # On affichage le lastlogon et le DC correspondant
        echo "Derniere connexion : $lastlogon"
        echo "Serveur      : $logonDC`n"

    # On propose de relancer le script pour un autre compte
    $quit = Read-Host “On continue ? (O/n)”
    }
    until (($quit -eq “n”) -or ($quit -eq “N”))
}
else
{
    # Si le module est absent, on abandonne le script
    echo "Il faut le module ActiveDirectory !"
}

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

[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)

[Powershell] Envoyer un email

Marche à suivre afin d’envoyer un email en Powershell :

$expediteur = "bob@em-corporation.fr"
$destinataire = "admin@em-corporation.fr"
$serveur = "@MTA"
$objet = "A propos de la réunion d'hier"
$texte = "Bonjour,`r`rJ'ai trouvé ça très bien`r`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)

[Powershell] Script en tâche planifiée

Lors de la création de l’action :

Programme/script :

powershell.exe

Ajouter des arguments (facultatif) : 

-noprofile -executionpolicy Unrestricted -file $CHEMIN$\script.ps1

Bien entendu si la policy d’exécution des script Powershell est déjà en Unrestricted il n’est pas necessaire de l’indiquer.