使用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
关键修正点说明
- 文件路径修正:明确指定JSON文件的完整路径,比如
expired_secrets.json - 命令语法修正:移除
Remove-AzureADApplicationPasswordCredential前的$符号,确保命令能正常调用 - 参数修正:
- 通过
Get-AzureADApplication根据AppId获取应用注册的ObjectId(你的JSON数据中未包含应用的ObjectId,只有AppId) - 删除命令中,
ObjectId传入应用的ObjectId,KeyId传入JSON里的Id(即密钥的唯一标识)
- 通过
- 作用域处理:用
$script:worklog引用全局数组,确保函数内的修改能同步到全局 - 错误处理:添加
try/catch捕获删除过程中的异常,将失败原因记录到日志,方便排查 - 日志优化:增加应用名称、AppId等信息,让日志更具可读性
前置检查
- 确保已安装并导入AzureAD模块:
Install-Module AzureAD、Import-Module AzureAD - 已通过
Connect-AzureAD完成身份验证 - 确认JSON数据中的
Id确实是密钥的KeyId,且该密钥仍存在于对应的应用注册中
内容的提问来源于stack exchange,提问作者Habee
相关产品推荐
相关产品推荐

