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 类型为 computer
或 group
的对象,因此您应该过滤以仅获取用户:
$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
此代码块尝试验证字符串的最后一个 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 类型为 computer
或 group
的对象,因此您应该过滤以仅获取用户:
$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