15/11/2024

Récupérer des informations sur les utilisateurs avec PowerShell

I. Présentation

Suite à l’installation du module PowerShell « Active Directory » que l’on a vu dans le chapitre précédent, nous allons maintenant rentrer dans le vif du sujet et manipuler l’annuaire Active Directory.

Pour commencer, nous allons jouer avec les utilisateurs et dans ce chapitre nous allons voir comment récupérer des informations sur les utilisateurs.

Le cmdlet Get-ADUser est disponible depuis PowerShell 2.0 dans le module Active Directory et il sera notre principal allié pour récupérer des informations sur les utilisateurs de l’annuaire. Autrement dit, ce cmdlet est disponible depuis Windows Server 2008 R2. Il offre une excellente alternative aux autres outils que l’on pouvait utiliser jusqu’ici, notamment des scripts VBS ou dsquery.

Nous pouvons récupérer différentes informations grâce à la lecture des attributs :

  • L’identifiant d’un utilisateur, son nom, son prénom
  • L’adresse e-mail associée au compte utilisateur
  • La date de dernière connexion au domaine Active Directory
  • La date de dernière modification d’un compte utilisateur
  • La date de création de l’objet
  • Etc.

Tout dépend aussi des données renseignées dans les comptes de vos utilisateurs.

Avant de commencer, si besoin vous pourrez retrouver l’aide de Get-ADUser :

  • Dans la console PowerShell avec : Get-Help Get-ADUser
  • Dans la documentation officielle de Microsoft : Aide - Get-ADUser

II. Syntaxe de Get-ADUser

Il est à noter que la commande Get-ADUser utilise un paramètre -Filter pour créer une requête et rechercher nos utilisateurs. Nous verrons qu'il y a deux façons de filtrer. Pour ne pas filtrer et donc récupérer la liste de tous les utilisateurs du domaine, il suffit d’exécuter cette commande :

Get-ADUser -Filter *

Attention : cette commande peut s’avérer très gourmande et durer un certain temps si votre annuaire Active Directory est peuplé de nombreux comptes. Méfiance donc avant de l’exécuter !

Get-ADUser

Pour la suite, si vous voulez tester au fur et à mesure, voici la syntaxe pour filtrer sur un seul utilisateur en se basant sur son login (attribut saMAccountName). Exemple avec le compte « Administrateur » :

Get-ADUser -Filter "SamAccountName -eq 'Administrateur'"

Une alternative serait d’utiliser le paramètre -Identity pour réaliser le filtre, en lui spécifiant le login de l’utilisateur :

Get-ADUser -Identity Administrateur

Enfin, il y a une autre alternative, tout simplement :

Get-ADUser Administrateur

Pour ma part, je préfère préciser un contrôleur de domaine spécifique lorsque je requête l’annuaire Active Directory. Au moins, je sais où part ma requête. Pour spécifier un serveur, nous utiliserons cette syntaxe (nom du serveur à adapter) :

Get-ADUser -Filter "SamAccountName -eq 'Administrateur'" -Server SRV-ADDS-01.it-connect.local

Ce paramètre existe sur l’ensemble des commandes liées à l’AD donc je vous recommande de prendre l’habitude de l’utiliser. En déclarant une variable $DC au début de votre script par exemple, et il suffit ensuite de l’appeler dans chaque commande ce qui facilite le changement de DC si nécessaire.

Comme nous avons pu le voir sur la première copie d’écran, par défaut il y a 10 propriétés basiques retournées dans la console, mais tout n’est pas là : il y en a plus de 100 pour un objet utilisateur.

Vous allez me dire, ce filtre par défaut est plutôt intéressant pour éviter de charger des données inutilement… Néanmoins, nous pouvons ajouter un ou plusieurs attributs supplémentaires à afficher.

Le paramètre -Properties doit être ajouté à la commande. Si l’on indique « * » on peut charger toutes les propriétés, alors si en plus on utilise « * » pour le filtre, je vous laisse imaginer la lourdeur de la requête.

Pour spécifier un attribut supplémentaire à charger, il suffit d’indiquer son nom. Voici un exemple pour afficher l’attribut « mail » :

Get-ADUser -Filter "SamAccountName -eq 'Administrateur'" -Server SRV-ADDS-01.it-connect.local -Properties mail

S’il y a plusieurs attributs à ajouter, il suffit de séparer les noms par une virgule. Par exemple :

Get-ADUser -Filter "SamAccountName -eq 'Administrateur'" -Server SRV-ADDS-01.it-connect.local -Properties mail,lastLogon

Après avoir vu ces premiers paramètres, indispensables à l’utilisation de la commande Get-ADUser, je vous propose de voir d’autres exemples.

III. Rechercher des utilisateurs dans une OU avec -SearchBase

Pour réaliser une action sur un lot d’utilisateurs, il peut s’avérer très utile d’utiliser un filtre basé sur une unité d’organisation (OU).

Le cmdlet Get-ADUser intègre un paramètre nommé -SearchBase qui va permettre de répondre à ce besoin. Ce qui donne :

Get-ADUser -Filter * -SearchBase "CN=Users,DC=IT-CONNECT,DC=LOCAL" -Server SRV-ADDS-01.it-connect.local

Pour l’unité d’organisation, vous devez préciser son « chemin » correspondant à son DN (DistinguishedName). Vous pouvez le retrouver dans les propriétés de l’OU via l’onglet « Editeur d’attributs » ou en PowerShell grâce à la commande :

Get-ADOrganizationalUnit -Filter * | Format-Table DistinguishedName

Il suffit de copier la valeur correspondante à votre unité d’organisation cible et de l’utilisation dans la commande Get-ADUser.

Pour récupérer la liste des utilisateurs à partir de plusieurs OU, je vous oriente vers mon tutoriel à ce sujet si cela vous intéresse : Récupérer la liste d'utilisateurs de plusieurs OUs

IV. Obtenir la liste des adresses e-mails des utilisateurs

Si l’attribut « mail » est renseigné dans vos comptes utilisateurs alors vous pouvez récupérer facilement une liste des adresses e-mails. Nous allons utiliser la propriété “EmailAddress” ou “mail” : les deux fonctionnent pour récupérer l’adresse e-mail.

Enfin, pour que ce soit plus lisible, nous allons sortir le résultat dans un tableau avec seulement deux colonnes via la commande Format-Table (que l’on peut raccourcir en ft).

Get-ADUser -Filter * -SearchBase "CN=Users,DC=IT-CONNECT,DC=LOCAL" -Properties EmailAddress | Format-Table Name,EmailAddress

Pour que ce soit plus pertinent, nous pouvons ajouter un filtre pour récupérer seulement les utilisateurs actifs et où l’attribut EmailAddress n’est pas vide (null). Ce qui donne :

Get-ADUser -Filter {(EmailAddress -ne "null") -and (Enabled -eq "true")} -SearchBase "CN=Users,DC=IT-CONNECT,DC=LOCAL" -Properties EmailAddress | Format-Table Name,EmailAddress

V. Afficher la date de création des comptes

Pour récupérer la date de création d’un ou plusieurs comptes Active Directory, il faut lire la valeur de l’attribut « whenCreated » car il contient la date de création de l’objet dans l’Active Directory.

Ainsi, il suffit de l’appeler via le paramètre -Properties pour l’afficher. J’aime bien utiliser Select-Object en complément pour affiner le résultat qui s’affiche dans la console.

Voici la commande, avec le filtre à adapter à vos besoins comme à chaque fois :

Get-ADUser -Filter * -Properties WhenCreated | Select-Object Name, whenCreated

Pour découvrir comment récupérer la liste des utilisateurs créés à une date précise, je vous recommande la lecture de mon article à ce sujet : Active Directory - récupérer la liste des utilisateurs créés à une date précise

VI. Quels sont les groupes dont l’utilisateur est membre ?

Une autre chose qui est utile, c’est de récupérer la liste des groupes dont un utilisateur est membre. Là encore, on va pouvoir s’appuyer sur un attribut : memberof. Pour afficher la liste des groupes dont un utilisateur spécifique est membre, voici la commande à utiliser :

Get-ADUser -Identity Administrateur -Properties memberof | Select-Object memberof -ExpandProperty memberof

Nous pouvons vérifier ensuite si l’utilisateur est membre du groupe « Admins du domaine » (ou un autre groupe) et si c’est le cas, réaliser un ensemble d’actions sur ce compte. Voici un exemple :

$MemberOf = Get-ADUser -Identity Administrateur -Properties memberof | Select-Object SamAccountName,memberof

if($MemberOf.memberof -match "Admins du domaine"){
    Write-Host "attention il s'agit d'un compte Administrateur !"
}

VII. Coupler l’utilisation du Filter et du Like

Comme vu précédemment, le paramètre -Filter sert à appliquer un filtre sur la requête exécutée par la commande Get-ADUser afin d’affiner la recherche sur un ou plusieurs attributs. Cela est intéressant pour rechercher un compte précis notamment, même si l’on peut préférer l’utilisation du paramètre -Identity.

Si l’on associe le paramètre -Filter à l’utilisation de l’opérateur Like nous pouvons appliquer un filtre plus large. Par exemple, récupérer la liste de tous les utilisateurs qui ont un prénom ou un nom spécifique, ou un caractère spécifique dans le nom, etc.

Pour rechercher les utilisateurs qui ont la chaîne de caractères “connect” dans l’attribut Name, on utilisera :

Get-ADUser -Filter "Name -Like '*connect*'" -Properties Name,SamAccountName | Select Name,SamAccountName

À noter l’importance des astérisques avant et après le terme à rechercher pour signifier qu’il peut y avoir X caractères avant et X caractères après. Nous n’avons pas utilisé l’opérateur -match car il n’est pas compatible avec le paramètre -Filter, donc avec l’opérateur -like cela permet de contourner cette contrainte.

Lorsque l’on définit un filtre, il est tout à fait possible de se baser sur plusieurs conditions, séparées par un opérateur comme -and (et) ou -or (ou) afin d’affiner la requête.

Si l’on veut rechercher la chaîne “itconnect” à la fois dans l’attribut Name et dans l’attribut saMAccountName, cela donnera la commande suivante :

Get-ADUser -Filter "(Name -Like '*connect*') -or (SamAccountName -Like '*connect*')" -Properties * | Select Name,SamAccountName

VIII. Récupérer la liste des comptes utilisateurs désactivés

Lorsque vous souhaitez faire un état des lieux de votre Active Directory, vous pouvez vous poser la question suivante : combien ai-je de comptes utilisateurs désactivés au sein de mon annuaire ? Là encore, PowerShell et le cmdlet Get-ADUser sont là pour nous permettre de répondre à cette question.

L’attribut « Enabled » est un booléen présent au sein de la fiche de chaque utilisateur, donc si sa valeur est égale à « false » cela signifie que le compte est désactivé : il ne reste plus qu’à filtrer en ce sens.

Ce qui donne :

Get-ADUser -Filter { Enabled -eq $False } | Format-Table SamAccountName , Name

Dans cet exemple, nous allons retourner un tableau avec deux attributs.

Dans cet exemple, nous allons retourner un tableau avec deux attributs. Sur l’image ci-dessous, on peut voir que cela fonctionne aussi avec "False" plutôt que $False, mais il vaut mieux préférer l’écriture $False qui est plus correcte (valeur booléenne).

IX. Récupérer la liste des comptes où le mot de passe est expiré

En termes de reporting sur l’état de vos comptes et en complément de la liste des comptes désactivés, il est intéressant d’obtenir la liste des comptes où le mot de passe est expiré. Uniquement pour les comptes actifs pour que ce soit plus pertinent.

Nous devons charger la propriété « PasswordExpired » et réaliser un filtre sur cette propriété. J’en profite pour vous indiquer que pour faire un filtre, il y a à chaque fois la possibilité d’inclure la condition dans -Filter ou alors de réaliser un filtre via un Where (Where-Object), voire même de mixer les deux…

Voici la commande associée à la requête que l’on recherche :

Get-ADUser -Filter { Enabled -eq "True" } -Properties PasswordExpired | Where {$_.PasswordExpired -eq $true }

Note : le caractère $_ permet d’utiliser une variable automatique qui reprend l’occurrence courante renvoyée par la commande avant le « | », c’est-à-dire Get-ADUser.

Pour finir ce chapitre, nous allons réaliser deux requêtes d’un style différent. Je vous laisse lire la suite sans plus attendre.

X. Compter le nombre d’utilisateurs dans l’Active Directory

Avoir la liste des comptes désactivés, des comptes où le mot de passe est expiré, etc… C’est bien, mais il peut être intéressant de tout simplement savoir combien il y en a. Pour obtenir cette information, nous pouvons faire appel à la propriété « count » qui va simplement nous retourner le nombre de résultats, sans nous les afficher.

Imaginons que nous prenons cette requête toute simple pour afficher les comptes actifs dans l’AD :

Get-ADUser -Filter { Enabled -eq $True }

Si l’on souhaite savoir combien il y a de comptes actifs dans l’AD, il suffit d’exécuter cette commande :

(Get-ADUser -Filter { Enabled -eq $True }).Count

Note : comme je le disais précédemment, lorsque l’on filtre sur un attribut booléen comme Enabled, on peut soit indiquer « false » ou « true » entre guillemets, soit indiquer $false ou $true.

Si l’on veut récupérer la liste des utilisateurs, et ensuite dans un second temps, compter le nombre d’objets retournés par la commande sans multiplier les requêtes dans l’annuaire, il faut passer par une variable « intermédiaire ». Ce qui donne :

$ADUsersEnabled = Get-ADUser -Filter { Enabled -eq $True }
($ADUsersEnabled).Count

XI. Exporter les utilisateurs dans un fichier CSV

Pour finir ce chapitre, nous allons voir comment exporter dans un fichier CSV les résultats d’une requête Get-ADUser. Pour cela, le résultat de la commande sera envoyé via le pipeline dans une commande Select-Object pour sélectionner les propriétés à inclure au fichier CSV puis grâce à un second pipeline, nous allons réaliser l’export grâce au cmdlet Export-Csv.

Ce cmdlet sera accompagné de trois paramètres : -Path pour indiquer le nom du fichier CSV et le dossier dans lequel le créer ; -Encoding pour le type d’encodage des données (utile pour les accents) ; -NoTypeInformation pour ne pas inclure une ligne sur la provenance des données intégrées : cela est préférable pour avoir une première qui correspond à nos en-têtes de colonnes du fichier CSV. Si nous n’indiquons pas le paramètre -NoTypeInformation la première ligne du CSV serait :

#TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser

Le paramètre -Delimiter peut être ajouté si l’on désire modifier le type de délimiteur : celui par défaut est la virgule.

Voici un exemple pour exporter dans un fichier CSV « Users_Disabled.csv » les comptes désactivés en intégrant trois propriétés : SamAccountName, Name, EmailAddress.

Get-ADUser -Filter {Enabled -eq $False} -Properties EmailAddress | `
           Select-Object SamAccountName, Name, EmailAddress | `
           Export-Csv -Path "C:\Temp\Users_Disabled.csv" -Encoding Default `
           -NoTypeInformation

Suite à l’exécution de cette commande, nous obtenons le fichier suivant :

Enfin, sachez que les données dans le fichier CSV peuvent être triées sur la base d’un attribut, pour cela il faut insérer une commande supplémentaire : Sort-Object, suivie de l’attribut à utiliser pour réaliser le tri alphabétique. Voici un exemple :

Get-ADUser -Filter {Enabled -eq $False} -Properties EmailAddress | `
           Select-Object SamAccountName, Name, EmailAddress | `
           Sort-Object Name | `
           Export-Csv -Path "C:\Temp\Users_Disabled.csv" -Encoding Default `
           -NoTypeInformation

Grâce aux différents exemples d’utilisation de la commande Get-ADUser, vous êtes désormais en mesure de réaliser des requêtes dans l’Active Directory pour récupérer des informations sur vos users.

La notion de filtre via le paramètre -Filter est très importante et c’est grâce à ce filtrage que l’on va pouvoir récupérer ceux que l’on souhaite. Ensuite, l’utilisation de Select-Object ou Format-Table sert à affiner la sortie et avoir un résultat plus synthétique.

Enfin, pensez à utiliser le paramètre -Server pour préciser le contrôleur de domaine que vous souhaitez interroger, je considère cela comme étant une bonne pratique.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail