对于每个问题,不匹配不会跳过相关步骤

问题描述

代码块尝试将字符串的最后一个 blip 验证到安全组中成员的 samaccountname 具有相应的“报告给 $”组,如果在安全组中找不到组名称中的 $,则删除向 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 变量返回一个 firstname.lastname,这是正确的..与我们的用户对象的 SamAccountName 格式相同。 $managers 确实返回了 SamAccountNames 的 getType() 数组...所以这应该是正确的。并且 if ($report -notin $managers) 对上面的每个名字都应该是 $false 。我预计 if/else 会在这名称跳转到 else,但事实并非如此。

$managers 返回小写值.. 所以我不认为这是一个大小写问题。

任何让我重回正轨的帮助将不胜感激..

解决方法

因为您正在使用

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

对于接收对象数组的 $managers,您不需要这样做,每个对象都有一个名为“SamAccountName”的属性,使用 select samaccountname

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

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

获取一个经理 SamAccountNames 数组作为 string 数组
$true

更好的是,$managers = Get-ADGroupMember -Identity "CN=All Managers,OU=Organizational,OU=Groups,OU=company,DC=domain,DC=net" | Select-Object -ExpandProperty SamAccountName 还可以返回 Get-ADGroupMembercomputer 类型的对象,因此您应该过滤以仅获取用户:

group