Get-QADComputer -LdapFilter & NOT operator

1

Estou com problemas excluindo uma OU do meu filtro LDAP

$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*)))"

Estou procurando por todos os sistemas operacionais Windows que não estejam conectados ao AD há mais de 31 dias & que ainda não estão na OU "DisabledPCs", que é para onde vou movê-los.

Quando eu o executo agora, estou recebendo todos os sistemas que estou procurando, incluindo aqueles na UO "DisabledPCs" ... Eu tentei várias variações, incluindo:

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

Além de colocá-lo em locais diferentes no filtro (não que eu achasse que faria diferença, mas obviamente não sei ...)

Agradecemos antecipadamente por qualquer ajuda,

-dboftlp

    
por dboftlp 13.04.2010 / 22:11

2 respostas

1

Assim como um FYI de uma pergunta semelhante no stackoverflow

"O AD não suporta este tipo de correspondência extensível"
Origem

O que eu basicamente fiz foi simplificar totalmente o roteiro com alguma ajuda do cartaz do powershellcommunity.org cameronove para apresentar o seguinte:

$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"}

Eu simplifiquei o filtro do sistema operacional que me ajuda a evitar outros sistemas operacionais que não são do Windows e canalizo a exclusão da unidade organizacional para não incluir a unidade organizacional na qual desejo mover os sistemas posteriormente em meu script. Eu não estou incluindo essa parte aqui, porque eu logar para uma pasta de trabalho do Excel com um loop foreach e é muito mais envolvido do que o meu original Q? ...

Se você estiver interessado em ver todo o roteiro, sinta-se à vontade para me dar uma @dboftlp no twitter
ou via dboftlp no gmail dot com

    
por 16.04.2010 / 17:01
1

O que eu acho mais fácil com filtros LDAP é separá-los no formato abaixo: (O Apache DS parece fazer isso automaticamente, o que é realmente útil).

(&
  (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*)
  )
)

Então, eu acho que talvez, se você reordenou o filtro mais como:

(&
  (!
    (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*)
    )
  )
)

Eu não testei isso, mas acho que fazer o & duas partes, o NÃO, e depois todo o resto, colocando-o fora, deveria fazê-lo.

Deixe-me saber se isso está mais perto.

    
por 14.04.2010 / 04:25