检测计算机是否不是至少一个组的成员
问题描述:
我需要检测不是至少一个组的成员的计算机对象。我已经提出了这个脚本,但不是只列出至少一个组的成员的机器,而是返回所有工作站。我究竟做错了什么?检测计算机是否不是至少一个组的成员
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
答
您使用的是-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'。 –
我必须说,这是一个更好的答案。我会用这个,OP。 – FoxDeploy
谢谢Ansgar,这个作品完美! – zimmerkm