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

使用PowerShell删除Azure应用注册过期客户端密钥问题排查

问题排查与脚本修正

核心问题分析

你的脚本运行失败并提示“密钥不存在”,主要有以下几个原因:

  • 文件路径错误:$jsonFilePath指向的是文件夹而非具体JSON文件,导致无法正确读取数据
  • 命令语法错误:Remove-AzureADApplicationPasswordCredential前多了$符号,无法正确调用命令
  • 参数传递错误:将密钥的Id(即KeyId)当作应用注册的ObjectId传入,而删除密钥需要的是应用注册的ObjectId和密钥的KeyId
  • 作用域问题:函数内直接修改全局数组$worklog会因为PowerShell作用域规则失效,导致日志无法正确记录

修正后的完整脚本

# 注意:替换为具体的JSON文件路径,而非文件夹
$jsonFilePath = "C:\Users\habeebullah.abdullah\Desktop\Test\expired_secrets.json"

# 读取并解析JSON数据
$jsonData = Get-Content $jsonFilePath | ConvertFrom-Json

# 初始化全局日志数组
$script:worklog = @()

# 删除过期密钥的函数
function DeleteSecret($secretInfo) {
    try {
        # 通过AppId获取应用注册的ObjectId(因为JSON中未直接提供)
        $appObject = Get-AzureADApplication -Filter "AppId eq '$($secretInfo.AppRegistration.AppId)'"
        if (-not $appObject) {
            throw "未找到AppId为 $($secretInfo.AppRegistration.AppId) 的应用注册"
        }

        # 正确调用删除命令:ObjectId是应用的ObjectId,KeyId是密钥的Id
        Remove-AzureADApplicationPasswordCredential -ObjectId $appObject.ObjectId -KeyId $secretInfo.Id -ErrorAction Stop

        # 记录成功日志
        $script:worklog += [PSCustomObject]@{
            AppDisplayName = $secretInfo.AppRegistration.DisplayName
            AppId          = $secretInfo.AppRegistration.AppId
            SecretKeyId    = $secretInfo.Id
            Status         = "删除成功"
            DeletedAt      = (Get-Date)
        }
    }
    catch {
        # 记录失败日志
        $script:worklog += [PSCustomObject]@{
            AppDisplayName = $secretInfo.AppRegistration.DisplayName
            AppId          = $secretInfo.AppRegistration.AppId
            SecretKeyId    = $secretInfo.Id
            Status         = "删除失败:$($_.Exception.Message)"
            DeletedAt      = (Get-Date)
        }
    }
}

# 遍历过期密钥并执行删除
$jsonData | Where-Object { $_.DaysLeft -lt 0 } | ForEach-Object {
    DeleteSecret $_
}

# 显示日志
$worklog | Format-Table -AutoSize

# 导出日志到CSV
$logPath = Join-Path (Split-Path $jsonFilePath) "secret_deletion_worklog.csv"
$worklog | Export-Csv -Path $logPath -NoTypeInformation

关键修正点说明

  1. 文件路径修正:明确指定JSON文件的完整路径,比如expired_secrets.json
  2. 命令语法修正:移除Remove-AzureADApplicationPasswordCredential前的$符号,确保命令能正常调用
  3. 参数修正:
    • 通过Get-AzureADApplication根据AppId获取应用注册的ObjectId(你的JSON数据中未包含应用的ObjectId,只有AppId)
    • 删除命令中,ObjectId传入应用的ObjectId,KeyId传入JSON里的Id(即密钥的唯一标识)
  4. 作用域处理:用$script:worklog引用全局数组,确保函数内的修改能同步到全局
  5. 错误处理:添加try/catch捕获删除过程中的异常,将失败原因记录到日志,方便排查
  6. 日志优化:增加应用名称、AppId等信息,让日志更具可读性

前置检查

  • 确保已安装并导入AzureAD模块:Install-Module AzureAD、Import-Module AzureAD
  • 已通过Connect-AzureAD完成身份验证
  • 确认JSON数据中的Id确实是密钥的KeyId,且该密钥仍存在于对应的应用注册中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:52:51