如何绕过PIM实现Power Query访问Log Analytics的持久化数据刷新
解决Power BI报表依赖PIM身份访问Log Analytics API的刷新问题
我有一个连接Azure Log Analytics的Power BI报表,当我的PIM(特权身份管理)身份处于激活状态时,报表数据刷新正常;但PIM权限失效后,数据刷新立即停止。当前通过Web API配置数据连接,使用组织账号登录,仅在PIM激活时能正常工作。相关Power Query代码如下:
let strRangeStart = DateTime.ToText(RangeStart,[Format="yyyy-MM-dd'T'HH:mm:ss'Z'", Culture="en-US"]), strRangeEnd = DateTime.ToText(RangeEnd,[Format="yyyy-MM-dd'T'HH:mm:ss'Z'", Culture="en-US"]), Source = Json.Document(Web.Contents("https://api.loganalytics.io/v1/workspaces/xxxxxx-1554-499b-a4ca-dcde7f3a4a90/query", [Query=[#"query"=" SynapseIntegrationPipelineRuns | where Level == '''Error''' | where TimeGenerated >= datetime(" & strRangeStart &") | where TimeGenerated < datetime("& strRangeEnd &") | project PipelineName, RunId, Start, End, OperationName, Status ",#"x-ms-app"="OmsAnalyticsPBI",#"prefer"="ai.response-thinning=true"],Timeout=#duration(0,0,4,0)])), TypeMap = #table( { "AnalyticsTypes", "Type" }, { { "string", Text.Type }, { "int", Int32.Type }, { "long", Int64.Type }, { "real", Double.Type }, { "timespan", Duration.Type }, { "datetime", DateTimeZone.Type }, { "bool", Logical.Type }, { "guid", Text.Type }, { "dynamic", Text.Type } }), DataTable = Source[tables]{0}, Columns = Table.FromRecords(DataTable[columns]), ColumnsWithType = Table.Join(Columns, {"type"}, TypeMap , {"AnalyticsTypes"}), Rows = Table.FromRows(DataTable[rows], Columns[name]), Table = Table.TransformColumnTypes(Rows, Table.ToList(ColumnsWithType, (c) => { c{0}, c{3}})), #"Changed Type" = Table.TransformColumnTypes(Table,{{"End", type datetime}, {"Start", type datetime}}), #"Filtered Rows" = Table.SelectRows(#"Changed Type", each [End] >= RangeStart and [End] < RangeEnd) in #"Filtered Rows"
可行解决方案
1. 使用服务主体(Service Principal)替代用户身份认证
- 在Azure AD中创建服务主体,为其分配Log Analytics工作区的**读取者(Reader)**角色(遵循最小权限原则,仅分配必要权限),无需依赖PIM临时激活。
- 修改Power Query代码,改用服务主体的客户端ID、客户端密钥和租户ID获取OAuth令牌,调用API时携带令牌:
// 获取服务主体访问令牌 tokenResponse = Json.Document(Web.Contents("https://login.microsoftonline.com/你的租户ID/oauth2/token", [ Content=Text.ToBinary("grant_type=client_credentials&client_id=你的客户端ID&client_secret=你的客户端密钥&resource=https://api.loganalytics.io"), Headers=[#"Content-Type"="application/x-www-form-urlencoded"] ])), accessToken = tokenResponse[access_token], // 调用Log Analytics API Source = Json.Document(Web.Contents("https://api.loganalytics.io/v1/workspaces/xxxxxx-1554-499b-a4ca-dcde7f3a4a90/query", [ Query=[#"query"="SynapseIntegrationPipelineRuns
| where Level == '''Error'''
| where TimeGenerated >= datetime(" & strRangeStart &")
| where TimeGenerated < datetime("& strRangeEnd &")
| project PipelineName, RunId, Start, End, OperationName, Status",
#"x-ms-app"="OmsAnalyticsPBI", #"prefer"="ai.response-thinning=true"],
Headers=[#"Authorization"="Bearer " & accessToken],
Timeout=#duration(0,0,4,0)
]))
- 注意:将客户端密钥存储到Power BI的数据源凭据中,避免硬编码在代码里。 ### 2. 分配永久Log Analytics权限给用户账号 - 若必须使用个人用户身份,可向Azure AD管理员申请为你的账号分配Log Analytics工作区的永久读取权限,无需通过PIM激活。需确保权限符合最小权限原则。 ### 3. 配置PIM自动激活或延长激活时长 - 在Azure AD PIM中设置该身份的**自动激活规则**,比如在报表刷新的固定时段自动激活权限,确保刷新时权限有效。 - 或者调整PIM激活时长,设置更长的有效期,减少手动激活的频率。 ### 4. 通过Power BI网关进行认证 - 配置本地数据网关或云网关,在网关中存储服务主体或永久权限用户的凭据,报表通过网关执行数据刷新,脱离当前用户的PIM状态限制。 内容的提问来源于stack exchange,提问作者user5767413
相关产品推荐
相关产品推荐

