大家下午好。
我正在尝试对域控制器运行 LDAP 查询以包含具有以下要求的服务器:
OperatingSystem=*server*
(包括所有服务器)
或
OperatingSystem=*Enterprise*
(包括 Windows 10 计算机)
并且
userAccountControl:1.2.840.113556.1.4.803:=2
(机器未禁用)
如果我运行以下命令,我就会得到服务器所需的内容:
Get-ADObject -searchbase "DC=DOMAIN,DC=LOCAL" -ldapfilter "(&(objectclass=computer)(operatingSystem=*server*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" | Sort-Object Name
如果我运行以下命令,我将获得 Windows 10 Enterprise Box 所需的内容:
Get-ADObject -searchbase "DC=DOMAIN,DC=LOCAL" -ldapfilter "(&(objectclass=computer)(operatingSystem=*Enterprise*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" | Sort-Object Name
但是,如果我像这样组合,我什么也得不到:
Get-ADObject -searchbase "DC=DOMAIN,DC=LOCAL" -ldapfilter "(&(objectclass=computer)(operatingSystem=*server*)(|(operatingSystem=*Enterprise*))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" | Sort-Object Name
我也尝试过这个:
Get-ADObject -searchbase "DC=DOMAIN,DC=LOCAL" -ldapfilter "(&(objectclass=computer)(operatingSystem=*server*)(operatingSystem=*Enterprise*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" | Sort-Object Name
我可能错过了什么?
您的倒数第二个过滤器几乎是正确的,以使其更具可读性:
(&
(objectclass=computer)
(|
(operatingSystem=*server*)
)
(operatingSystem=*Enterprise*) # <- this one should be inside the OR clause
(!(userAccountControl:1.2.840.113556.1.4.803:=2))
)
所以,过滤器应该是:
(&(objectclass=computer)(|(operatingSystem=*server*)(operatingSystem=*Enterprise*))(!userAccountControl:1.2.840.113556.1.4.803:=2))
您可以注意到,
(!(userAccountControl:1.2.840.113556.1.4.803:=2))
也可以简化为(!userAccountControl:1.2.840.113556.1.4.803:=2)
。而且,如果您使用 Get-ADComputer
而不是 Get-ADObject
,则可以去掉 (objectclass=computer)
子句。