我正在查看Powershell - Get-ADComputer -properties memberof,但对我来说不起作用。匹配始终返回true。因此,我将在组列表中使用诸如“域计算机”之类的简单名称,-notmatch
应该过滤掉属于“域计算机”组的任何内容,并且它仍然会返回属于“域计算机”的计算机。我所需要的是一个脚本,该脚本可以接收计算机并根据组列表检查其成员资格,如果它们不是属于该组列表,则将其返回。
$groups = @("Terminal Server License Servers","Exchange Trusted Subsystem","Cert Publishers","Domain Computers")
$regex = '^({0})' -f ($groups -join '|')
get-adcomputer -Filter {OperatingSystem -like "Windows Server 200*"} -properties * | Where-Object{($_.MemberOf | Get-ADGroup).Name -notmatch $regex} | Select-Object Name | fl
答案 0 :(得分:2)
你想要
Where-Object {-not (($_.MemberOf | Get-ADGroup).Name -match $regex) }
因为Y -notmatch X
的意思不是“没有与X匹配的Y”,而是“至少有一个Y与X不匹配”(就像Y -match X
的意思不是“全部Y匹配X”,但“至少有一个Y匹配X”)
您想要Y -match X
的对立面,即-not (Y -match X)
。
尝试
"a","3","#" -match "[a-z]"
"a","3","#" -notmatch "[a-z]"
查看-match
和-notmatch
的实际作用。
通过聊天,OP和我找到了解决该问题的更好方法,为方便起见,在此重复:
我们在这里比较两个列表- ADComputer和您的参考列表,并且您想消除所有 至少有一场比赛,然后显示其余比赛。
因此,对于每个计算机对象,对于它所属的每个组, 如果该组出现在您的参考列表中,请过滤掉计算机。
PowerShell代码:
$referenceListOfGroups = "CN=group_1....", "CN=group_2....", "CN=group_N...." Get-ADComputer -LDAPFilter "OperatingSystem=Windows Server 200*" -Properties MemberOf | Where-Object { ($_.MemberOf | Where-Object { $_ -in $referenceListOfGroups }).Count -eq 0 }