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

如何在C#中获取Azure Runbook作业状态及内容?遇401授权问题

解决Azure Runbook作业状态/输出获取的401授权问题

核心问题说明

你调用的Azure Automation API返回401错误,本质是缺少有效的Azure AD身份验证令牌。文档里提到的clientid,指的是你用来访问API的Azure AD应用注册(服务主体)的客户端ID,不是任意填写的参数。

完整解决方案步骤

1. 创建Azure AD服务主体(应用注册)

  • 登录Azure门户,搜索「应用注册」并新建应用
  • 记录三个关键信息:
    • 客户端ID(Client ID):即文档要求的clientid
    • 客户端密码(Client Secret):在「证书和密码」选项卡生成
    • 租户ID(Tenant ID):应用注册「概述」页的目录ID

2. 给服务主体分配Automation权限

  • 进入你的Automation账户,打开「访问控制(IAM)」
  • 添加角色分配,给服务主体分配自动化操作员或自动化参与者角色(按需选择权限范围)

3. C#中获取Azure AD Bearer令牌

使用Azure.Identity库简化令牌获取,代码示例:

using Azure.Identity;
using System.Net.Http.Headers;

var tenantId = "你的租户ID";
var clientId = "你的应用客户端ID";
var clientSecret = "你的应用客户端密码";

var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
var tokenRequestContext = new TokenRequestContext(new[] { "https://management.azure.com/.default" });
var token = await credential.GetTokenAsync(tokenRequestContext);

// 后续API请求需在Header中添加Authorization: Bearer {token}

4. 调用API获取作业状态与输出

注意:你之前调用的Get Runbook Content是获取Runbook本身的脚本代码,不是作业执行输出。要获取作业相关数据,需调用以下两个API:

获取作业状态

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);

var subscriptionId = "你的订阅ID";
var resourceGroupName = "你的资源组名";
var automationAccountName = "你的自动化账户名";
var jobId = "已获取的作业ID";

// 调用Job Get API
var jobStatusUrl = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Automation/automationAccounts/{automationAccountName}/jobs/{jobId}?api-version=2023-11-01";
var jobResponse = await httpClient.GetAsync(jobStatusUrl);
jobResponse.EnsureSuccessStatusCode();
var jobStatusContent = await jobResponse.Content.ReadAsStringAsync();
// 解析后可得到作业状态(如Running、Completed、Failed等)

获取作业输出

// 调用Job Get Output API
var jobOutputUrl = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Automation/automationAccounts/{automationAccountName}/jobs/{jobId}/output?api-version=2023-11-01";
var outputResponse = await httpClient.GetAsync(jobOutputUrl);
outputResponse.EnsureSuccessStatusCode();
var jobOutput = await outputResponse.Content.ReadAsStringAsync();
// 此处得到作业的原始执行输出

常见误区提醒

  • 不要混淆Runbook内容与作业输出:Get Runbook Content是获取Runbook脚本,不是单次作业的执行结果
  • 权限必须到位:服务主体若无Automation账户的访问权限,即使令牌正确也会返回401/403
  • 令牌作用域要正确:必须使用https://management.azure.com/.default作为作用域,这是Azure管理API的标准作用域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:04:57