TP PowerShell – Filtrer avec Where-Object (et plus si affinités)

La question du jour, c’est : Quels sont les utilisateurs qui n’exécutent pas le script logon.cmd lors du logon ? et combien sont-ils ? peut-on avoir la liste de ces comptes ?

On avait déjà vu comment chercher et lister des utilisateurs de l’Active Directory dans le TP n°1.
Donc je ne reviens pas sur la cmd-let Get-ADUser, et je vous donne directement la 1ère requête qui retourne tous les utilisateurs dans une OU et de ses sous-OU en intégrant la colonne scriptPath (qui contient le chemin du logonScript) aux objets dans le résultat.

PS C:\> Get-ADUser -Filter * -Properties @('scriptPath') -SearchBase 'OU=Utilisateurs,DC=ponyland,DC=org' -SearchScope Subtree

C’est donc à ce moment les experts d’Excel nous demanderons de leurs sortir le résultat dans un CSV pour qu’ils y mettent un filtre sur la colonne scriptPath et avoir le résultat…
=> Super efficace…

Ou alors, on peut se la jouer « beau-gosse » et filtrer directement le résultat dans PowerShell, explication : On va utiliser le pipe « | » (comme en linux) pour rediriger la sortie de la cmd-let Get-ADUser dans l’entrée de notre cmd-let Where-Object.
Cette cmd-let nous permet de faire en un appel l’équivalent de l’algorithme suivant (simplifié) :

Pour Chaque Objet en entrée :
 Si l’objet répond à la condition demandée en paramètre.
 Je l’ajoute dans le résultat renvoyé en sortie de where-objet
 Sinon
 Je ne le mets pas dans le résultat renvoyé en sortie
 Fin Si
 Fin pour chaque.

Du coup si je fais ça :

PS C:\> $res = Get-ADUser -Filter * -Properties @('scriptPath') -SearchBase 'OU=Utilisateurs,DC=ponyland,DC=org' -SearchScope Subtree | Where-Object {$_.ScriptPath -ne 'logon.bat'}

Je ne conserve que les objets pour lesquels l’attribut scriptPath n’est pas égal (-ne) à ‘logon.bat’, et ça c’est qu’on cherche !
Pour info, $_ est une variable prédéfinie contenant l’objet courant transmis par le pipe.

Vous notez au passage qu’on commence à avoir une expressivité proche du SQL, ou on écrirait un truc du genre :

Select * from ponyland.org/Utilisateurs 
 where scriptPath != 'logon.bat';

Et ça c’est quand même sympa comme d’écrire les choses…

Comme en plus d’être des beaux-gosses, on va raffiner le filtrage pour obtenir le nombre d’objets et que les objets pertinents (pas les comptes qui commence par ‘sanglier’ : on est à poneyland)

PS C:\> $res.count
 42
Et pour ne pas conserver les objets ‘sanglier’?
 
PS C:\> $res = Get-ADUser -Filter * -Properties @('scriptPath') -SearchBase 'OU=Utilisateurs,DC=ponyland,DC=org' -SearchScope Subtree | Where-Object {($_.ScriptPath -ne 'logon.bat') –and ($_.Title -notmatch 'sanglier')}

On recompte :

PS C:\> $res.count
 41

Voilà, @++

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.