在 Powershell Get-ADUser -Filter 中使用变量

Using Variables in Powershell Get-ADUser -Filter

有人可以帮助我正确引用,我需要 Get-ADUser -Filter 搜索中名字和姓氏变量旁边的通配符

我想我需要转义单引号但无法成功 return。

$LastADname = John
$FistADname = Doe
Get-ADUser -Filter "Name -like `*$LastADname`*$FirstADname`*"

Returns: Get-ADUser : Error parsing query: 'Name -like *Doe*John*' Error Message: 'syntax error' at position 12

这让我知道它确实解析了变量而不是 *。如果我用单引号将所有变量和 * 括起来,它不会解析变量。喜欢下面

$LastADname = John
$FistADname = Doe
Get-ADUser -Filter 'Name -like "*$LastADname*$FirstADname*"'

我相信这是因为上面解决了但没有产生任何值。当我将 var 替换为文本时,它会产生结果

Get-ADUser -Filter 'Name -like "*Doe*John*"'

您需要用单引号将内部过滤器字符串括起来:

Get-ADUser -Filter "Name -like '*$LastADname*$FirstADname*'"

您不需要 ` 来转义 * 字符。用单引号 ' 包裹外部字符串的第二次尝试没有成功,因为单引号字符串是按字面意思呈现的。双引号 " 字符串允许您扩展变量,使用带有 ` 的转义序列,以及字符串中的 return 子表达式。


但是,如果目标字段值包含 '(或者可能包含,如果由变量控制),例如名称 O'Niel,这将中断内部查询,因为' 将被解析为搜索词的结尾,并会导致错误,因为接下来的内容几乎肯定不是有效的表达式语法。幸运的是,转义引号很容易,您无需担心使用 ` 字符进行转义。

考虑以下示例,我们要查找名称字段包含 O' 字符串的所有用户,就像上面的 O'Niel 示例一样。在此示例中,搜索词提供了一个变量,就像在 OP 的用例中一样。只需为 -Filter 字符串使用双引号,并为内部引号也提供 ""(这与 `" 呈现相同):

$term = "O'Niel"
Get-ADUser -Filter "Name -like ""*$term*"""

这不会破坏内部查询,因为现在 " 表示术语边界而不是 '

Note: If your search term contains ", you will need to escape instead for that. If your search term contains both ' and ", you can't use -Filter to search for that specific term. However, you can utilize -LDAPFilter for this since quotes are not used as the search term bounds.

当您搜索 return 和 DistinguishedName 的字段时,事情会得到 bit more complicated,但我不会用这些细节来混淆这个答案。阅读上面的 link 以获取更多信息,我最终会在底部更新我的 linked 答案,其中包含有关转义序列和 DN/CN 过滤的更多信息。


请参阅我写的 以获取有关通过 RSAT AD cmdlet 有效使用 -Filter 参数的更多信息。我已经用关于过滤器转义和处理“带引号的名称”案例的更完整信息更新了该答案。