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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:25:26