在本例中,一些记录的帐户类型为N,而其他记录的帐户类型为G。
为什么筛选器在此脚本中起作用:
Get-Content "MembersMS.txt" | ForEach-Object {Get-ADUser -Identity $_ -Properties name, uht-IdentityManagement-AccountType} | Where-Object {($_['uht-IdentityManagement-AccountType'] -ne "N")}
也就是说,你只得到G条记录,而不是这条:
Get-Content "MembersMS.txt" | ForEach-Object {Get-ADUser -Identity $_ -Properties * | select name, uht-IdentityManagement-AccountType} | Where-Object {($_['uht-IdentityManagement-AccountType'] -ne "N")}
也就是说,你得到了N和G记录。
第二个脚本中额外的“管道”允许更好的格式,因为每条记录获得的数据要少得多;你会得到列式输出,每条记录一行。
我试过了--不像“N*”那样无济于事。
2条答案
按热度按时间bvjveswy1#
问题不在于属性或过滤,而在于
Select
语句的位置,以及它如何更改管道中的后续语句。第一句话:
可分为2个语句:
同样,第二个语句:
可分为2个语句:
这两个语句都生成数组:
但是数组 * 内部 * 的对象是不同的。
第一个是
ADAccount
类型的数组,第二个是Sytem.Object
帐户的数组。如果你迭代(和过滤)array 中的项目,这是可以的。但是当你迭代/过滤 * array * 中的属性时,这是不同的。您使用
Where-Object
的方式试图调用GetEnumerator()
方法,类型ADAccount
通常具有该方法,但System.Object
没有。因此,它无法枚举属性并正确执行
Where-Object
过滤。更好的方法是在管道末端对
Select
进行“格式化”:4szc88ey2#
为了解释为什么会发生这种情况,我们需要看一下
ADPropertyCollection
Class,这个类类似于PropertyValueCollection
类,有一个Item[String]
属性,基本上允许通过索引获取属性值,即:可以很好地获得
krbtgt
的samAccountName
。然而,如果我们尝试使用
Select-Object
来过滤对象的一些属性,对象将不再是相同的类型(在本例中为ADUser
),它将是PSObject
,并且PSObject
没有Item[String]
参数化属性:因此理想情况下,您应该使用
Select-Object
作为管道的最后一条语句。请注意,Get-ADUser
已经支持管道标识,因此不需要ForEach-Object
:同样值得注意的是,如果你使用点符号而不是索引,两个代码片段都可以工作: