2016-01-06 2 views
0

У меня есть необходимость обнаружения объектов компьютеров, которые не являются членами хотя бы одной группы. Я придумал этот скрипт, но вместо того, чтобы перечислять только те машины, которые не являются членами хотя бы одной группы, он возвращает все рабочие станции. Что я делаю не так?обнаруживает, что компьютер не является членом хотя бы одной группы

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

ответ

1

MemberOf Свойства содержит список выдающихся имен. Вы не можете проверить, не содержит ли он что-либо с оператором -notmatch. Вместо того, чтобы получить список отличительных имен ваших групп:

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

и проверить, если MemberOf свойство не содержит какой-либо из них:

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

Compare-Object требуется, потому что вам нужно проверить если один массив содержит любой из элементов другого массива. Что-то вроде $_.MemberOf | Where-Object {$groups -contains $_} также будет работать.

Отметьте, что MemberOf property не включает основную группу компьютеров. Если основная группа также не должна быть одна из групп из вашего списка требуется дополнительная проверка в Where-Object фильтра:

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

Должен сказать, это лучший ответ. Я бы использовал этот, ОП. – FoxDeploy

+0

Спасибо Ansgar, это прекрасно работает! – zimmerkm

0

Вы используете -NotMatch оператор, который будет оценивать истинное значение, если данные не совпадают. Вы бы лучше обслуживаться с помощью -NotContain, как и

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

'MemberOf' содержит список выдающихся имен. Проверка того, что список отличительных имен группы содержит имя группы, всегда будет возвращать '$ false'. –