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

使用Azure Resource Graph SDK .NET查询合规分数:调用及订阅获取求助

解决方案:使用Azure Resource Graph SDK for .NET查询合规分数

第一步:修正订阅ID传递错误

你当前代码里Subscriptions = { subscriptionIds.ToString() }是错误的,这会把列表的字符串标识(比如System.Collections.Generic.List1[System.String]`)当成单个订阅ID传入。正确做法是直接将所有订阅ID添加到集合:

var request = new ResourceQueryContent(query)
{
    Subscriptions = subscriptionIds
};

第二步:完成查询调用逻辑

通过ArmClient获取ResourceGraphClient,调用Resources.QueryAsync执行查询,完整的GetComplianceScoreAsync方法代码如下:

public async Task<QueryResponse> GetComplianceScoreAsync()
{
    var subscriptionIds = new List<string>();
    await foreach (var sub in _armClient.GetSubscriptions().GetAllAsync())
    {
        subscriptionIds.Add(sub.Data.SubscriptionId);
    }

    if (subscriptionIds.Count == 0)
    {
        throw new Exception("No subscriptions found.");
    }

    // 替换为按资源类型查询合规分数的Resource Graph语句
    var query = @"
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines' // 示例:筛选虚拟机资源
        | join kind=leftouter (
            securityresources
            | where type =~ 'Microsoft.Security/complianceResults'
            | extend resourceId = tolower(properties.resourceId)
            | project resourceId, complianceState = properties.complianceState, score = properties.score
        ) on $left.id == $right.resourceId
        | project name, type, complianceState, score
    ";

    var request = new ResourceQueryContent(query)
    {
        Subscriptions = subscriptionIds
    };

    // 获取客户端并执行查询
    var resourceGraphClient = _armClient.GetResourceGraphClient();
    var response = await resourceGraphClient.Resources.QueryAsync(request);

    return response.Value;
}

第三步:关键注意事项

  • 动态订阅获取:你当前的_armClient.GetSubscriptions().GetAllAsync()已经正确实现了动态获取租户下所有有权限的订阅,无需额外修改。
  • 查询语句调整:示例查询关联了资源表与合规结果表,你可以根据需求修改type筛选条件、返回字段或添加更多过滤逻辑。
  • 权限配置:确保服务主体(Client ID对应的身份)拥有Resource Graph Query Reader权限,以及目标订阅的Reader权限,否则无法获取订阅或合规数据。

第四步:控制器调用示例

在控制器中注入服务后直接调用方法:

[ApiController]
[Route("api/compliance")]
public class ComplianceController : ControllerBase
{
    private readonly ComplianceService _complianceService;

    public ComplianceController(ComplianceService complianceService)
    {
        _complianceService = complianceService;
    }

    [HttpGet("score")]
    public async Task<IActionResult> GetComplianceScore()
    {
        try
        {
            var result = await _complianceService.GetComplianceScoreAsync();
            return Ok(result);
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:05:11