PowerShell:如何用foreach循环生成API所需JSON并存储到变量
解决AD跨域用户homeDirectory属性批量修改的API JSON生成问题
问题背景
需要编写脚本通过Rest API修改Active Directory(AD)中特定安全组用户的homeDirectory属性,这些用户跨域但属于同一林且已注册到全局目录。
当前获取用户的代码可正常运行:
function get-groupusers{ $memberlist = get-adgroup -filter "name -eq 'group.users'" -server "server.domain.com" -property member |select -expandproperty member $GlobalCatalog = Get-ADDomainController -Discover -Service GlobalCatalog foreach ($member in $memberlist){ get-aduser -identity $member -server "$($GlobalCatalog.name):3268" } } $sAMAccountName = (get-groupusers).samaccountname
但生成API所需JSON时遇到两个问题:
- foreach循环会覆盖
$json变量,最终仅保留最后一个用户的配置 $an变量解析异常,显示为@(samaccountname="$an")而非实际用户名
目标JSON格式(input、key、value为API固定键):
{ "input":[{ "key":"homeDirectory", "value":"\\\\filepath\\username1" }, { "key":"homeDirectory", "value":"\\\\filepath\\username2" }] }
解决方案
1. 修复变量覆盖问题
当前代码每次循环都重新赋值$json,导致之前的内容被覆盖。需先初始化一个数组存储每个用户的配置对象,最后再组装成完整结构。
2. 修复变量解析异常
优化用户获取逻辑,直接返回纯字符串数组的用户名,避免后续处理对象时出现解析问题。
修正后的完整代码
# 获取跨域组用户的samaccountname纯字符串数组 function get-groupusers{ $memberlist = Get-ADGroup -Filter "name -eq 'group.users'" -Server "server.domain.com" -Properties member | Select-Object -ExpandProperty member $GlobalCatalog = Get-ADDomainController -Discover -Service GlobalCatalog # 直接返回每个用户的samaccountname,减少后续处理 foreach ($member in $memberlist){ (Get-ADUser -Identity $member -Server "$($GlobalCatalog.name):3268").samaccountname } } $sAMAccountName = get-groupusers # 初始化数组存储每个用户的配置项 $inputItems = @() # 循环构建每个用户的homeDirectory配置 foreach($an in $sAMAccountName){ # 构建路径,双引号下\会自动转义,最终JSON会生成\\\\格式 $homePath = "\\filepath\$an" $inputItems += @{ key = "homeDirectory" value = $homePath } } # 组装API要求的结构并转换为JSON $jsonPayload = @{ input = $inputItems } | ConvertTo-Json -Depth 3 # 输出验证结果 $jsonPayload
关键说明
- 优化
get-groupusers函数:直接返回samaccountname字符串数组,避免后续处理用户对象时的属性解析问题 - 使用数组累积配置:
$inputItems数组存储每个用户的配置对象,彻底解决循环覆盖问题 - 路径转义处理:双引号字符串中的
\会被PowerShell自动转义,转换为JSON时生成API要求的\\\\filepath\\username格式 - JSON深度设置:添加
-Depth 3参数确保ConvertTo-Json正确解析嵌套结构(默认深度为2,无法处理多层嵌套)
内容的提问来源于stack exchange,提问作者jarusp
相关产品推荐
相关产品推荐

