PowerShell不是组成员

时间:2018-07-09 18:59:23

标签: regex powershell filter

我正在查看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

1 个答案:

答案 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
}