0

我正在尝试过滤 Active Directory 中属性的值。

我试过了:

 Get-ADUser -filter * -Properties physicalDeliveryOfficeName | Where-Object (($_.physicalDeliveryOfficeName -like "NICE")) | Select-Object physicalDeliveryOfficeName, name 

Get-ADUser -filter * -Properties physicalDeliveryOfficeName | Select-Object physicalDeliveryOfficeName, name | Where-Object (($_.physicalDeliveryOfficeName -like "NICE"))

我没有收到任何错误,但也没有结果。

我用physicaldeliverofficenameis (myvalue) 搜索了所有用户。我想显示姓名和办公室。

4

2 回答 2

1

您有语法问题

' Where-Objects(位置隐含)-FilterScript参数需要一个脚本块参数{ ... }——而不是带括号的表达式((...))。[1]

所以:

# Note the { ... } around the expression passed to Where-Object
Get-ADUser -Filter * -Properties physicalDeliveryOfficeName | 
  Where-Object { $_.physicalDeliveryOfficeName -eq "NICE" } # | ...

注意:由于"NICE"文字字符串而不是通配符模式,因此我使用了-eq而不是-like运算符。如果您确实需要将 find"NICE" 作为子字符串,请使用类似-like "*NICE*"or 的内容,以便区分大小写匹配-clike "*NICE*",正如Mathias R. Jessen所建议的那样。

请注意,您也可以使用简化的语法,这样就不需要脚本块并允许使用单个参数(还要注意没有$_.,这是隐含的):

Get-ADUser -Filter * -Properties physicalDeliveryOfficeName | 
  Where-Object physicalDeliveryOfficeName -eq "NICE" # | ...

退后一步

Santiago Squarzon建议在源头执行过滤,使用's或参数Get-ADUser-Filter-LDAPFilter,这样效率更高;例如:

Get-ADUser -Filter 'physicalDeliveryOfficeName -eq "NICE"'

顺便说一句:有许多示例使用带有-Filter( -Filter { ... }) 的脚本块语法,但-Filter参数接受一个字符串,并且该字符串,即使它支持类似 PowerShell语法,也由 AD 提供程序解释,所以最好传递一个字符串开头 - 有关更多信息,请参阅此答案


[1] 如果使用(...),则表达式的值将绑定到-Property参数,因此被解释为属性名称,其值(假设这样的属性甚至存在)被解释为布尔值,用于确定手头的输入对象是否应该是过滤或不过滤。如果表达式不计算为输入对象上存在的属性的名称,$false则为隐含的,并且输入对象被过滤。在您的情况下,这可以预见地导致没有对象被过滤,因此没有输出。

于 2022-01-10T17:06:25.980 回答
0

Select-Objectcmdlet 用于从较大的对象或列表中仅选择所需的列。

例如:

 C:\git\Core> gsv Spooler | fl

Name                : Spooler
DisplayName         : Print Spooler
Status              : Running
DependentServices   : {Fax}
ServicesDependedOn  : {RPCSS, http}
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : True
ServiceType         : Win32OwnProcess, InteractiveProcess

Get-Service 返回具有很多属性的服务对象。如果我只想要某些,我会这样使用它:

 C:\git\Core> gsv Spooler | Select Name,Status

Name                : Spooler
Status              : Running

您正在使用 cmdlet,并且可能会丢弃具有所需值的列。再次运行 one-liner 并删除Select-Objectcmdlet 以查看所有可用的列,直到找到与 Office 相关的列。

于 2022-01-10T16:11:12.727 回答