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

如何通过C#/API查询Microsoft Purview审计日志获取Power平台日志

如何通过C#/API程序化查询Microsoft Purview审计日志获取Power Apps启动事件和Power Automate流运行状态?

我希望通过C#或API程序化查询Microsoft Purview Audit Logs,获取PowerApps启动事件和Power Automate流运行状态。新的Purview审计搜索门户能提供包含PowerApps启动日志在内的审计日志,但需后台处理查询任务,数小时后才能查看结果,我不想手动操作,希望通过C#调用API实现自动化查询。

问题:

  1. 是否有REST API或Graph API端点可从Microsoft Purview获取Power Apps和Flows的审计日志?
  2. 若有,服务主体的认证要求是什么?
  3. 是否有简化查询Power Platform的Purview审计日志的C# SDK或库?

已尝试方案:

  • 测试了Microsoft Graph API端点https://graph.microsoft.com/beta/auditLogs/directoryAudits,未返回Power Apps和Flow日志数据。
  • 查看了Microsoft Compliance Center Audit Log Search,自动化能力有限。
  • 尝试了Exchange Online PowerShell cmdlet Search-UnifiedAuditLog,无法返回全部所需的流运行日志、应用启动日志等信息,且希望采用API方案。

问题1:可用的API端点

有,Microsoft Graph API的auditLogs/unifiedAuditLogs端点(beta版本)可以获取Power Apps和Power Automate的审计日志。directoryAudits仅返回Azure AD目录相关审计,所以你之前用的端点不对。

该端点返回的统一审计日志包含Purview中的Power Platform相关事件,典型操作名称包括:

  • Power Apps启动事件:PowerAppStarted
  • Power Automate流运行状态:FlowRunStarted、FlowRunCompleted、FlowRunFailed

问题2:服务主体的认证要求

服务主体需要满足以下配置:

  1. 权限:必须分配AuditLog.Read.All应用权限(属于Microsoft Graph权限),且需由全局管理员或合规管理员完成权限同意。
  2. 租户配置:确保租户已开启统一审计日志(默认已开启,若曾关闭需重新启用)。
  3. 认证方式:采用客户端凭据流(Client Credential Flow)获取访问令牌,适配后台自动化查询的无用户交互场景。

问题3:C# SDK支持

可以直接使用Microsoft Graph .NET SDK(通过Microsoft.Graph NuGet包安装)简化查询,无需手动处理HTTP请求和认证逻辑,该SDK完全支持unifiedAuditLogs端点的查询操作。


C#示例代码

以下是使用Microsoft Graph .NET SDK查询目标审计日志的实现:

首先安装所需NuGet包:

Install-Package Microsoft.Graph
Install-Package Microsoft.Graph.Auth
Install-Package Microsoft.Identity.Client

核心代码:

using Microsoft.Graph;
using Microsoft.Identity.Client;
using System;
using System.Threading.Tasks;

class PurviewAuditLogQuery
{
    private static readonly string TenantId = "你的租户ID";
    private static readonly string ClientId = "你的服务主体客户端ID";
    private static readonly string ClientSecret = "你的服务主体客户端密钥";

    public static async Task Main(string[] args)
    {
        // 初始化认证提供程序
        var confidentialClient = ConfidentialClientApplicationBuilder
            .Create(ClientId)
            .WithTenantId(TenantId)
            .WithClientSecret(ClientSecret)
            .Build();

        var authProvider = new ClientCredentialProvider(confidentialClient);
        var graphClient = new GraphServiceClient(authProvider);

        try
        {
            // 筛选Power Apps和Flow的目标事件,限制时间范围
            var auditLogs = await graphClient.AuditLogs.UnifiedAuditLogs
                .Request()
                .Filter("OperationName in ('PowerAppStarted', 'FlowRunStarted', 'FlowRunCompleted', 'FlowRunFailed') and CreatedDateTime ge 2024-01-01T00:00:00Z")
                .Top(100) // 单次查询最大返回100条,按需调整
                .GetAsync();

            foreach (var log in auditLogs.CurrentPage)
            {
                Console.WriteLine($"事件时间: {log.CreatedDateTime}");
                Console.WriteLine($"操作类型: {log.OperationName}");
                Console.WriteLine($"触发用户: {log.UserId ?? "系统账户"}");
                Console.WriteLine($"目标资源: {log.TargetResources?[0]?.DisplayName ?? "无"}");
                Console.WriteLine("------------------------");
            }

            // 处理分页(若结果超过100条)
            while (auditLogs.NextPageRequest != null)
            {
                auditLogs = await auditLogs.NextPageRequest.GetAsync();
                foreach (var log in auditLogs.CurrentPage)
                {
                    // 输出逻辑同上
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"查询失败: {ex.Message}");
        }
    }
}

注意事项

  • 查询时间范围不宜过大,建议按天/小时分段查询,避免性能问题。
  • Power Automate的详细运行信息可能存储在AdditionalDetails属性中,可按需解析。
  • 若需要获取更早期的日志,需调整CreatedDateTime的筛选条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:20:09