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

问题描述:

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

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

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 
+0

我必须说,这是一个更好的答案。我会用这个,OP。 – FoxDeploy

+0

谢谢Ansgar,这个作品完美! – zimmerkm

您使用的是-NotMatch运算符,它的值为true,如果该项目不完全匹配。你会使用-NotContain得到更好的服务,像这样

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

'MemberOf'包含可分辨名称的列表。检查组别名称列表是否包含组名称将始终返回'$ false'。 –