web-dev-qa-db-fra.com

Get-Aduser -Filter n'acceptera pas une variable

J'aimerais vérifier si un compte d'utilisateur existe déjà dans le système.

$SamAc = Read-Host 'What is your username?'
$User = Get-ADUser -Filter {sAMAccountName -eq "$SamAc"}

Je ne sais pas pourquoi, mais $User renverra toujours la valeur null, même si {sAMAccountName -eq "$SamAc"} est censé être vrai.

Qu'est-ce que j'oublie ici?

Modifier:

C'est ce qui manquait:

$User = Get-ADUser -Filter "sAMAccountName -eq '$SamAc'"

Note de la rédaction: Le bloc script ({ ... }) a été remplacé par un string

13
JustAGuy

C’est ce qui m’a mordu lorsque j’ai commencé à travailler avec le module ActiveDirectory, et c’était très difficile à comprendre.

Le paramètre -Filter pour les applets de commande du module ActiveDirectory recherche actuellement une chaîne. Lorsque vous faites {sAMAccountName -eq "$SamAc"} comme valeur, il recherche réellement "sAMAccountName -eq ""`$SamAc"""

Fondamentalement, Powershell analyse le paramètre et transforme sa valeur en chaîne, sans interpoler la variable. Essayez de construire la chaîne avant, et cela devrait fonctionner.

Quelque chose comme ça:

$SamAc = Read-Host 'What is your username?'    
$filter = "sAmAccountname -eq ""$SamAc"""
$User = Get-ADUser -Filter $filter
11
Joseph Alcorn

Je dois faire un commentaire à ce sujet parce que cela m’agace vraiment de régler ce problème.

Joseph Alcorn a la bonne idée. Le paramètre filter prend une chaîne et l'évalue ensuite afin de traiter le filtre. Ce qui fait trébucher les gens, c’est que vous avez la possibilité d’utiliser des accolades {} à la place, et cela ne fonctionne pas comme vous le souhaiteriez si vous utilisiez Où ..., il doit toujours être traité comme une chaîne.

$SamAc = Read-Host 'What is your username?'
$User = Get-ADUser -Filter "sAMAccountName -eq '$SamAc'"

Je vous recommande de vous en tenir aux guillemets pour le rendre plus clair/lisible pour vous-même et les autres et d’éviter les erreurs de syntaxe, ou de vous en tenir à Où {} dans le pipeline. Ce faisant, il est préférable d’utiliser des guillemets doubles à l’extérieur et des guillemets simples à l’intérieur, de sorte que vous obtenez toujours intellisense detection sur la variable.

2
Rob Traynere
if (($ADUser = Get-ADUser -filter "SamAccountName -eq '$(Read-Host Username)'") -ne $null) {$ADUser.SamAccountName} else {"Not Found"}
0
John Longmuir

Supprimez simplement les guillemets autour de votre variable:

$SamAc = Read-Host 'What is your username?'

$User = Get-ADUser -Filter {sAMAccountName -eq $SamAc}

Cela devrait bien fonctionner.

0
Tim