ForEach 问题,不匹配不会跳过相关步骤

ForEach issues, a non-match is not skipping the associated step

此代码块尝试验证字符串的最后一个 blip 到安全组中成员的 samaccountname 是否有相应的 'Report to $' 组,如果在安全组中找不到组名中的 $ 则移除 Report to AD 组...

这不是世界上最好的解释..代码可能更有意义:

import-module activedirectory
$ou = "ou=test1, ou=test, ou=company, dc=domain, dc=net"
$ErrorActionPreference = 'silentlycontinue'
$global:DebugPreference = "continue"

$managers = get-adGroupMember -identity "CN=All Managers,OU=Organizational,OU=Groups,OU=company,DC=domain,DC=net" | 
    select samaccountname
$ReportTogroup = Get-ADGroup -Searchbase $ou -filter "Name -like 'Report to *'" | select-object -expandproperty name


Foreach ($Report in $ReportToGroup ) {
    $report = $report -replace ("Report to ","")
    write-host $report "is the name"
     if ($Report -notin $managers) 
        {Remove-ADGroup -Identity $Report
         write-warning "$Report removed"  
        } else {
          write-host "$Report not removed"
}}

目前,如果我运行他的,我会得到以下信息:

paul.b is the report name
WARNING: paul.b removed
don.h is the report name
WARNING: don.h removed
dave.h is the report name
WARNING: dave.h removed
mike.s is the report name
WARNING: mike.s removed
masako.a is the report name
WARNING: masako.a removed
anna.s is the report name
WARNING: anna.s removed

我已经逐步使用 ISE 调试器和 $report 变量 returns a firstname.lastname 这是正确的.. 与我们的用户对象的 SamAccountName 格式相同。 $managers 执行 return SamAccountNames 的 getType() 数组...所以这应该是正确的。 if ($report -notin $managers) 对上面的每个名字都应该是 $false 。我预计 if/else 会在这些名称上跳到其他位置,但事实并非如此。

$managers returns 小写值..所以我认为这不是大小写问题。

任何帮助我回到正轨的人都将不胜感激..

因为您正在使用

检索字符串 数组
$ReportTogroup = Get-ADGroup -Searchbase $ou -filter "Name -like 'Report to *'" | select-object -expandproperty name

您不会对接收到 对象数组 的 $managers 执行相同的操作,每个对象都有一个名为 'SamAccountName' 的 属性使用 select samaccountname.

当遍历 $ReportTogroup 中的字符串并使用 if ($Report -notin $managers) 进行测试时,您正在测试是否在对象集合中找不到字符串,因此结果将始终是$true.

虽然很容易修复,只需使用

将经理 SamAccountNames 的数组作为 string 数组
$managers = Get-ADGroupMember -Identity "CN=All Managers,OU=Organizational,OU=Groups,OU=company,DC=domain,DC=net" | 
            Select-Object -ExpandProperty SamAccountName

更好的是,Get-ADGroupMember 还可以 return 类型为 computergroup 的对象,因此您应该过滤以仅获取用户:

$managers = Get-ADGroupMember -Identity "CN=All Managers,OU=Organizational,OU=Groups,OU=company,DC=domain,DC=net" | 
            Where-Object { $_.objectClass -eq 'user' } | Select-Object -ExpandProperty SamAccountName