web-dev-qa-db-ja.com

Get-Aduser -Filterは変数を受け入れません

ユーザーアカウントがシステムに既に存在するかどうかを確認したいと思います。

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

理由はわかりませんが、$Userがtrueであるべき場合でも、{sAMAccountName -eq "$SamAc"}は常にnullを返します。

ここで何が欠けていますか?

編集:

これは欠落していたものです:

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

編集者のメモ:スクリプトブロック{ ... })はstring.

14
JustAGuy

最初にActiveDirectoryモジュールを使用し始めたとき、これは少し気になりましたが、理解するのは苦痛でした。

ActiveDirectoryモジュールコマンドレットの-Filterパラメーターは、実際に文字列を探しています。値として{sAMAccountName -eq "$SamAc"}を実行すると、実際には"sAMAccountName -eq ""`$SamAc"""を探しています

基本的に、Powershellはパラメーターを解析してその値を文字列に変換し、変数を補間しません。事前に文字列を構築してみてください、それは動作するはずです。

このようなもの:

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

これを整理することが本当に私を悪化させたので、私はこれについてコメントしなければなりません。

ジョセフ・アルコーンには正しい考えがあります。フィルタパラメータは文字列を受け取り、それを評価してフィルタを処理します。これに人をつまずかせるのは、{}の代わりに中括弧を使用するオプションが与えられるということです。これは、Where ...を使用している場合は期待どおりに機能しません。文字列のように扱う必要があります。

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

引用符を使用して、自分や他の人にとってより明確/読みやすくし、潜在的な構文エラーを回避するか、パイプラインのWhere {}を使用することをお勧めします。そうするときは、変数で intellisense 検出が得られるように、外側で二重引用符を使用し、内側で単一引用符を使用するのが最善であることがわかります。

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

変数の前後の引用符を削除するだけです:

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

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

これでうまくいくはずです。

0
Tim