Regex PowerShell不是组的成员
我在看,它对我不起作用。比赛结果总是正确的。因此,我将在组列表中使用一些简单的东西,比如域计算机,Regex PowerShell不是组的成员,regex,powershell,filter,Regex,Powershell,Filter,我在看,它对我不起作用。比赛结果总是正确的。因此,我将在组列表中使用一些简单的东西,比如域计算机,-notmatch应该过滤掉属于域计算机组的任何内容,它仍然返回属于域计算机的计算机。我所需要的只是一个脚本,它可以获取计算机并对照组列表检查它们的成员资格,如果它们不是组列表的一部分,则返回它们 $groups = @("Terminal Server License Servers","Exchange Trusted Subsystem","Cert Publishers","Domain C
-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
你想要
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
,它是-而不是(Y-match X)
试一试
查看-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
}
你想要
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
,它是-而不是(Y-match X)
试一试
查看-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
}
您能否向我们展示您所附代码的实现,以便我们更好地了解您正试图做什么?请发布您实际运行的代码,而不是指向其他问题的链接。请编辑您的问题以提供此代码。不要将其作为注释发布。这与链接问题中的答案完全相同(除非您删除了一些属性)。您没有更改任何内容以使其适用于您?您能否向我们展示所附代码的实现,以便我们更好地了解您正试图执行的操作?请发布您实际运行的代码,而不是指向其他问题的链接。请编辑您的问题以提供此代码。不要将其作为注释发布。这与链接问题中的答案完全相同(除非您删除了一些属性)。你没有做任何改变来让它为你工作?谢谢。即使有了这些变化,它仍然不起作用。我认为这是因为在组名中有parenths,这是在摆脱匹配。有没有办法让它忽略字符串中的那个
$groups=@(“server-(number)Extra text”)
新版本-我让它忽略字符串中的正则表达式字符,但现在当我引入多个要检查的组时,它不起作用$groups=[regex]::escape(@(“server-(1)Extra text”,“server-(2)Extra text”))
我建议您使用实际组名数组和-in
运算符:-not(($.MemberOf | Get ADGroup).Name-in$groups)代替regex
谢谢。我试过了。还是不行。当你说实际的群组名称时,我假设你指的是群组名称,而不是完整的CN名称,对吗?让我们来看看。谢谢。即使有了这些变化,它仍然不起作用。我认为这是因为在组名中有parenths,这是在摆脱匹配。有没有办法让它忽略字符串中的那个$groups=@(“server-(number)Extra text”)
新版本-我让它忽略字符串中的正则表达式字符,但现在当我引入多个要检查的组时,它不起作用$groups=[regex]::escape(@(“server-(1)Extra text”,“server-(2)Extra text”))
我建议您使用实际组名数组和-in
运算符:-not(($.MemberOf | Get ADGroup).Name-in$groups)代替regex
谢谢。我试过了。还是不行。当你说实际的群组名称时,我假设你指的是群组名称,而不是完整的CN名称,对吗?让我们来看看。