我在从 LDAP 过滤器中排除 OU 时遇到问题
$DaysAgo = (Get-Date).AddDays(-31)
$ft = $DaysAgo.ToFileTime()
Get-QADComputer -SizeLimit 0 -IncludeAllProperties
-SearchRoot 'DC=My,DC=Domain,DC=Local'
-LdapFilter "(&(objectcategory=computer)(lastLogonTimeStamp<=$ft)
(!(ou:dn:=DisabledPCs))(|(operatingsystem=Windows 2000 Professional)
(operatingSystem=Windows XP*)(operatingSystem=Windows 7*)
(operatingSystem=Windows Vista*)(operatingsystem=Windows 2000 Server)
(operatingsystem=Windows Server*)))"
我正在查询所有超过 31 天未登录 AD 且尚未位于 OU“DisabledPCs”中的 Windows 操作系统,我将把它们移动到该 OU 中。
当我现在运行它时,我得到了我正在寻找的所有系统,包括“DisabledPCs”OU 中的系统...我尝试了几种变化,包括:
(&(!(ou:dn:=DisabledPCs)))
以及将其放在过滤器中的不同位置(并不是我认为它会有所不同,但我显然不知道......)
在此先感谢您的帮助,
-dboftlp
答案1
我发现使用 LDAP 过滤器最简单的方法是将它们分解成下面的格式:(Apache DS 似乎会自动执行此操作,这非常有帮助)。
(&
(objectcategory=computer)
(lastLogonTimeStamp<=$ft)
(!
(ou:dn:=DisabledPCs)
)
(|
(operatingsystem=Windows 2000 Professional)
(operatingSystem=Windows XP*)(operatingSystem=Windows 7*)
(operatingSystem=Windows Vista*)
(operatingsystem=Windows 2000 Server)
(operatingsystem=Windows Server*)
)
)
因此,我认为也许,如果您将过滤器重新排序为:
(&
(!
(ou:dn:=DisabledPCs)
)
(
(objectcategory=computer)
(lastLogonTimeStamp<=$ft)
(|
(operatingsystem=Windows 2000 Professional)
(operatingSystem=Windows XP*)(operatingSystem=Windows 7*)
(operatingSystem=Windows Vista*)
(operatingsystem=Windows 2000 Server)
(operatingsystem=Windows Server*)
)
)
)
我没有测试过,但我认为将 & 分成两部分,将 NOT 分成两部分,然后将其他所有内容括起来,这样就可以了。
如果距离更近的话请告诉我。
答案2
就像 stackoverflow 上的一个类似问题一样
“AD 不支持此类可扩展匹配”
来源
我所做的基本上是在 powershellcommunity.org 海报的帮助下完全简化了脚本卡梅罗诺夫得出以下结论:
$DaysAgo = (Get-Date).AddDays(-31)
$ft = $DaysAgo.ToFileTime()
$StComps = Get-QADComputer -SizeLimit 0 -IncludeAllProperties `
-SearchRoot 'DC=MY,DC=DOMAIN,DC=LOCAL' `
-LdapFilter "(&(&(lastLogonTimeStamp<=$ft)(operatingsystem=*Windows*)))" `
| Where { $_.dn -notmatch "DisabledPCs"}
我简化了操作系统过滤器,它可以帮助我避开其他非 Win 操作系统,并通过管道传输 OU 排除,以不包含我想在脚本中稍后移动系统的 OU。我没有在这里包括那部分,因为我用 foreach 循环将其记录到 Excel 工作簿中,而且它比我原来的 Q? 复杂得多...
如果你有兴趣看完整剧本,欢迎
在推特上联系我@dboftlp
,或者通过 dboftlp@gmail dot com 联系我