如何从Get-ADUser捕获并保持数据格式不变,但具有属性子集?

时间:2019-06-28 22:37:09

标签: powershell

我一直在使用Get-ADUser将数据捕获到对象$users中。这对于随后使用Foreach-Object并将变量$user推送到Get-ADPrincipalGroupMembership $user很有用。该cmdlet接受$user,然后我得到数据。

当我与大量用户一起工作-进入100,000时-我希望通过Get-ADUser(包括Select-Object)将Samaccountname的结果通过管道传送,但很快当我这样做时,Get-ADPrincipalGroupMembership $user不再起作用。现在,如果我使用-ExpandPropertySamaccountname,则该cmdlet可以再次使用,但我只能使用1个属性。

所以我的问题是,有没有办法仅从Get-ADUser中获取我需要的属性,同时保持格式,以便数据可以被Get-ADPrincipalGroupMembership等其他cmdlet使用? >

最后,我知道我可以使用$user.Samaccountname,但是我试图查看我是否可以直接从某个对象完成相同的工作。

编辑:详细地说,从$ users内捕获的数据将在许多其他命令中使用。我以Get-ADPrincipalGroupMembership为例。需要注意的另一件事是,当我开始使用select选项时,函数运行的时间减少了几倍。包含我的函数的脚本从几小时到不到30分钟。我想象多次运行Get-ADUser会再次增加我的脚本花费的时间。

1 个答案:

答案 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对象并直接使用参数指定用户。