You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PowerShell实现AD多层OU选择的循环逻辑?

逐层选择AD组织单元(OU)的PowerShell实现方案

需求描述

  • 最终目标:将新建AD用户放入指定OU,通过可分辨名称定位
  • 已实现:单次OU选择功能
  • 待解决:多层OU场景下,避免重复编写固定层级的脚本,希望能逐层引导选择OU,直至选中目标OU(比如示例中的Users或自定义目标)
  • 示例OU结构:US→IL→Chicago→Safety→Users,每层有多个选项,已掌握用Out-GridView排序选择,但循环逻辑实现困难
  • 补充:对PowerShell的While/Do Until语句不熟悉,会自行研究,方案不局限于循环,只要无需固定参数即可

测试代码

if ($Location -eq $null )
{
[System.Windows.MessageBox]::Show("'You didn't enter the required parameter, script ending'","System Notification","Ok")
 exit
}
if ($Location -ne $null )               
{
while ($Location -ne $null) {
  $DomainOU1=Get-ADOrganizationalUnit -Filter "Name -like '$Location'" -SearchBase $DistinguishedGroupName -SearchScope OneLevel | select Name -ExpandProperty Name
  }
do {
  $Location1=@($DomainOU1) | sort
  $Location1=$Location1 | Out-GridView -Title "Choose Employee Location of Deployment"
  $Location1=$Location
}
Until ($Location -eq "Users")
}
Write-output "You chose $Location"

实现方案

下面是一个无需固定层级参数的循环实现,核心逻辑是从根OU(或指定起始OU)开始,逐层列出子OU供选择,直到选中目标OU或手动确认停止:

# 初始化起始OU,可替换为你的根OU或特定起始点的可分辨名称
$currentOU = Get-ADOrganizationalUnit -Filter * -SearchBase (Get-ADDomain).DistinguishedName -SearchScope Base

while ($true) {
    # 获取当前OU下的所有直接子OU
    $childOUs = Get-ADOrganizationalUnit -Filter * -SearchBase $currentOU.DistinguishedName -SearchScope OneLevel | Sort-Object Name

    # 如果没有子OU,直接结束循环
    if (-not $childOUs) {
        Write-Host "当前OU下无更多子OU,已选定目标OU:$($currentOU.Name)"
        break
    }

    # 添加上"确认选择当前OU"的选项
    $selectionOptions = @(
        [PSCustomObject]@{Name = "✅ 确认选择当前OU: $($currentOU.Name)"; OU = $currentOU}
        $childOUs | ForEach-Object { [PSCustomObject]@{Name = $_.Name; OU = $_} }
    )

    # 弹出网格选择框
    $selected = $selectionOptions | Out-GridView -Title "选择子OU或确认当前OU(当前路径:$($currentOU.DistinguishedName))" -OutputMode Single

    # 如果用户取消选择,退出脚本
    if (-not $selected) {
        Write-Host "已取消选择,脚本结束"
        exit
    }

    # 如果选中的是确认选项,结束循环
    if ($selected.Name -match "✅ 确认选择当前OU") {
        Write-Host "已选定目标OU:$($currentOU.DistinguishedName)"
        break
    }

    # 否则更新当前OU为选中的子OU,进入下一轮循环
    $currentOU = $selected.OU

    # 可选:如果选中名称为"Users"的OU,直接结束(符合你的示例需求)
    if ($currentOU.Name -eq "Users") {
        Write-Host "已自动选中目标OU:$($currentOU.DistinguishedName)"
        break
    }
}

# 最终得到的目标OU可分辨名称,后续可用于创建用户
$targetOU = $currentOU.DistinguishedName
Write-Output "最终目标OU路径:$targetOU"

方案说明

  • 灵活性:无需预先定义OU层级数量,自动适配任意深度的OU结构
  • 交互友好:每一步显示当前OU的完整路径,支持随时确认当前OU为目标
  • 容错处理:处理无子女OU、用户取消选择等场景
  • 自定义触发:可通过修改if ($currentOU.Name -eq "Users")的条件,实现选中特定名称OU时自动结束循环

内容的提问来源于stack exchange,提问作者Nikola Radisavljevic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:15:30