用 Get-ADGroup 中的变量替换字符串
Posted
技术标签:
【中文标题】用 Get-ADGroup 中的变量替换字符串【英文标题】:Replacing a string with a variable in Get-ADGroup 【发布时间】:2022-01-04 14:53:22 【问题描述】:我正在尝试使用 PowerShell 在 AD 中搜索组名称。
为什么这些param 或Read-Host
都不起作用?两者都在传递字符串,但结果为空。但是,如果我将命令中的变量$ADGroup
替换为实际的组名(字符串)并运行命令Get-ADGroup...
,结果将按预期提供。我尝试用单引号替换双引号,得到了相同的结果,该命令单独工作,但Read-Host
或 param 均未提供信息。我无法弄清楚为什么当它是一个变量时字符串没有被传递($ADGroup
)。谢谢。
param(
[Parameter(Mandatory=$true)]
[string]$ADGroup
)
# One or the other param or Read-Host
$ADGroup = Read-Host "Enter Group Name"
PS \> Get-ADGroup -Filter name -like "*$ADGroup*" -Properties * | Select-Object -Property Name
Get-ADGroup -Filter name -like '*GroupName*' -Properties * | Select-Object -Property Name
Name
----
Results
Results
Results
Results
Results
【问题讨论】:
它不起作用,没有返回,或者?从技术上讲,它应该可以工作。只要传递给命令的字符串在被搜索的名称中具有相同的字符,您的代码就没有问题。即:best - 将匹配:testbesttest。正如它的名字一样。此外,Get-ADGroup
默认已经返回 name 属性。无需获取所有属性,即可选择已返回的属性。摆脱-properties
。
带有 AD cmdlet 的基于脚本块的过滤器可能有点不稳定,请尝试使用 -Filter "name -like '*$ADGroup*'"
【参考方案1】:
这就是为什么不推荐在ActiveDirectory Module 的cmdlet 上使用基于脚本块 的过滤器(-Filter ...
) 的原因之一。
ActiveDirectory 模块中Get-*
cmdlet 的参数 部分中的-Filter
声明如下:
查询字符串:
-Filter
指定检索 Active Directory 对象的查询字符串。此字符串使用 PowerShell 表达式语言 语法。 PowerShell 表达式语言语法为 Filter 参数接收的值类型提供了丰富的类型转换支持。该语法使用有序表示,这意味着运算符位于操作数和值之间。
Get-ADGroup -Filter "name -like '*$ADGroup*'"
LDAP 查询字符串:
Get-ADGroup -LDAPFilter "(name=*$ADGroup*)"
高效过滤的推荐文档:
about_ActiveDirectory_Filter Active Directory: LDAP Syntax Filters注意:值得一提的是,在查询 Active Directory 时,您将希望仅从 AD 对象中检索所需的属性,特别是在查询大型域/森林时。使用 -Properties *
是一种不好的做法,而且效率也很低,这会降低您的查询速度,因为它正在检索被查询对象的所有可用属性。
【讨论】:
【参考方案2】:可能它没有将其识别为字符串或过滤器不正确。
param(
[Parameter(Mandatory=$true)]
[string]$ADGroup
)
#one or the other param or read-host
$ADGroup = Read-Host "enter group name"
$ADGroup = $ADGroup.ToString()
Get-ADGroup -Filter name -like "*$ADGroup*" -Properties * | select -Property Name
或者这应该这样做..
$ADGroup = $ADGroup.ToString()
Get-ADGroup -Filter name -like "*$ADGroup*" -Properties * | Select-Object -expandProperty Name
【讨论】:
传递给Read-Host
的任何内容都已经转换为字符串
感谢您的努力,但仍然无法正常工作。我完全期望 $ADGrup.ToString() 能够工作,但又空了回来。 PS C:\Windows\system32> $ADGroup = Read-Host "enter group name" $ADGroup = $ADGroup.ToString()
Get-ADGroup -Filter name -like '*$ADGroup*' -Properties * | select -Property Name
输入组名:GroupName以上是关于用 Get-ADGroup 中的变量替换字符串的主要内容,如果未能解决你的问题,请参考以下文章