如果使用对象,则 foreach 循环中的 Get-ADUser 将不返回任何内容

如果使用对象,则 foreach 循环中的 Get-ADUser 将不返回任何内容
$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"


$test = Foreach ($user in $users){
Get-ADUser -Filter {Name -like "*$user*" } | Select-Object SamAccountName, Enabled
} 

$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"

在上面运行不会导出任何内容到 CSV,但如果我添加,Write-Host "$User"它会导出用户列表。所以我知道导出功能有效。

如果我像这样运行它:

$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"


$test = Foreach ($user in $users){
Get-ADUser -Filter {Name -like "*User 1*" } | Select-Object SamAccountName, Enabled
} 

$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"

它用“用户 1”(文档中的第一个用户,这是预期结果)的结果填充我的 CSV,其次数与 $user 变量中的行数相同。所以我知道我的搜索方法有效。

所以我的问题是如何让它循环遍历我的 CSV 文件并在使用对象搜索时真正找到任何东西?因为当我使用手动输入的字符串时它可以工作,但使用对象时则不行。

CSV 格式如下:

USER 1
USER 2
USER 3
USER 4 

编辑:问题与 foreach 循环无关,如果我运行以下命令:

$test = "TEST USER"
Get-ADUser -Filter {Name -eq "*$test*"}

它仍然不起作用,一定是与过滤方式有关。

答案1

通常,当创建由多个字符串组合而成的搜索过滤器时,我会避免在输入本身中这样做。例如(正如您所发现的),不要执行以下操作

Get-ADUser -Filter {Name -like "*$user*"}

我尝试创建一个过滤器然后调用该函数

$filter = "*" + $user + "*"
Get-ADUser -Filter {Name -like $filter}

我发现这是成功构建 LDAP 过滤器作为多个字符串组合的唯一方法。这还使您能够在运行查询之前验证过滤器。

答案2

根据 Eric Sc​​hnabel 下面的我的评论,您不应该将“$”变量放在过滤器的引号内。您的更新脚本应该将通配符与变量结合起来,以使过滤器正常工作

$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"

$test = Foreach ($user in $users){
    $user = "*" + $user + "*"
    Get-ADUser -Filter {Name -like $user } | Select-Object SamAccountName, Enabled} 

$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"

答案3

因此,正如我在编辑中所述,这与过滤有关。现在我找到了解决方案,我实际上觉得自己很愚蠢。

这不会起作用:

Get-ADUser -Filter {Name -like "*$user*" }

这也不起作用:

Get-ADUser -Filter {Name -like "$user" }

但这有效:

Get-ADUser -Filter {Name -like $user}

如果有“或*”,它将会中断,并且无法运行,不会出现错误消息。

在这里找到了解决方案:http://www.powershellish.com/blog/2015-11-17-ad-filter

相关内容