【问题标题】:Get-ADUser -Filter fails when comparing to an object's property与对象的属性进行比较时,Get-ADUser -Filter 失败
【发布时间】:2015-06-01 03:33:08
【问题描述】:

我有一个与导入 csv 文件有关的 powershell 问题,然后通过 csv 文件执行 foreach。

我有类似以下的内容:

$infile = "c:\temp\infile.csv"
$outfile = "c:\temp\outfile.csv"

$csv = Import-csv -path $infile
foreach ($line in $csv)
{
  $data = Get-ADUser -Filter {EmailAddress -eq $line.email} -Property Mail |     Select-Object -ExpandProperty SamAccountName
}

当我这样做时,我收到以下错误:

Get-ADUser : Property: 'email' not found in object of type: 'System.Management.Automation.PSCustomObject'.
At C:\Temp\program1.ps1:11 char:24
+         $ad_data = Get-ADUser <<<<  -Filter {EmailAddress -eq $line.email} -Property Mail | Select-Object -ExpandProperty SamAccountName
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : Property: 'email' not found in object of type: 'System.Management.Automation.PSCustomObject'.,Microsoft.ActiveDirectory.Management.Commands.GetADUser

但如果我这样做:

    $var = $line.email
    $data = Get-ADUser -Filter {EmailAddress -eq $var} -Property Mail | Select-Object -ExpandProperty SamAccountName

为什么第二种方法有效,但第一种方法抛出错误?

谢谢,

【问题讨论】:

  • 尝试重命名$line 以避免潜在的冲突(取决于 Get-ADUser 的实现方式)。这有帮助吗?
  • 或者不支持这种过滤器。详情见here。可能并非所有值都受支持:“有关 支持的类型列表,请参阅 about_ActiveDirectory_ObjectModel。”
  • 我不得不说我不知道​​你为什么会遇到这个问题,我做了一些研究,发现一个论坛帖子,很多人讨论这个问题,没有有一个很好的解决方案。我会看看我能从其他 MVP 那里找到什么。

标签: powershell foreach


【解决方案1】:

好的,我与我的一些 PowerShell MVP 同事进行了讨论,关于为什么的答案真的很有趣。

为了快速回答,这是您在保留代码结构的同时获取 AD 用户的方法:

Get-ADUser -Filter "Emailaddress -eq '$($line.email)'"

您可以通过单独运行引用的代码来快速测试以查看发生了什么:

"Emailaddress -eq '$($line.email)'"
>Emailaddress -eq 'Jim.Adkison@foxdeploy.com'

至于为什么,外部引号总是在 PowerShell 中获胜,而 *-ADUser -Filter Cmdlet 期望值以单引号提供。

根据 PowerShell MVP 和周围的酷哥 Dave Wyatt 以及社区中备受尊敬的 MVP 和 Mike Robbins 的说法,与 PowerShell 的其他代码库相比,ADUser Cmdlet 扩展变量的方式有些不标准。他们将变量扩展的作用描述为“奇怪的巫术”,这似乎是正确的。

如果您想了解更多信息,请继续关注 Mike 关于这种场景的非常详细的博文PowerShell: When Best Practices and Accurate Results Collide

【讨论】:

  • -Filter 实际上是一个字符串类型,尽管文档中有示例。脚本块只会转换为字符串。也许这与它有关。
【解决方案2】:

如果在过滤器中使用子表达式会怎样?

Get-ADUser -Filter {EmailAddress -eq $($line.email)}

根据错误,它没有正确调用过滤器内的对象。

更多测试,$line的对象类型是什么?

$line | Get-Member

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2015-04-13
    • 2013-06-08
    • 2018-04-11
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多