使用LDAP过滤器将get-ADUser的输出管道输出到Get-ADGroup

时间:2017-12-13 10:19:57

标签: powershell active-directory pipeline

我正在尝试将两行PowerShell拼接在一起,但我无法弄清楚语法。有a post听起来可能是我需要的,但它没有使用-LDAPFilter

要生成过去100天内创建的AD用户列表,请使用

$now = ((Get-Date).AddDays(-100)).Date
$users = Get-ADUser -Filter {whenCreated -ge $now} -Searchbase "OU=staff,OU=SMUC_Users,DC=stmarys,DC=ac,DC=ie" |
         Where-Object { $_.Enabled -eq 'True' }

来自"How to get ALL AD user groups (recursively) with Powershell or other tools?"的代码执行下一步,即查找用户所属的所有组:

$username = 'd.trump'
$dn = (Get-ADUser $username).DistinguishedName
Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $dn) |
    select -Expand Name 

但是我无法将第一个的输出传输到第二个以获得整体列表。

Get-ADUser -Filter {whenCreated -ge $now} -Searchbase "OU=staff,OU=SMUC_Users,DC=stmarys,DC=ac,DC=ie" |
    Where-Object { $_.Enabled -eq 'True' } |
    Select-Object DistinguishedName |
    Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $_) |
    select -expand Name

错误消息是:

  

Get-ADGroup:无法识别搜索过滤器

我认为第二个代码片段提取了distingushed的名称并将其提供给过滤器,这就是我在管道中尝试做的事情。

1 个答案:

答案 0 :(得分:1)

您遗失ForEach-Object(别名%)。

以下代码应该有效:

Get-ADUser -Filter {whenCreated -ge $now} -SearchBase "OU=staff,OU=SMUC_Users,DC=stmarys,DC=ac,DC=ie" `
| Where-Object { $_.Enabled -eq 'True' } `
| %{Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $_.DistinguishedName)} `
| Select-Object -ExpandProperty Name

如果要输出用户和组信息,可以像这样扩展代码:

Get-ADUser -Filter {whenCreated -ge $now} -SearchBase "OU=staff,OU=SMUC_Users,DC=stmarys,DC=ac,DC=ie" `
| Where-Object { $_.Enabled -eq 'True' } `
| %{$group = Get-ADGroup -LDAPFilter ("(member:1.2.840.113556.1.4.1941:={0})" -f $_.DistinguishedName);Write-Output $_.UserPrincipalName $group.Name}