【问题标题】:Replacing a string with a variable in Get-ADGroup用 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*'"

标签: powershell active-directory parameter-passing wildcard 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*)"

高效过滤的推荐文档:


注意:值得一提的是,在查询 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
    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 2011-09-29
    • 2020-02-04
    • 1970-01-01
    • 2017-06-21
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多