Powershell基于多个条件提取属性

pftdvrlh  于 2023-03-18  发布在  Shell
关注(0)|答案(2)|浏览(157)

我正在尝试获取没有列出经理的AD用户列表,并在自定义字段usertype中获取Employee值。
当我运行此命令时,它不会进行筛选,但会为我提供所有帐户-用户、资源等。我可以将usertype或manager添加到选择字段中,然后查看它是否未正确提取(manager已填充或usertype不是Employee)。
我需要做哪些更改才能获得正确的数据?

Get-ADUser -Filter * -Properties * |  Select Name, SamAccountName, Department 
where-object userType -eq 'Employee' -and Manager -eq $null
ecbunoof

ecbunoof1#

如果自定义userType属性为indexed,则在这两种情况下都可以利用Active Directory Filter

Get-ADUser -LDAPFilter "(&(!manager=*)(userType=Employee))" -Properties Department |
    Select-Object Name, SamAccountName, Department

简要说明LDAP Filter的功能:

(&                       # AND, all conditions must be met
    (!manager=*)         # manager attribute is not populated
    (userType=Employee)  # usertype attribute is equal to "Employee"
)                        # close then AND clause

如果自定义属性未编制索引,则必须使用PowerShell完成筛选:

Get-ADUser -LDAPFilter "(!manager=*)" -Properties Department, userType |
    Where-Object userType -EQ 'Employee' |
    Select-Object Name, SamAccountName, Department

如果您还需要仅查找Enabled用户,则可以将以下内容包括在筛选器中:

Get-ADUser -LDAPFilter "(&(!manager=*)(!userAccountControl:1.2.840.113556.1.4.803:=2))" -Properties ...

至于代码失败的原因,在Select-Object语句后面缺少一个管道,当使用Where-Object过滤多个条件时,我们必须使用脚本块。总之,下面的代码可以工作(但比上面的例子慢得多)。

Get-ADUser -Filter * -Properties Department, userType, Manager |
    Where-Object { $_.userType -eq 'Employee' -and -not $_.Manager } |
    Select-Object Name, SamAccountName, Department
efzxgjgh

efzxgjgh2#

在可能的情况下,先过滤。一般来说,这样处理要快得多,也容易得多。

Get-AdUser -Filter 'userType -eq "Employee" -and Manager -notlike "*"' |
Select-Object Name, SamAccountName, Department

如果Manager不支持使用notlike进行过滤,则执行以下操作:

Get-AdUser -Filter 'userType -eq "Employee"' -Properties Manager |
Where-Object{-not [string]::IsNullOrEmpty($_.Manager)} |
Select-Object Name, SamAccountName, Department

相关问题