访问 Power BI 活动日志

本文面向需要访问和分析来自 Power BI 活动日志的数据的 Power BI 管理员。 它重点介绍使用 Power BI 管理模块中的 Get-PowerBIActivityEvent cmdlet 以编程方式检索 Power BI 活动。 最多可提供 30 天的历史记录。 此 cmdlet 使用“获取活动事件”Power BI REST API 操作,它是一个管理 API。 PowerShell cmdlet 在基础 API 之上添加了一个抽象层。 因此,PowerShell cmdlet 简化了对 Power BI 活动日志的访问。

还有其他手动和编程方法来检索 Power BI 活动。 有关详细信息,请参阅访问用户活动数据

分析 Power BI 活动日志对于治理、合规性和跟踪采用工作至关重要。 有关 Power BI 活动日志的详细信息,请参阅在 Power BI 中跟踪用户活动

提示

建议全面查看租户级审核一文。 本文介绍在构建端到端审核解决方案时要考虑的规划、关键决策、先决条件和关键解决方案开发活动。

可用示例

本文的目的是提供示例来帮助你入门。 示例包括使用 Power BI 管理 PowerShell 模块从活动日志中检索数据的脚本。

警告

这些脚本不是生产就绪的,因为它们仅用于教育目的。 但是,可以通过添加用于日志记录、错误处理、警报和重构的逻辑来调整脚本以用于生产目的,从而实现代码重用和模块化。

因为它们是用于学习的,所以这些示例很简单,但它们是真实的。 建议查看所有示例,以了解它们如何应用略有不同的技术。 确定所需的活动数据类型后,可以混合和匹配这些技术,以生成最适合你的要求的脚本。

本文包括以下示例。

示例名称 活动数据类型
使用 Power BI 服务进行身份验证 不适用
查看用户一天的所有活动 全部
查看 N 天的活动 共享报表(链接或直接访问)
查看 N 天的三个活动 创建应用、更新应用和安装应用
查看工作区一天的所有活动 全部
导出前 N 天的所有活动 全部

为简单起见,大多数示例将其结果输出到屏幕。 例如,在 Visual Studio Code 中,数据输出到终端面板,该面板在内存中保存一组缓冲区数据。

大多数示例检索原始 JSON 数据。 使用原始 JSON 数据有许多优点。

  • 将返回可用于每个活动事件的所有信息。 这有助于了解哪些数据可用。 请记住,API 响应的内容因实际活动事件而异。 例如,可用于 CreateApp 事件的数据与 ViewReport 事件不同。
  • 由于活动日志中可用的数据会随着 Power BI 的演变而变化,因此 API 响应也会随之更改。 这样就不会错过引入的新数据。 你的过程也更能适应变化,不太可能失败。
  • 对于 Power BI 商业云和国家/地区云,API 响应的详细信息可能会有所不同。
  • 如果你有参与过此过程的不同团队成员(例如数据工程师),则简化提取数据的初始过程可使多个团队更轻松地协同工作。

提示

建议使提取数据的脚本尽可能简单。 因此,避免在提取活动日志数据时分析、筛选或设置其格式。 此方法使用 ELT 方法,其具有提取、加载和转换数据的单独步骤。 本文仅重点介绍与提取数据相关的第一步。

要求

若要使用示例脚本,必须满足以下要求。

  • PowerShell 客户端工具:使用首选工具来运行 PowerShell 命令。 所有示例都是使用适用于 Visual Studio Code 的 PowerShell 扩展以及 PowerShell 7 进行测试的。 有关客户端工具和 PowerShell 版本的信息,请参阅租户级审核
  • Power BI 管理模块:安装所有 Power BI PowerShell 模块。 如果之前安装了这些模块,建议更新模块以确保使用最新的已发布版本。
  • Fabric 管理员角色:示例脚本旨在使用交互式身份验证流。 因此,运行 PowerShell 示例脚本的用户必须登录才能使用 Power BI REST API。 若要检索活动日志数据,身份验证用户必须属于 Power BI 管理员角色(因为检索活动事件是使用管理员 API 完成的)。 服务主体身份验证不在这些学习示例的范围内。

本文的其余部分包括示例脚本,这些脚本展示了检索活动日志数据的不同方式。

示例 1:使用 Power BI 服务进行身份验证

所有 Power BI REST API 操作都要求登录。 身份验证(请求发出者)和授权(用户有权执行的操作)由 Microsoft 标识平台管理。 以下示例使用 Power BI 管理模块中的 Connect-PowerBIServiceAccount cmdlet。 此 cmdlet 支持一种简单的登录方法。

示例请求 1

第一个脚本将你重定向到浏览器以完成登录过程。 启用了多重身份验证 (MFA) 的用户帐户能够使用此交互式身份验证流登录。

Connect-PowerBIServiceAccount

重要

没有 Power BI 管理员权限的用户无法运行本文后面的任何示例脚本。 Power BI 管理员有权管理 Power BI 服务和检索租户范围的元数据(例如活动日志数据)。 尽管使用服务主体身份验证不在这些示例的范围内,但我们强烈建议你为按计划运行的生产就绪、无人参与的脚本设置服务主体

在运行以下任何脚本之前,请务必登录。

示例 2:查看用户一天的所有活动

有时需要检查特定用户在特定日期执行的所有活动。

提示

使用 PowerShell cmdlet 从活动日志中提取数据时,每个请求可以提取一天的数据(最多 24 小时)。 因此,此示例的目标是开始一天只检查一个用户。 本文后面的其他示例介绍了如何使用循环导出多天的数据。

示例请求 2

此脚本声明两个 PowerShell 变量,以便更轻松地重用脚本:

  • $UserEmailAddr:你感兴趣的用户的电子邮件地址。
  • $ActivityDate:你感兴趣的日期。 格式为 YYYY-MM-DD(ISO 8601 格式)。 不能请求当前日期 30 天之前的日期。
#Input values before running the script:
$UserEmailAddr = 'jordan@contoso.com'
$ActivityDate = '2023-03-15'
#----------------------------------------------------------------------
#View activity events:
Get-PowerBIActivityEvent `
    -StartDateTime ($ActivityDate + 'T00:00:00.000') `
    -EndDateTime ($ActivityDate + 'T23:59:59.999') `
    -User $UserEmailAddr

注意

你可能会注意到,PowerShell 脚本中某些行的末尾有一个反撇号 (`) 字符。 在 PowerShell 中,使用反撇号字符的一种方法是作为续行符。 我们在本文中使用它来提高脚本的可读性。

提示

在脚本中,每个 PowerShell 变量都与 Get-PowerBIActivityEvent cmdlet 中的必需或可选参数值相关联。 例如,分配给 $UserEmailAddr 变量的值将传递给 -User 参数。 以这种方式声明 PowerShell 变量是一种轻量级方法,可避免对可能在脚本中更改的值进行硬编码。 这是个好习惯,随着脚本变得越来越复杂,它会很有用。 PowerShell 参数比变量更可靠,但它们超出了本文的范围。

示例响应 2

下面是示例 JSON 响应。 它包括用户执行的两个活动:

  • 第一个活动显示用户查看了报表。
  • 第二个活动显示管理员从 Power BI 活动日志导出了数据。
[
  {
    "Id": "10af656b-b5a2-444c-bf67-509699896daf",
    "RecordType": 20,
    "CreationTime": "2023-03-15T15:18:30Z",
    "Operation": "ViewReport",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 0,
    "UserKey": "100FFF92C7717B",
    "Workload": "PowerBI",
    "UserId": "jordan@contoso.com",
    "ClientIP": "192.168.1.1",
    "Activity": "ViewReport",
    "ItemName": "Gross Margin Analysis",
    "WorkSpaceName": "Sales Analytics",
    "DatasetName": "Sales Data",
    "ReportName": "Gross Margin Analysis",
    "WorkspaceId": "e380d1d0-1fa6-460b-9a90-1a5c6b02414c",
    "ObjectId": "Gross Margin Analysis",
    "DatasetId": "cfafbeb1-8037-4d0c-896e-a46fb27ff229",
    "ReportId": "94e57e92-Cee2-486d-8cc8-218c97200579",
    "ArtifactId": "94e57e92-Cee2-486d-8cc8-218c97200579",
    "ArtifactName": "Gross Margin Analysis",
    "IsSuccess": true,
    "ReportType": "PowerBIReport",
    "RequestId": "53451b83-932b-f0b0-5328-197133f46fa4",
    "ActivityId": "beb41a5d-45d4-99ee-0e1c-b99c451e9953",
    "DistributionMethod": "Workspace",
    "ConsumptionMethod": "Power BI Web",
    "SensitivityLabelId": "e3dd4e72-5a5d-4a95-b8b0-a0b52b827793",
    "ArtifactKind": "Report"
  },
  {
    "Id": "5c913f29-502b-4a1a-a089-232edaf176f7",
    "RecordType": 20,
    "CreationTime": "2023-03-15T17:22:00Z",
    "Operation": "ExportActivityEvents",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 2,
    "UserKey": "100FFF92C7717B",
    "Workload": "PowerBI",
    "UserId": "jordan@contoso.com",
    "ClientIP": "192.168.1.1",
    "UserAgent": "MicrosoftPowerBIMgmt/1.2.1111.0",
    "Activity": "ExportActivityEvents",
    "IsSuccess": true,
    "RequestId": "2af6a22d-6f24-4dc4-a26a-5c234ab3afad",
    "ActivityId": "00000000-0000-0000-0000-000000000000",
    "ExportEventStartDateTimeParameter": "2023-03-17T00:00:00Z",
    "ExportEventEndDateTimeParameter": "2023-03-17T23:59:59.999Z"
  }
]

提示

提取 Power BI 活动日志数据也是记录的操作,如前面的响应所示。 分析用户活动时,可能需要省略管理员活动,或单独分析它们。

示例 3:查看 N 天的活动

有时,你可能想要持续数天调查一种特定类型的活动。 此示例演示如何检索每个项的报表共享活动。 它使用循环来检索前七天的活动。

示例请求 3

该脚本声明两个变量:

  • $ActivityType:正在调查的活动的操作名称
  • $NbrOfDaysToCheck:你有兴趣检查多少天。 它执行从当前日期向后工作的循环。 允许的最大值是 30 天(因为可以检索的最早日期是当前日期之前的 30 天)。
#Input values before running the script:
$ActivityType = 'ShareReport' 
$NbrOfDaysToCheck = 7 
#-----------------------------------------------------------------------

#Use today to start counting back the number of days to check:
$DayUTC = (([datetime]::Today.ToUniversalTime()).Date)

#Iteratively loop through each of the last N days to view events:
For($LoopNbr=0; $LoopNbr -le $NbrOfDaysToCheck; $LoopNbr++)
{
    $PeriodStart=$DayUTC.AddDays(-$LoopNbr)
    $ActivityDate=$PeriodStart.ToString("yyyy-MM-dd")
    Write-Verbose "Checking $ActivityDate" -Verbose 

    #Check activity events once per loop (once per day):
    Get-PowerBIActivityEvent `
        -StartDateTime ($ActivityDate + 'T00:00:00.000') `
        -EndDateTime ($ActivityDate + 'T23:59:59.999') `
        -ActivityType $ActivityType 
}

提示

可以使用此循环技术检查活动日志中记录的任何操作

示例响应 3

下面是示例 JSON 响应。 它包括用户执行的两个活动:

  • 第一个活动显示已创建用户的共享链接。 请注意,SharingAction 值因用户创建链接、编辑链接还是删除链接而异。 为简洁起见,响应中仅显示一种类型的共享链接活动。
  • 第二个活动显示已创建组的直接访问共享。 请注意,SharingInformation 值因所执行的操作而异。 为简洁起见,响应中仅显示一种类型的直接访问共享活动。
[
  {
    "Id": "be7506e1-2bde-4a4a-a210-bc9b156142c0",
    "RecordType": 20,
    "CreationTime": "2023-03-15T19:52:42Z",
    "Operation": "ShareReport",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 0,
    "UserKey": "900GGG12D2242A",
    "Workload": "PowerBI",
    "UserId": "morgan@contoso.com",
    "ClientIP": "192.168.1.1",
    "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0",
    "Activity": "ShareReport",
    "ItemName": "Call Center Stats",
    "WorkSpaceName": "Sales Analytics",
    "SharingInformation": [
      {
        "RecipientEmail": "ellis@contoso.com",
        "RecipientName": "Turner",
        "ObjectId": "fc9bbc6c-e39b-44cb-9c8a-d37d5665ec57",
        "ResharePermission": "ReadReshare",
        "UserPrincipalName": "ellis@contoso.com"
      }
    ],
    "WorkspaceId": "e380d1d0-1fa6-460b-9a90-1a5c6b02414c",
    "ObjectId": "Call Center Stats",
    "Datasets": [
      {
        "DatasetId": "fgagrwa3-9044-3e1e-228f-k24bf72gg995",
        "DatasetName": "Call Center Data"
      }
    ],
    "ArtifactId": "81g22w11-vyy3-281h-1mn3-822a99921541",
    "ArtifactName": "Call Center Stats",
    "IsSuccess": true,
    "RequestId": "7d55cdd3-ca3d-a911-5e2e-465ac84f7aa7",
    "ActivityId": "4b8b53f1-b1f1-4e08-acdf-65f7d3c1f240",
    "SharingAction": "CreateShareLink",
    "ShareLinkId": "J_5UZg-36m",
    "ArtifactKind": "Report",
    "SharingScope": "Specific People"
  },
  {
    "Id": "b4d567ac-7ec7-40e4-a048-25c98d9bc304",
    "RecordType": 20,
    "CreationTime": "2023-03-15T11:57:26Z",
    "Operation": "ShareReport",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 0,
    "UserKey": "900GGG12D2242A",
    "Workload": "PowerBI",
    "UserId": "morgan@contoso.com",
    "ClientIP": "69.132.26.0",
    "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0",
    "Activity": "ShareReport",
    "ItemName": "Gross Margin Analysis",
    "WorkSpaceName": "Sales Analytics",
    "SharingInformation": [
      {
        "RecipientName": "SalesAndMarketingGroup-NorthAmerica",
        "ObjectId": "ba21f28b-6226-4296-d341-f059257a06a7",
        "ResharePermission": "Read"
      }
    ],
    "CapacityId": "1DB44EEW-6505-4A45-B215-101HBDAE6A3F",
    "CapacityName": "Shared On Premium - Reserved",
    "WorkspaceId": "e380d1d0-1fa6-460b-9a90-1a5c6b02414c",
    "ObjectId": "Gross Margin Analysis",
    "Datasets": [
      {
        "DatasetId": "cfafbeb1-8037-4d0c-896e-a46fb27ff229",
        "DatasetName": "Sales Data"
      }
    ],
    "ArtifactId": "94e57e92-Cee2-486d-8cc8-218c97200579",
    "ArtifactName": "Gross Margin Analysis",
    "IsSuccess": true,
    "RequestId": "82219e60-6af0-0fa9-8599-c77ed44fff9c",
    "ActivityId": "1d21535a-257e-47b2-b9b2-4f875b19855e",
    "SensitivityLabelId": "16c065f5-ba91-425e-8693-261e40ccdbef",
    "SharingAction": "Direct",
    "ArtifactKind": "Report",
    "SharingScope": "Specific People"
  }
]

注意

此 JSON 响应显示数据结构因事件类型而异。 即使同一类型的事件也可以具有不同的特征,它们会产生略微不同的输出。 如本文前面所述,你应该习惯于检索原始数据。

示例 4:查看 N 天的三个活动

有时可能需要调查多个相关活动。 此示例演示如何检索前七天的三个特定活动。 它重点介绍与 Power BI 应用相关的活动,包括创建应用、更新应用和安装应用。

示例请求 4

该脚本声明以下变量:

  • $NbrOfDaysToCheck:你有兴趣检查多少天。 它执行从当天向后运行的循环。 允许的最大值是 30 天(因为可以检索的最早日期是当前日期之前的 30 天)。
  • $Activity1:要调查的第一个活动的操作名称。 在此示例中,它将搜索 Power BI 应用创建活动。
  • $Activity2:第二个操作名称。 在此示例中,它将搜索 Power BI 应用更新活动。
  • $Activity3:第三个操作名称。 在此示例中,它将搜索 Power BI 应用安装活动。

一次只能检索一个活动的活动事件。 因此,脚本会单独搜索每个操作。 它将搜索结果合并到名为 $FullResults 的变量中,然后输出到屏幕。

注意

多次运行多个循环会大大增加 API 限制的可能性。 如果超过给定时间段内允许发出的请求数,则可能会发生限制。 “获取活动事件”操作限制为每小时 200 个请求。 设计脚本时,请注意不要检索原始数据次数超过所需次数。 通常,最好每天提取一次所有原始数据,然后单独查询、转换、筛选或格式化该数据。

该脚本显示当天的结果。

注意

若要仅检索前一天的结果(避免部分日期的结果),请参阅导出前 N 天的所有活动示例。

#Input values before running the script:
$NbrOfDaysToCheck = 7
$Activity1 = 'CreateApp'
$Activity2 = 'UpdateApp'
$Activity3 = 'InstallApp'
#-----------------------------------------------------------------------
#Initialize array which will contain the full resultset:
$FullResults = @() 

#Use today to start counting back the number of days to check:
$DayUTC = (([datetime]::Today.ToUniversalTime()).Date)

#Iteratively loop through each day (<Initilize> ; <Condition> ; <Repeat>)
#Append each type of activity to an array:
For($LoopNbr=0; $LoopNbr -le $NbrOfDaysToCheck; $LoopNbr++)
{
    $PeriodStart=$DayUTC.AddDays(-$LoopNbr)
    $ActivityDate=$PeriodStart.ToString("yyyy-MM-dd")
    Write-Verbose "Checking $ActivityDate" -Verbose 

    #Get activity 1 and append its results into the full resultset:
    $Activity1Results = @()
    $Activity1Results += Get-PowerBIActivityEvent `
        -StartDateTime ($ActivityDate+'T00:00:00.000') `
        -EndDateTime ($ActivityDate+'T23:59:59.999') `
        -ActivityType $Activity1 | ConvertFrom-Json
    If ($null -ne $Activity1Results) {$FullResults += $Activity1Results}
    
    #Get activity 2 and append its results into the full resultset:
    $Activity2Results = @()
    $Activity2Results += Get-PowerBIActivityEvent `
        -StartDateTime ($ActivityDate+'T00:00:00.000') `
        -EndDateTime ($ActivityDate+'T23:59:59.999') `
        -ActivityType $Activity2 | 
    ConvertFrom-Json
    If ($null -ne $Activity2Results) {$FullResults += $Activity2Results}  

    #Get activity 3 and append its results into the full resultset:
    $Activity3Results = @()
    $Activity3Results += Get-PowerBIActivityEvent `
        -StartDateTime ($ActivityDate+'T00:00:00.000') `
        -EndDateTime ($ActivityDate+'T23:59:59.999') `
        -ActivityType $Activity3 | 
    ConvertFrom-Json
    If ($null -ne $Activity3Results) {$FullResults += $Activity3Results}
    
}  
#Convert all of the results back to a well-formed JSON object:
$FullResults = $FullResults | ConvertTo-Json

#Display results on the screen:
$FullResults

示例响应 4

下面是示例 JSON 响应。 它包括用户执行的三个活动:

  • 第一个活动显示已创建 Power BI 应用。
  • 第二个活动显示已更新 Power BI 应用。
  • 第三个活动显示用户安装了 Power BI 应用。

警告

响应仅包含已修改的用户权限。 例如,可能在 CreateApp 事件中创建了三个受众。 在 UpdateApp 事件中,如果只有一个访问群体发生了更改,则 OrgAppPermission 数据中只会显示一个访问群体。 因此,依赖 UpdateApp 事件来跟踪所有应用权限是不完整的,因为活动日志仅显示更改的内容。

若要获取所有 Power BI 应用权限的快照,请改用“以管理员身份获取应用用户”API 操作。

[
  {
    "Id": "65a26480-981a-4905-b3aa-cbb3df11c7c2",
    "RecordType": 20,
    "CreationTime": "2023-03-15T18:42:13Z",
    "Operation": "CreateApp",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 0,
    "UserKey": "100FFF92C7717B",
    "Workload": "PowerBI",
    "UserId": "jordan@contoso.com",
    "ClientIP": "192.168.1.1",
    "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0",
    "Activity": "CreateApp",
    "ItemName": "Sales Reconciliations App",
    "WorkSpaceName": "Sales Reconciliations",
    "OrgAppPermission": {
      "recipients": "Sales Reconciliations App(Entire Organization)",
      "permissions": "Sales Reconciliations App(Read,CopyOnWrite)"
    },
    "WorkspaceId": "9325a31d-067e-4748-a592-626d832c8001",
    "ObjectId": "Sales Reconciliations App",
    "IsSuccess": true,
    "RequestId": "ab97a4f1-9f5e-4a6f-5d50-92c837635814",
    "ActivityId": "9bb54a9d-b688-4028-958e-4d7d21ca903a",
    "AppId": "42d60f97-0f69-470c-815f-60198956a7e2"
  },
  {
    "Id": "a1dc6d26-b006-4727-bac6-69c765b7978f",
    "RecordType": 20,
    "CreationTime": "2023-03-16T18:39:58Z",
    "Operation": "UpdateApp",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 0,
    "UserKey": "100GGG12F9921B",
    "Workload": "PowerBI",
    "UserId": "morgan@contoso.com",
    "ClientIP": "192.168.1.1",
    "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0",
    "Activity": "UpdateApp",
    "ItemName": "Sales Analytics",
    "WorkSpaceName": "Sales Analytics",
    "OrgAppPermission": {
      "recipients": "Sales Reps Audience(SalesAndMarketingGroup-NorthAmerica,SalesAndMarketingGroup-Europe)",
      "permissions": "Sales Reps Audience(Read,CopyOnWrite)"
    },
    "WorkspaceId": "c7bffcd8-8156-466a-a88f-0785de2c8b13",
    "ObjectId": "Sales Analytics",
    "IsSuccess": true,
    "RequestId": "e886d122-2c09-4189-e12a-ef998268b864",
    "ActivityId": "9bb54a9d-b688-4028-958e-4d7d21ca903a",
    "AppId": "c03530c0-db34-4b66-97c7-34dd2bd590af"
  },
  {
    "Id": "aa002302-313d-4786-900e-e68a6064df1a",
    "RecordType": 20,
    "CreationTime": "2023-03-17T18:35:22Z",
    "Operation": "InstallApp",
    "OrganizationId": "927c6607-8060-4f4a-a5f8-34964ac78d70",
    "UserType": 0,
    "UserKey": "100HHH12F4412A",
    "Workload": "PowerBI",
    "UserId": "ellis@contoso.com",
    "ClientIP": "192.168.1.1",
    "UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0",
    "Activity": "InstallApp",
    "ItemName": "Sales Reconciliations App",
    "ObjectId": "Sales Reconciliations App",
    "IsSuccess": true,
    "RequestId": "7b3cc968-883f-7e13-081d-88b13f6cfbd8",
    "ActivityId": "9bb54a9d-b688-4028-958e-4d7d21ca903a"
  }
]

示例 5:查看工作区一天的所有活动

有时,你可能想要调查与特定工作区相关的活动。 此示例检索所有用户一天的所有活动。 然后,它会筛选结果,以便你可以专注于分析一个工作区中的活动。

示例请求 5

该脚本声明两个变量:

  • $ActivityDate:你感兴趣的日期。 格式为 YYYY-MM-DD。 不能请求当前日期 30 天之前的日期。
  • $WorkspaceName:你感兴趣的工作区的名称。

脚本将结果存储在 $Results 变量中。 然后,它将 JSON 数据转换为对象,以便可以分析结果。 然后,它会筛选结果以检索五个特定列。 CreationTime 数据重命名为 ActivityDateTime。 结果按工作区名称进行筛选,然后输出到屏幕。

Get-PowerBIActivityEvent cmdlet 没有允许你在检查活动日志时指定工作区的参数(本文前面的示例使用 PowerShell 参数设置特定的用户、日期或活动名称)。 在此示例中,脚本检索所有数据,然后分析 JSON 响应以筛选特定工作区的结果。

注意

如果你身处每天有数百个或数千个活动的大型组织,则在检索结果后筛选结果可能会非常低效。 请记住,“获取活动事件”操作限制为每小时 200 个请求。

为了避免 API 限制(当你超过给定的时间段内允许发出的请求数时),请勿检索超出需要的原始数据。 可以继续使用筛选的结果,而无需运行脚本来再次检索结果。 对于持续的需求,最好是每天提取一次所有数据,然后多次查询。

#Input values before running the script:
$ActivityDate = '2023-03-22'
$WorkspaceName = 'Sales Analytics'
#----------------------------------------------------------------------
#Run cmdlet to check activity events and store intermediate results:
$Events = Get-PowerBIActivityEvent `
    -StartDateTime ($ActivityDate+'T00:00:00.000') `
    -EndDateTime ($ActivityDate+'T23:59:59.999')
    
#Convert from JSON so we can parse the data:
$ConvertedResults = $Events | ConvertFrom-Json

#Obtain specific attributes and save to a PowerShell object:
$FilteredResults = $ConvertedResults `
    | 
    Select-Object `
    @{Name="ActivityDateTime";Expression={$PSItem.CreationTime}}, ` #alias name
    Activity, `
    UserId, `
    ArtifactName, `
    WorkspaceName `
    | 
    #Filter the results:
    Where-Object {($PSItem.WorkspaceName -eq $WorkspaceName)}

#View the filtered results:
$FilteredResults 

#Optional - Save back to JSON format:
#$FilteredResults = $FilteredResults | ConvertTo-Json -Depth 10
#$FilteredResults

示例响应 5

下面是筛选的结果,其中包括一小部分属性。 该格式更易于阅读,以便偶尔进行分析。 但是,如果计划存储结果,建议将其转换回 JSON 格式。

注意

将 JSON 结果转换为 PowerShell 对象后,时间值将转换为本地时间。 原始审核数据始终以协调世界时 (UTC) 时间记录,因此我们建议你习惯于仅使用 UTC 时间。

ActivityDateTime : 4/25/2023 3:18:30 PM
Activity         : ViewReport
UserId           : jordan@contoso.com
ArtifactName     : Gross Margin Analysis
WorkSpaceName    : Sales Analytics

CreationTime     : 4/25/2023 5:32:10 PM
Activity         : ShareReport
UserId           : ellis@contoso.com
ArtifactName     : Call Center Stats
WorkSpaceName    : Sales Analytics

CreationTime     : 4/25/2023 9:03:05 PM
Activity         : ViewReport
UserId           : morgan@contoso.com
ArtifactName     : Call Center Stats
WorkSpaceName    : Sales Analytics

提示

可以使用此方法按结果中的任何属性筛选结果。 例如,可以使用特定事件 RequestId 仅分析一个特定事件。

示例 6:导出前 N 天的所有活动

有时可能需要将所有活动数据导出到文件,以便可以在 PowerShell 外部处理数据。 此示例检索最多 30 天所有用户的所有活动。 它每天将数据导出到一个 JSON 文件。

重要

活动日志数据最多可使用 30 天。 请务必导出并保留数据,以便执行历史分析。 如果当前不导出和存储活动日志数据,则强烈建议你优先这样做。

示例请求 6

该脚本检索数天的所有活动。 它声明三个变量:

  • $NbrDaysDaysToExtract:你有兴趣导出多少天。 它执行一个循环,从前一天向后工作。 允许的最大值是 30 天(因为可以检索的最早日期是当前日期之前的 30 天)。
  • $ExportFileLocation:要在其中保存文件的文件夹路径。 在运行脚本之前,文件夹必须存在。 不要在文件夹路径的末尾包含反斜杠 (\) 字符(因为它是在运行时自动添加的)。 建议使用单独的文件夹来存储原始数据文件。
  • $ExportFileName:每个文件名的前缀。 由于每天保存一个文件,因此脚本会添加一个后缀来指示文件中包含的数据以及检索数据的日期和时间。 例如,如果在 2023 年 4 月 25 日上午 9 点 (UTC) 运行脚本来提取 2023 年 4 月 23 日的活动数据,则文件名将为:PBIActivityEvents-20230423-202304250900。 尽管存储它的文件夹结构很有用,但每个文件名都应是完全自我描述的。

建议提取至少早于当天一天的数据。 这样,你可以避免检索部分日期的事件,并且可以确信每个导出文件都包含完整的 24 小时数据。

该脚本收集最多 30 天的数据,一直收集到前一天。 已审核事件的时间戳始终采用 UTC 格式。 建议基于 UTC 时间(而不是本地时间)构建所有审核过程。

该脚本每天生成一个 JSON 文件。 文件名的后缀包括提取数据的时间戳(UTC 格式)。 如果多次提取同一天的数据,则文件名中的后缀有助于识别较新的文件。

#Input values before running the script:
$NbrDaysDaysToExtract = 7
$ExportFileLocation = 'C:\Power-BI-Raw-Data\Activity-Log'
$ExportFileName = 'PBIActivityEvents'
#--------------------------------------------

#Start with yesterday for counting back to ensure full day results are obtained:
[datetime]$DayUTC = (([datetime]::Today.ToUniversalTime()).Date).AddDays(-1) 

#Suffix for file name so we know when it was written:
[string]$DateTimeFileWrittenUTCLabel = ([datetime]::Now.ToUniversalTime()).ToString("yyyyMMddHHmm")

#Loop through each of the days to be extracted (<Initilize> ; <Condition> ; <Repeat>)
For($LoopNbr=0 ; $LoopNbr -lt $NbrDaysDaysToExtract ; $LoopNbr++)
{
    [datetime]$DateToExtractUTC=$DayUTC.AddDays(-$LoopNbr).ToString("yyyy-MM-dd")

    [string]$DateToExtractLabel=$DateToExtractUTC.ToString("yyyy-MM-dd")
    
    #Create full file name:
    [string]$FullExportFileName = $ExportFileName `
    + '-' + ($DateToExtractLabel -replace '-', '') `
    + '-' + $DateTimeFileWrittenUTCLabel `
    + '.json' 

    #Obtain activity events and store intermediary results:
    [psobject]$Events=Get-PowerBIActivityEvent `
        -StartDateTime ($DateToExtractLabel+'T00:00:00.000') `
        -EndDateTime ($DateToExtractLabel+'T23:59:59.999')

    #Write one file per day:
    $Events | Out-File "$ExportFileLocation\$FullExportFileName"

    Write-Verbose "File written: $FullExportFileName" -Verbose 
}
Write-Verbose "Extract of Power BI activity events is complete." -Verbose

与“获取活动事件”REST API 操作相比,使用 Get-PowerBIActivityEvent PowerShell cmdlet 有几个优点。

  • cmdlet 允许在每次使用 cmdlet 进行调用时请求一天的活动。 而当你直接与 API 通信时,每个 API 请求只能请求一小时。
  • cmdlet 会为你处理延续令牌。 如果直接使用 API,则需要检查延续令牌,以确定是否有更多结果。 某些 API 在返回大量数据时,出于性能原因,需要使用分页令牌和延续令牌。 它们返回第一组记录,然后使用延续令牌,你可以进行后续 API 调用来检索下一组记录。 继续调用 API,直到未返回延续令牌。 使用延续令牌可以合并多个 API 请求,以便合并一组逻辑结果。 有关使用延续令牌的示例,请参阅活动事件 REST API
  • cmdlet 会为你处理Microsoft Entra ID 访问令牌过期。 经过身份验证后,访问令牌将在一小时后过期(默认情况下)。 在这种情况下,cmdlet 会自动为你请求刷新令牌。 如果直接与 API 通信,则需要请求刷新令牌。

有关详细信息,请参阅选择 API 或 PowerShell cmdlet

注意

省略了示例响应,因为它是类似于前面示例中所示响应的输出。

有关本文的详细信息,请参阅以下资源: