Get-QADComputer -LdapFilter & NOT 运算符

Get-QADComputer -LdapFilter & NOT 运算符

我在从 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 联系我

相关内容