it-swarm.com.de

Get-Aduser -Filter akzeptiert keine Variablen

Ich möchte prüfen, ob bereits ein Benutzerkonto im System vorhanden ist.

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

Ich bin nicht sicher warum, aber $User wird immer null zurückgeben, auch wenn {sAMAccountName -eq "$SamAc"} wahr sein soll.

Was fehlt mir hier?

Bearbeiten:

Folgendes fehlte:

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

Anmerkung des Herausgebers: Der script-Block ({ ... }) wurde durch einen string ersetzt. 

13
JustAGuy

Dies war ein bisschen für mich, als ich anfing, mit dem ActiveDirectory-Modul zu arbeiten.

Der -Filter-Parameter für die Cmdlets des ActiveDirectory-Moduls sucht tatsächlich nach einer Zeichenfolge. Wenn Sie {sAMAccountName -eq "$SamAc"} als Wert verwenden, sucht er tatsächlich nach "sAMAccountName -eq ""`$SamAc""".

Grundsätzlich analysiert Powershell den Parameter und wandelt seinen Wert in eine Zeichenfolge um und interpoliert die Variable nicht. Versuchen Sie, die Schnur vorher zu bauen, und es sollte funktionieren.

Etwas wie das:

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

Ich muss das kommentieren, weil es mich wirklich schwer gemacht hat, das zu klären.

Joseph Alcorn hat die richtige Idee. Der filter-Parameter nimmt einen String und wertet ihn dann aus, um den Filter zu verarbeiten. Was die Leute damit beschäftigt, ist, dass Sie die Option haben, statt {} geschweifte Klammern zu verwenden. Dies funktioniert jedoch nicht wie erwartet, wenn Sie Where ... verwenden. Es muss immer noch wie eine Zeichenfolge behandelt werden.

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

Ich empfehle Ihnen, Anführungszeichen beizubehalten, um sie für sich und andere klarer/lesbarer zu machen und mögliche Syntaxfehler zu vermeiden, oder bleiben Sie bei Where {} in der Pipeline. Ich finde es am besten, doppelte Anführungszeichen an der Außenseite und einfache Anführungszeichen an der Innenseite zu verwenden, so dass Sie immer noch intellisense Erkennung für die Variable erhalten.

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

Entfernen Sie einfach die Anführungszeichen um Ihre Variable:

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

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

Das sollte gut funktionieren.

0
Tim