检测计算机是否不是至少一个组的成员

时间:2016-01-06 17:39:54

标签: powershell active-directory-group

我需要检测不属于至少一个组的计算机对象。我已经提出了这个脚本,但它不是仅列出不是至少一个组成员的机器,而是返回所有工作站。我做错了什么?

2016-01-06 16:06:52,778 [1]DEBUG ...blah blah blah

2 个答案:

答案 0 :(得分: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属性包含计算机的主要组。如果主要群组也不是您列表中的某个群组,则需要在Where-Object过滤器中进行额外检查:

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

答案 1 :(得分:0)

您正在使用Should().Equal()运算符,如果条目不完全匹配,则运算符将评估为true。使用-NotMatch可以更好地为您提供服务,就像这样

-NotContain