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

Azure DevOps管道运行PS脚本时az ad app命令--id传参报错排查

问题根因

这个报错和ConvertFrom-Json是否生效没有直接关系,核心原因是Azure CLI版本差异导致返回对象的属性名变更:

  • 本地VS Code环境安装的是2.37.0之前的旧版Azure CLI,执行az ad app list返回的应用实体,唯一标识字段名为objectId,所以$_.objectId能正常取到值传给后续命令。
  • Azure DevOps的微软托管代理默认预装最新版Azure CLI,从2.37.0版本开始,微软统一调整了AD相关命令的返回结构,把应用对象的标识字段从objectId重命名为id,此时读取$_.objectId拿到的是空值$null,传给az ad app credential list --id时自然会报"expected one argument"的参数缺失错误。
  • 本地移除ConvertFrom-Json后复现相同报错,是因为未做JSON反序列化时,管道里的对象是原始字符串,不存在objectId属性,取值为空,和管道里的报错触发逻辑一致,但故障点不是JSON转换失效。
  • 原脚本还存在隐性问题:如果某个应用注册没有配置任何密码/证书凭据,az ad app credential list会返回空结果,直接读取endDate属性会触发空引用错误,导致管道执行中断。
修复方案

修正后可直接在Azure DevOps管道运行的脚本

脚本做了版本兼容、空值判断、显式输出格式指定,避免不同环境差异导致的异常:

# 显式指定输出格式为json,规避不同环境CLI默认输出配置差异
$allApps = az ad app list --all --output json | ConvertFrom-Json
$allApps | ForEach-Object {
    $currentApp = $_
    # 兼容新旧版CLI的标识字段名差异
    $appObjectId = if ($currentApp.id) { $currentApp.id } else { $currentApp.objectId }
    if (-not $appObjectId) { return }

    # 查询当前应用的所有凭据,空结果直接跳过
    $credentials = az ad app credential list --id $appObjectId --output json | ConvertFrom-Json -ErrorAction SilentlyContinue
    if (-not $credentials) { return }

    # 输出凭据详情,可按需过滤已过期项
    $credentials | ForEach-Object {
        [PSCustomObject]@{
            AppDisplayName = $currentApp.displayName
            AppObjectId = $appObjectId
            CredentialType = $_.type
            EndDateTime = [datetime]$_.endDate
            IsExpired = ([datetime]$_.endDate).ToUniversalTime() -lt (Get-Date).ToUniversalTime()
        }
    }
}
# 如需仅输出已过期应用,取消下面这行注释即可
# | Where-Object { $_.IsExpired }

管道配置注意事项

  • 使用AzureCLI@2任务时,建议将pwsh参数设置为true,使用PowerShell 7+执行脚本,相比Windows PowerShell 5.1对大JSON对象的解析兼容性更好,避免转换异常。
  • 如果使用自托管代理,可先在代理上执行az version确认CLI版本,若版本低于2.37.0也可直接继续使用objectId字段,上述兼容写法可同时适配新旧版本无需调整。
  • 移除原脚本中无意义的数组子表达式@()包裹逻辑,原写法虽然能正常输出结果,但会产生不必要的数组嵌套,应用数量较多时会额外消耗执行时间。

内容的提问来源于stack exchange,提问作者gio.s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:42:35