用 Get-ADGroup 中的变量替换字符串

Posted

技术标签:

【中文标题】用 Get-ADGroup 中的变量替换字符串【英文标题】:Replacing a string with a variable in Get-ADGroup 【发布时间】:2022-01-04 14:53:22 【问题描述】:

我正在尝试使用 PowerShell 在 AD 中搜索组名称。

为什么这些paramRead-Host 都不起作用?两者都在传递字符串,但结果为空。但是,如果我将命令中的变量$ADGroup 替换为实际的组名(字符串)并运行命令Get-ADGroup...,结果将按预期提供。我尝试用单引号替换双引号,得到了相同的结果,该命令单独工作,但Read-Hostparam 均未提供信息。我无法弄清楚为什么当它是一个变量时字符串没有被传递($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 中的变量替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

根据匹配用替换字符串替换字符串中的正则表达式模式

bat SET中替换字符串(用变量代表需替换的字符串)

用 cURL 命令中的变量替换字符串 [重复]

用 Bash 变量替换 sed

sed 用 Bash 变量替换

js变量名中的数字用另一个变量替换怎么实现