Доступ к журналу действий Power BI

Эта статья предназначена для администраторов Power BI, которым требуется доступ к данным и анализу из журнала действий Power BI. В нем основное внимание уделяется программному получению действий Power BI с помощью командлета Get-PowerBIActivityEvent из модуля управления Power BI. До 30 дней журнала доступно. Этот командлет использует операцию REST API get Activity Events Power BI, которая является API администратора. Командлеты PowerShell добавляют слой абстракции поверх базовых API. Поэтому командлет PowerShell упрощает доступ к журналу действий Power BI.

Существуют и другие программные способы получения действий Power BI. Дополнительные сведения см. в данных о действиях пользователей Access.

Анализ журнала действий Power BI имеет решающее значение для управления, соответствия требованиям и отслеживания усилий по внедрению . Дополнительные сведения о журнале действий Power BI см. в разделе "Отслеживание действий пользователей" в Power BI.

Совет

Мы рекомендуем полностью просмотреть статью аудита на уровне клиента. В этой статье рассматриваются планирование, ключевые решения, предварительные требования и ключевые действия по разработке решений, которые следует учитывать при создании комплексного решения аудита.

Доступные примеры

Цель этой статьи — предоставить примеры, которые помогут вам приступить к работе. Примеры включают скрипты, которые извлекают данные из журнала действий с помощью модуля Power BI Management PowerShell.

Предупреждение

Скрипты не готовы к работе, так как они предназначены только для образовательных целей. Однако можно адаптировать скрипты для рабочих целей, добавив логику для ведения журнала, обработки ошибок, оповещения и рефакторинга для повторного использования кода и модульизации.

Поскольку они предназначены для обучения, примеры являются упрощенными, но они реальны. Мы рекомендуем просмотреть все примеры, чтобы понять, как они применяют немного разные методы. После определения типа необходимых данных действий можно смешать и сопоставить методы для создания скрипта, который лучше подходит для ваших требований.

В этой статье приведены следующие примеры.

Пример имени Тип данных действия
Проверка подлинности с помощью служба Power BI Н/П
Просмотр всех действий для пользователя в течение одного дня Все
Просмотр действия в течение N дней Общий доступ к отчету (ссылка или прямой доступ)
Просмотр трех действий в течение N дней Создание приложения, обновление приложения и установка приложения
Просмотр всех действий для рабочей области в течение одного дня Все
Экспорт всех действий за предыдущие N дней Все

Для простоты большинство примеров выводит их результат на экран. Например, в Visual Studio Code данные выводится на панель терминала, в которой хранится буферный набор данных в памяти.

Большинство примеров извлекают необработанные данные JSON. Работа с необработанными данными JSON имеет множество преимуществ.

  • Возвращается все сведения, доступные для каждого события действия. Это полезно для вас, чтобы узнать, какие данные доступны. Помните, что содержимое ответа API отличается в зависимости от фактического события действия. Например, данные, доступные для события CreateApp , отличаются от события ViewReport .
  • Так как данные, доступные в журнале действий, изменяются по мере развития Power BI с течением времени, вы можете ожидать, что ответы API также изменятся. Таким образом, новые введенные данные не будут пропущены. Процесс также более устойчивый к изменению и меньше шансов завершиться ошибкой.
  • Сведения об ответе API могут отличаться для коммерческого облака Power BI и национальных и региональных облаков.
  • Если у вас есть разные члены команды (например, инженеры данных), которые участвуют в этом процессе, упрощение начального процесса для извлечения данных упрощает совместную работу нескольких команд.

Совет

Рекомендуется сохранить скрипты, которые извлекают данные как можно проще. Поэтому не используйте синтаксический анализ, фильтрацию или форматирование данных журнала действий при извлечении. Этот подход использует методологию ELT , которая содержит отдельные шаги для извлечения, загрузки и преобразования данных. Эта статья посвящена только первому шагу, который связан с извлечением данных.

Requirements

Чтобы использовать примеры скриптов, необходимо выполнить следующие требования.

  • Клиентское средство PowerShell: используйте предпочитаемое средство для выполнения команд PowerShell. Все примеры были протестированы с помощью расширения PowerShell для Visual Studio Code с PowerShell 7. Дополнительные сведения о клиентских средствах и версиях PowerShell см. в статье об аудите на уровне клиента.
  • Модуль управления Power BI: установите все модули Power BI PowerShell. Если вы установили их ранее, рекомендуется обновить модули, чтобы убедиться, что вы используете последнюю опубликованную версию.
  • Роль администратора Структуры. Примеры скриптов предназначены для использования интерактивного потока проверки подлинности. Таким образом, пользователь, выполняя примеры сценариев PowerShell, должен войти в систему, чтобы использовать REST API Power BI. Чтобы получить данные журнала действий, пользователь, выполняющий проверку подлинности, должен принадлежать роли администратора Power BI (так как получение событий действий выполняется с помощью API администратора). Проверка подлинности субъекта-службы не область для этих примеров обучения.

Оставшаяся часть этой статьи содержит примеры скриптов, демонстрирующих различные способы извлечения данных журнала действий.

Пример 1. Проверка подлинности с помощью служба Power BI

Все операции REST API Power BI требуют входа. Проверка подлинности (кто выполняет запрос) и авторизация (то, что пользователь имеет разрешение на выполнение) управляется платформа удостоверений Майкрософт. В следующем примере используется командлет Подключение-PowerBIServiceAccount из модуля управления Power BI. Этот командлет поддерживает простой метод входа.

Пример запроса 1

Первый скрипт перенаправляет вас в браузер, чтобы завершить процесс входа. Учетные записи пользователей с поддержкой многофакторной проверки подлинности (MFA) могут использовать этот интерактивный поток проверки подлинности для входа.

Connect-PowerBIServiceAccount

Важно!

Пользователи без прав администратора Power BI не могут запускать примеры скриптов, приведенных в этой статье. Администраторы Power BI имеют разрешение на управление служба Power BI и получение метаданных на уровне клиента (например, данные журнала действий). Хотя использование проверки подлинности субъекта-службы не область для этих примеров, настоятельно рекомендуется настроить субъект-службу для готовых к рабочей среде сценариев, которые будут выполняться по расписанию.

Перед выполнением любого из следующих скриптов обязательно выполните вход.

Пример 2. Просмотр всех действий для пользователя в течение одного дня

Иногда необходимо проверка все действия, выполняемые конкретным пользователем в определенный день.

Совет

При извлечении данных из журнала действий с помощью командлета PowerShell каждый запрос может извлекать данные в течение одного дня (не более 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 один из способов использования символа backtick является символом продолжения строки. Мы использовали его для улучшения удобочитаемости скриптов в этой статье.

Совет

В скрипте каждая из переменных PowerShell коррелирует с обязательным или необязательным значением параметра в командлете Get-PowerBIActivityEvent. Например, значение, которое вы назначаете переменной $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: Сколько дней вы заинтересованы в проверка ing. Он выполняет цикл, работающий назад с текущего дня. Максимально допустимое значение — 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: Сколько дней вы заинтересованы в проверка ing. Он выполняет цикл, который работает назад с текущего дня. Максимально допустимое значение — 30 дней (так как самая ранняя дата, которую можно получить, составляет 30 дней до текущего дня).
  • $Activity1: имя операции для первого исследуемого действия. В этом примере выполняется поиск действий по созданию приложений Power BI.
  • $Activity2: имя второй операции. В этом примере выполняется поиск действий по обновлению приложения Power BI.
  • $Activity3: третье имя операции. В этом примере выполняется поиск действий по установке приложения Power BI.

Вы можете получать только события действий для одного действия одновременно. Таким образом, скрипт выполняет поиск каждой операции отдельно. Он объединяет результаты поиска в переменную с именем $FullResults, которая затем выводится на экран.

Внимание

Выполнение большого количества циклов значительно увеличивает вероятность регулирования API. Регулирование может произойти при превышении количества запросов, которые разрешено выполнять в течение заданного периода времени. Операция get Activity Events ограничена 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 используйте вместо этого операцию Get App Users в качестве операции Администратор 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 нет параметра, который позволяет указать рабочую область при проверка журнала действий (в предыдущих примерах в этой статье используются параметры 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: префикс для каждого имени файла. Так как один файл в день сохраняется, скрипт добавляет суффикс для указания данных, содержащихся в файле, и даты и времени извлечения данных. Например, если вы запустили сценарий в 9 утра (UTC) 25 апреля 2023 г. для извлечения данных о действиях 23 апреля 2023 г., имя файла будет: 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

Существует несколько преимуществ использования командлета Get-PowerBIActivityEvent PowerShell, а не операции REST API событий действия.

  • Командлет позволяет запрашивать один день действия при каждом вызове с помощью командлета. В то время как при прямом обмене данными с API можно запрашивать только один час на запрос API.
  • Командлет обрабатывает маркеры продолжения для вас. Если вы используете API напрямую, необходимо проверка маркер продолжения, чтобы определить, есть ли дополнительные результаты. Некоторые API должны использовать маркеры разбиения на страницы и продолжения по соображениям производительности при возврате большого объема данных. Они возвращают первый набор записей, а затем с маркером продолжения можно выполнить последующий вызов API для получения следующего набора записей. Вы продолжаете вызывать API до тех пор, пока маркер продолжения не будет возвращен. Использование маркера продолжения — это способ консолидации нескольких запросов API, чтобы объединить логический набор результатов. Пример использования маркера продолжения см. в разделе REST API событий действий.
  • Командлет обрабатывает срок действия маркера доступа Microsoft Entra (ранее известный как Azure Active Directory). После проверки подлинности срок действия маркера доступа истекает через один час (по умолчанию). В этом случае командлет автоматически запрашивает маркер обновления. Если вы взаимодействуете с API напрямую, необходимо запросить маркер обновления.

Дополнительные сведения см. в разделе "Выбор API" или командлетов PowerShell.

Примечание.

Пример ответа опущен, так как это выходные данные, похожие на ответы, показанные в предыдущих примерах.

Дополнительные сведения, связанные с этой статьей, проверка следующие ресурсы: