如何通过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实现自动化查询。
问题:
- 是否有REST API或Graph API端点可从Microsoft Purview获取Power Apps和Flows的审计日志?
- 若有,服务主体的认证要求是什么?
- 是否有简化查询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:服务主体的认证要求
服务主体需要满足以下配置:
- 权限:必须分配
AuditLog.Read.All应用权限(属于Microsoft Graph权限),且需由全局管理员或合规管理员完成权限同意。 - 租户配置:确保租户已开启统一审计日志(默认已开启,若曾关闭需重新启用)。
- 认证方式:采用客户端凭据流(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
相关产品推荐
相关产品推荐

