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

求多订阅多Azure KeyVault即将过期密钥/机密的PS脚本及报错解决

Azure多订阅Key Vault密钥/机密过期检测脚本

完整可用脚本

下面的脚本会遍历你所有的Azure订阅,检查每个Key Vault里7天内即将过期的Secret和Key,同时返回对应的资源组名称,直接就能用来做后续的邮件通知。如果需要改成5天,修改$expiryThreshold的值即可。

# 自动化账户用系统托管身份连接Azure,本地测试替换为Connect-AzAccount
Connect-AzAccount -Identity

# 设置过期阈值,这里是7天,要改5天就把7换成5
$expiryThreshold = (Get-Date).AddDays(7)

# 存储检测结果的数组
$expiringItems = @()

# 遍历所有Azure订阅
Get-AzSubscription | ForEach-Object {
    # 切换到当前订阅
    Set-AzContext -Subscription $_.Id | Out-Null
    Write-Host "正在处理订阅: $($_.Name)"

    # 获取当前订阅下的所有Key Vault
    $keyVaults = Get-AzKeyVault
    if (-not $keyVaults) {
        Write-Host "该订阅下无Key Vault,跳过"
        return
    }

    # 逐个检测Key Vault
    foreach ($kv in $keyVaults) {
        Write-Host "正在检测Key Vault: $($kv.VaultName) (资源组: $($kv.ResourceGroupName))"

        # 筛选即将过期的Secret
        $expiringSecrets = Get-AzKeyVaultSecret -VaultName $kv.VaultName | 
            Where-Object { $_.Expires -ne $null -and $_.Expires -le $expiryThreshold } |
            Select-Object @{Name='ResourceGroupName'; Expression={$kv.ResourceGroupName}},
                          @{Name='KeyVaultName'; Expression={$kv.VaultName}},
                          @{Name='Type'; Expression={'Secret'}},
                          Name,
                          @{Name='ExpiryDate'; Expression={$_.Expires.ToString('yyyy-MM-dd HH:mm:ss')}}
        
        # 筛选即将过期的Key
        $expiringKeys = Get-AzKeyVaultKey -VaultName $kv.VaultName |
            Where-Object { $_.Expires -ne $null -and $_.Expires -le $expiryThreshold } |
            Select-Object @{Name='ResourceGroupName'; Expression={$kv.ResourceGroupName}},
                          @{Name='KeyVaultName'; Expression={$kv.VaultName}},
                          @{Name='Type'; Expression={'Key'}},
                          Name,
                          @{Name='ExpiryDate'; Expression={$_.Expires.ToString('yyyy-MM-dd HH:mm:ss')}}
        
        # 将结果存入数组
        if ($expiringSecrets) { $expiringItems += $expiringSecrets }
        if ($expiringKeys) { $expiringItems += $expiringKeys }
    }
}

# 输出结果,可替换为邮件发送逻辑
if ($expiringItems) {
    Write-Host "检测到即将过期的密钥/机密:"
    $expiringItems | Format-Table -AutoSize

    # 示例:转换为HTML格式,方便嵌入邮件
    $htmlBody = $expiringItems | ConvertTo-Html -Fragment
    # 此处可添加Send-MailMessage或Azure Logic Apps的邮件发送代码
} else {
    Write-Host "未检测到即将过期的密钥/机密"
}

自动化账户Runbook配置要点

  1. 模块导入:确保自动化账户中已导入Az.Accounts和Az.KeyVault模块,建议使用最新稳定版本。
    • 操作路径:自动化账户 → 模块 → 浏览库,搜索并导入上述模块。
  2. 权限配置:
    • 给自动化账户的系统托管身份分配订阅级别Reader角色,用于遍历所有订阅和Key Vault资源。
    • 给每个目标Key Vault分配Key Vault Secrets User和Key Vault Crypto User角色(或自定义角色,需包含Microsoft.KeyVault/vaults/secrets/list/action和Microsoft.KeyVault/vaults/keys/list/action权限)。
  3. 身份验证设置:脚本中使用Connect-AzAccount -Identity,需确保自动化账户已启用系统托管身份。

常见报错排查

  • "未找到订阅"或权限不足:检查系统托管身份的订阅Reader权限是否覆盖所有需要检测的订阅,确认权限分配无误。
  • 模块缺失报错:确认Az.Accounts和Az.KeyVault模块已成功导入,版本不兼容时可更换匹配版本。
  • Key Vault访问被拒绝:检查Key Vault的访问策略或RBAC权限,确保自动化身份拥有读取密钥/机密的权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:21:23