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à, @++