2016-01-06 1 views
0

J'ai besoin de détecter les objets d'ordinateur qui ne sont pas membres d'au moins un groupe. Je suis venu avec ce script, mais au lieu d'énumérer seulement les machines qui ne sont pas membres d'au moins un groupe, il retourne toutes les stations de travail. Qu'est-ce que je fais mal?détecter si l'ordinateur n'est pas membre d'au moins un groupe

Get-ADComputer -Filter * -Property * | where { 
    $_.memberof -notmatch 'Group1' -and 
    $_.memberof -notmatch 'Group2' -and 
    $_.memberof -notmatch 'Group3' 
} | Format-Table Name 

Répondre

1

La propriété MemberOf contient une liste de noms distinctifs. Vous ne pouvez pas vérifier s'il ne contient pas quelque chose avec l'opérateur -notmatch. Au lieu d'obtenir une liste des noms distinctifs de vos groupes:

$groups = 'Group1', 'Group2', 'Group3' | 
      ForEach-Object { Get-ADGroup -Filter "Name -eq '$_'" } | 
      Select-Object -Expand DistinguishedName 

et vérifier si la propriété MemberOf ne contient aucun d'entre eux:

Get-ADComputer -Filter * -Property * | Where-Object { 
    -not (Compare-Object $groups $_.MemberOf -IncludeEqual -ExcludeDifferent) 
} | Format-Table Name 

Le Compare-Object est nécessaire, parce que vous devez vérifier si un tableau contient l'un des éléments d'un autre tableau. Quelque chose comme $_.MemberOf | Where-Object {$groups -contains $_} fonctionnerait également.

Notez que la propriété MemberOf ne pas inclure le groupe principal d'un ordinateur. Si le groupe primaire doit aussi ne pas être l'un des groupes de votre liste, vous avez besoin d'un contrôle supplémentaire dans le filtre Where-Object:

Get-ADComputer -Filter * -Property * | Where-Object { 
    -not (Compare-Object $groups $_.MemberOf -IncludeEqual -ExcludeDifferent) -and 
    $groups -notcontains $_.PrimaryGroup 
} | Format-Table Name 
+0

Je dois dire que c'est une meilleure réponse. J'utiliserais celui-ci, OP. – FoxDeploy

+0

Merci Ansgar, cela fonctionne parfaitement! – zimmerkm

0

Vous utilisez l'opérateur -NotMatch, qui évaluera true si les entrées ne correspondent pas exactement. Vous seriez mieux servis en utilisant -NotContain, comme si

Get-ADComputer -Filter * -Property * | where {$.memberof -notContains 'Group1' -and $.memberof -notContains 'Group2' -and $_.memberof -notContains 'Group3'} | Format-Table Name 
+0

'MemberOf' contient une liste de noms distinctifs. Vérifier si une liste de noms distinctifs de groupes contient un nom de groupe retournera toujours '$ false'. –