如何通过编程将AD用户的OrganizationalUnit名称复制到Location属性
提取AD用户OU路径并更新Location属性
核心思路
从用户的DistinguishedName字段中剥离OU部分,将其转换为父OU\子OU的层级格式,再批量写入用户的Location属性。
实现脚本
# 获取所有AD用户,仅加载必要属性提升效率 $users = Get-ADUser -Filter * -Properties DistinguishedName, Location foreach ($user in $users) { # 拆分DistinguishedName,过滤出所有OU开头的片段 $ouSegments = $user.DistinguishedName -split ',' | Where-Object { $_ -match '^OU=' } # 如果用户存在于OU中(而非根域) if ($ouSegments) { # 提取每个OU的名称(去掉OU=前缀),并反转顺序(从父OU到子OU) $ouNames = $ouSegments | ForEach-Object { $_ -replace '^OU=', '' } | Reverse # 拼接成OU\子OU的格式 $locationPath = $ouNames -join '\' # 仅当Location属性与目标路径不一致时更新,避免不必要的AD操作 if ($user.Location -ne $locationPath) { Set-ADUser -Identity $user -Location $locationPath Write-Host "已更新用户 $($user.Name) 的Location属性为: $locationPath" } else { Write-Host "用户 $($user.Name) 的Location属性已为目标值,无需更新" } } else { Write-Host "用户 $($user.Name) 位于根域,无OU信息,跳过更新" } }
关键步骤说明
- 高效获取用户属性:避免使用
Properties *,只指定DistinguishedName和Location,减少AD查询负载。 - OU片段提取与转换:通过拆分DN字符串筛选OU片段,反转顺序后拼接成层级路径,符合
父OU\子OU的展示需求。 - 增量更新:先判断当前Location属性是否与目标路径一致,仅在不同时执行更新,降低AD操作频次。
内容的提问来源于stack exchange,提问作者Sergio Baiao
相关产品推荐
相关产品推荐

