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

Azure AD服务主体过期查询命令无输出,寻求自动化预警方案

解决服务主体过期日期识别与通知的问题

先排查命令无输出的问题

你的az ad sp credential list命令没有输出,大概率是以下几种原因:

  • 服务主体无有效凭证:如果该服务主体从未设置过密码或证书凭证,命令会返回空数组,自然提取不到endDate。先执行不带过滤的命令验证:
    az ad sp credential list --id "xxxxxxxxxxxxxxxxxxx"
    
    如果返回[],说明没有凭证,需要先给服务主体创建凭证才能获取过期日期。
  • 权限不足:执行命令的身份(比如Azure DevOps流水线使用的服务连接身份)需要拥有Azure AD的Directory Readers或Application Administrator权限,才能读取服务主体的凭证信息。检查该身份的Azure AD角色分配。
  • 服务主体ID错误:确认--id参数使用的是服务主体的应用ID(Client ID)或对象ID,可以通过以下命令获取正确ID:
    az ad sp list --display-name "你的服务主体显示名称" --query "[].{id:id, appId:appId}" -o table
    

实现自动化识别与通知的方案

当命令能正常返回过期日期后,可通过以下脚本实现60天内过期的服务主体识别,并集成到Azure DevOps流水线中:

示例Bash脚本

#!/bin/bash

# 设置阈值:60天后的日期(格式与az cli返回的endDate一致:YYYY-MM-DD)
THRESHOLD_DATE=$(date -d "+60 days" +%Y-%m-%d)

# 获取所有服务主体的凭证过期信息(过滤有endDate的条目)
az ad sp list --query "[?credentials[*].endDate].{displayName:displayName, appId:appId, endDates:credentials[*].endDate}" -o json | jq -r '.[] | .endDates[] | select(. <= "'"$THRESHOLD_DATE"'") | "\(.displayName) (\(.appId)): \(.endDates[])"' > expiring_sps.txt

# 如果有即将过期的服务主体,发送通知(示例:输出到流水线日志,可替换为邮件/Teams通知)
if [ -s expiring_sps.txt ]; then
  echo "以下服务主体凭证将在60天内过期:"
  cat expiring_sps.txt
  # 这里可以添加通知逻辑,比如调用Azure DevOps通知API、发送邮件或Teams消息
else
  echo "没有即将过期的服务主体凭证"
fi

Azure DevOps流水线配置要点

  1. 添加Azure CLI任务,选择有权限的Azure AD服务连接。
  2. 确保流水线代理安装了jq(用于JSON解析,可通过任务提前安装:apt-get install jq或brew install jq)。
  3. 根据需求配置通知方式:比如使用PowerShell任务发送Teams webhook,或调用邮件服务发送通知。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:45:08