Active-Directory

Get-QADComputer -LdapFilter & NOT 運算符

  • April 16, 2010

我在從 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*)))"

我正在尋找所有未登錄 AD 超過 31 天且尚未在 OU“DisabledPCs”中的 Windows 作業系統系統,我將把它們移到那裡。

當我現在執行它時,我得到了我正在尋找的所有系統,包括那些在“DisabledPCs”OU 中的系統……我嘗試了幾種變體,包括:

(&(!(ou:dn:=DisabledPCs)))

以及將它放在過濾器中的不同位置(並不是我認為它會有所作為,但我顯然不知道……)

提前感謝您的幫助,

-dboftlp

就像來自 stackoverflow 上類似問題的僅供參考

“AD 不支持這種可擴展的匹配”

來源

我所做的基本上是在 powershellcommunity.org 海報cameronove的幫助下完全簡化了腳本,以提出以下內容:

$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?…

如果您有興趣查看整個腳本,請隨時

在 twitter 上聯繫我@dboftlp

或通過 gmail dot com 上的 dboftlp

我發現使用 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,然後將其括起來,應該這樣做。

讓我知道那是否更接近。

引用自:https://serverfault.com/questions/132100