我一直在使用Get-ADUser
将数据捕获到对象$users
中。这对于随后使用Foreach-Object
并将变量$user
推送到Get-ADPrincipalGroupMembership $user
很有用。该cmdlet接受$user
,然后我得到数据。
当我与大量用户一起工作-进入100,000时-我希望通过Get-ADUser
(包括Select-Object
)将Samaccountname
的结果通过管道传送,但很快当我这样做时,Get-ADPrincipalGroupMembership $user
不再起作用。现在,如果我使用-ExpandProperty
和Samaccountname
,则该cmdlet可以再次使用,但我只能使用1个属性。
所以我的问题是,有没有办法仅从Get-ADUser
中获取我需要的属性,同时保持格式,以便数据可以被Get-ADPrincipalGroupMembership
等其他cmdlet使用?
最后,我知道我可以使用$user.Samaccountname
,但是我试图查看我是否可以直接从某个对象完成相同的工作。
编辑:详细地说,从$ users内捕获的数据将在许多其他命令中使用。我以Get-ADPrincipalGroupMembership为例。需要注意的另一件事是,当我开始使用select选项时,函数运行的时间减少了几倍。包含我的函数的脚本从几小时到不到30分钟。我想象多次运行Get-ADUser会再次增加我的脚本花费的时间。
答案 0 :(得分:1)
无需使用foreach
。您可以直接将Get-ADUser
插入Get-ADPrincipalGroupMembership
,它将通过AD Principal进行迭代,例如:
Get-ADUser -SearchBase 'OU=Staff,DC=contoso,DC=com' -Filter * | Get-ADPrincipalGroupMembership
甚至:
$users = Get-ADUser -SearchBase 'OU=Staff,DC=contoso,DC=com' -Filter *
$users | Get-ADPrincipalGroupMembership
不能使用Select-Object
之类的原因:
$users = Get-ADUser -SearchBase 'OU=Staff,DC=contoso,DC=com' -Filter *
$users | Select-Object SamAccountName | Get-ADPrincipalGroupMembership
是因为Select-Object
给您:
PS> $users | Select-Object SamAccountName
SamAccountName
--------------
jsmith
bross
只有一个字符串属性SamAccountName的对象数组。不幸的是,Get-ADPrincipalGroupMembership
仅接受Microsoft.ActiveDirectory.Management.ADPrincipal
作为管道中的Input。因此,为什么不能将其传递给字符串数组。这意味着使它起作用的唯一方法是直接传递AD Principal对象,或者实际上是使用foreach
遍历AD Principal对象并直接使用参数指定用户。