Power BI 활동 로그에 액세스
이 문서에서는 Power BI 활동 로그원본 데이터에 액세스하고 분석해야 하는 패브릭 관리자를 대상으로 합니다. Power BI 관리 모듈에서 Get-PowerBIActivityEvent cmdlet을 사용하여 Power BI 활동을 프로그래밍 방식으로 검색하는 데 중점을 둡니다. 최대 4주간의 역사를 사용할 수 있습니다. 이 cmdlet은 관리자 API인 활동 이벤트 가져오기 Power BI REST API 작업을 사용합니다. PowerShell cmdlet은 기본 API 위에 추상화 계층을 추가합니다. 따라서 PowerShell cmdlet은 Power BI 활동 로그에 대한 액세스를 간소화합니다.
Power BI 활동을 검색하는 다른 수동 방법 및 프로그래밍 방법이 있습니다. 자세한 내용은 사용자 활동 데이터에 액세스를 참조하세요.
Power BI 활동 로그 분석은 거버넌스, 규정 준수, 채택 노력 추적에 매우 중요합니다. Power BI 활동 로그에 대한 자세한 내용은 Power BI에서 사용자 활동 추적을 참조하세요.
팁
테넌트 수준 감사 문서를 자세히 검토하는 것이 좋습니다. 이 문서에서는 엔드투엔드 감사 솔루션을 구축할 때 고려해야 할 계획, 주요 의사 결정, 필수 조건, 주요 솔루션 개발 활동을 설명합니다.
사용 가능한 예제
이 문서의 목표는 시작하는 데 도움이 되는 예제를 제공하는 것입니다. 예제에는 Power BI 관리 PowerShell 모듈을 사용하여 활동 로그에서 데이터를 검색하는 스크립트가 포함되어 있습니다.
Warning
스크립트는 교육 목적으로만 사용되므로 프로덕션 준비가 되어 있지 않습니다. 그러나 로깅, 오류 처리, 경고, 코드 재사용 및 모듈화를 위한 리팩터링을 위한 논리를 추가하여 프로덕션 목적에 맞게 스크립트를 조정할 수 있습니다.
학습을 위한 예제이므로 단순하지만 실제 상황에 적용 가능합니다. 모든 예제를 검토하여 약간 다른 기법이 어떻게 적용되는지 이해하는 것이 좋습니다. 필요한 활동 데이터의 형식을 파악한 후에는 여러 기법을 조합하여 요구 사항에 가장 적합한 스크립트를 만들 수 있습니다.
이 문서에는 다음 예제가 포함되어 있습니다.
예제 이름 | 활동 데이터 형식 |
---|---|
Power BI 서비스로 인증 | 해당 없음 |
사용자의 하루 동안의 모든 활동 보기 | 모두 |
N일 동안의 활동 보기 | 보고서 공유(링크 또는 직접 액세스) |
N일 동안의 세 가지 활동 보기 | 앱 만들기, 앱 업데이트, 앱 설치 |
하루 동안의 작업 영역에 대한 모든 활동 보기 | 모두 |
이전 N일 동안의 모든 활동 내보내기 | 모두 |
편의상 대부분의 예제에서는 결과를 화면에 출력합니다. 예를 들어 Visual Studio Code에서 데이터는 메모리에 데이터 버퍼 집합을 보유하는 터미널 패널로 출력됩니다.
대부분의 예제는 원시 JSON 데이터를 검색합니다. 원시 JSON 데이터로 작업하면 많은 이점이 있습니다.
- 각 활동 이벤트에 사용할 수 있는 모든 정보가 반환됩니다. 이는 어떤 데이터가 사용 가능한지 파악하는 데 도움이 됩니다. API 응답의 내용은 실제 활동 이벤트에 따라 다릅니다. 예를 들어 CreateApp 이벤트에 사용할 수 있는 데이터는 ViewReport 이벤트와 다릅니다.
- Power BI가 시간이 지나면서 발전함에 따라 활동 로그에서 사용할 수 있는 데이터가 변경되므로 API 응답도 변경될 것으로 예상할 수 있습니다. 이렇게 하면 새로 도입되는 데이터가 누락되지 않습니다. 또한 프로세스가 변경에 더 탄력적으로 대응하고 실패할 가능성도 줄어듭니다.
- API 응답의 세부 정보는 Power BI 상용 클라우드와 국가/지역 클라우드에 따라 다를 수 있습니다.
- 이 프로세스에 참여하는 다양한 팀 멤버(예: 데이터 엔지니어)가 있는 경우 데이터를 추출하는 초기 프로세스를 간소화하면 여러 팀이 더 쉽게 협력할 수 있습니다.
팁
데이터를 추출하는 스크립트는 가능한 한 간단하게 유지하는 것이 좋습니다. 따라서 활동 로그 데이터를 추출할 때 구문 분석, 필터링 또는 서식을 지정하지 마세요. 이 접근 방식은 데이터 추출, 로드, 변환에 대한 별도의 단계가 있는 ELT 방법론을 사용합니다. 이 문서에서는 데이터 추출과 관련된 첫 번째 단계에만 중점을 둡니다.
요구 사항
예제 스크립트를 사용하려면 다음 요구 사항을 충족해야 합니다.
- PowerShell 클라이언트 도구: PowerShell 명령을 실행하기 위해 원하는 도구를 사용합니다. 모든 예제는 PowerShell 7과 함께 Visual Studio Code용 PowerShell 확장을 사용하여 테스트되었습니다. 클라이언트 도구 및 PowerShell 버전에 대한 자세한 내용은 테넌트 수준 감사를 참조하세요.
- Power BI 관리 모듈: 모든 Power BI PowerShell 모듈설치합니다. 이전에 설치한 경우 최신 게시 버전을 사용하도록 모듈을 업데이트하는 것이 좋습니다.
- Fabric 관리자 역할: 예제 스크립트는 대화형 인증 흐름을 사용하도록 설계되었습니다. 따라서 PowerShell 예제 스크립트를 실행하는 사용자가 Power BI REST API를 사용하려면 로그인해야 합니다. 활동 로그 데이터를 검색하려면 인증 사용자가 Fabric 관리자 역할에 속해야 합니다(활동 이벤트 검색은 관리자 API수행되므로). 서비스 주체 인증은 이러한 학습 예제의 범위를 벗어납니다.
이 문서의 나머지 부분에는 활동 로그 데이터를 검색하는 다양한 방법을 보여 주는 샘플 스크립트가 포함되어 있습니다.
예제 1: Power BI 서비스로 인증
모든 Power BI REST API 작업을 수행하려면 로그인해야 합니다. 인증(요청하는 사람) 및 권한 부여(사용자가 수행할 수 있는 권한)은 Microsoft ID 플랫폼에서 관리됩니다. 다음 예제에서는 Power BI 관리 모듈의 Connect-PowerBIServiceAccount cmdlet을 사용합니다. 이 cmdlet은 간단한 로그인 방법을 지원합니다.
예제 요청 1
첫 번째 스크립트는 로그인 프로세스를 완료하기 위해 브라우저로 리디렉션합니다. MFA(다단계 인증)를 사용하는 사용자 계정은 이 대화형 인증 흐름을 사용하여 로그인할 수 있습니다.
Connect-PowerBIServiceAccount
Important
패브릭 관리자 권한이 없는 사용자는 이 문서의 다음 샘플 스크립트를 실행할 수 없습니다. Fabric 관리자는 Power BI 서비스를 관리하고 테넌트 전체 메타데이터(예: 활동 로그 데이터)를 검색할 수 있는 권한이. 서비스 주체 인증 사용은 이 예제의 범위를 벗어나지만 일정에 따라 실행되는 프로덕션이 준비된 무인 스크립트에 대해 서비스 주체를 설정하는 것이 좋습니다.
다음 스크립트를 실행하기 전에 로그인해야 합니다.
예제 2: 사용자의 하루 동안의 모든 활동 보기
특정 사용자가 특정 날짜에 수행한 모든 활동을 확인해야 하는 경우가 있습니다.
팁
PowerShell cmdlet을 사용하여 활동 로그에서 데이터를 추출하는 경우 각 요청은 하루(최대 24시간) 동안의 데이터를 추출할 수 있습니다. 따라서 이 예제의 목표는 하루 동안 한 명의 사용자 확인부터 시작하는 것입니다. 이 문서의 뒷부분에는 반복을 사용하여 며칠 동안 데이터를 내보내는 방법을 보여 주는 다른 예제가 있습니다.
예제 요청 2
이 스크립트는 스크립트를 더 쉽게 재사용할 수 있도록 두 개의 PowerShell 변수를 선언합니다.
-
$UserEmailAddr
: 관심 있는 사용자의 메일 주소입니다. -
$ActivityDate
: 관심 있는 날짜입니다. 형식은 YYYY-MM-DD(ISO 8601 형식)입니다. 현재 날짜보다 28일 이전의 날짜는 요청할 수 없습니다.
#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일 동안의 활동 보기
때로는 한 가지 특정 유형의 활동을 며칠 동안 조사하고 싶을 수도 있습니다. 이 예제에서는 항목별 보고서 공유 활동을 검색하는 방법을 보여 줍니다. 반복을 사용하여 이전 7일 동안의 활동을 검색합니다.
예제 요청 3
스크립트는 다음 두 개의 변수를 선언합니다.
-
$ActivityType
: 조사 중인 활동에 대한 작업 이름입니다. -
$NbrOfDaysToCheck
: 확인하려는 일수입니다. 현재 날짜부터 역방향으로 반복을 수행합니다. 허용되는 최대값은 28일입니다(검색할 수 있는 가장 빠른 날짜는 현재 날짜 28일 이전이기 때문).
#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일 동안의 세 가지 활동 보기
때로는 여러 관련 활동을 조사하고 싶을 수도 있습니다. 이 예제에서는 지난 7일 동안의 세 가지 특정 활동을 검색하는 방법을 보여 줍니다. 앱 만들기, 앱 업데이트, 앱 설치 등 Power BI 앱과 관련된 활동에 중점을 둡니다.
예제 요청 4
스크립트는 다음 변수를 선언합니다.
-
$NbrOfDaysToCheck
: 확인하려는 일수입니다. 현재 날짜부터 역방향으로 작동하는 반복을 수행합니다. 허용되는 최대값은 28일입니다(검색할 수 있는 가장 빠른 날짜는 현재 날짜 28일 이전이기 때문). -
$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 앱을 설치했음을 보여 줍니다.
Warning
응답에는 수정된 사용자 권한만 포함되어 있습니다. 예를 들어 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입니다. 현재 날짜보다 28일 이전의 날짜는 요청할 수 없습니다. -
$WorkspaceName
: 관심 있는 작업 영역의 이름입니다.
스크립트는 결과를 $Results
변수에 저장합니다. 그런 다음 결과를 구문 분석할 수 있도록 JSON 데이터를 개체로 변환합니다. 그런 다음 결과를 필터링하여 5개의 특정 열을 검색합니다.
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 외부에서 데이터로 작업할 수 있도록 모든 활동 데이터를 파일로 내보내고 싶을 수도 있습니다. 이 예제에서는 최대 28일 동안 모든 사용자의 모든 활동을 검색합니다. 하루에 하나의 JSON 파일로 데이터를 내보냅니다.
Important
활동 로그 데이터는 최대 28일 동안 사용할 수 있습니다. 기록 분석을 수행할 수 있도록 데이터를 내보내고 유지하는 것이 중요합니다. 현재 활동 로그 데이터를 내보내고 저장하지 않는 경우 이를 우선적으로 수행하는 것이 좋습니다.
예제 요청 6
스크립트는 며칠 동안의 모든 활동을 검색합니다. 이 스크립트에서는 세 가지 변수를 선언합니다.
-
$NbrDaysDaysToExtract
: 내보내기에 관심이 있는 일수입니다. 전날부터 역방향으로 반복을 수행합니다. 허용되는 최대값은 28일입니다(검색할 수 있는 가장 빠른 날짜는 현재 날짜 28일 이전이기 때문). -
$ExportFileLocation
: 파일을 저장하려는 폴더 경로입니다. 스크립트를 실행하기 전에 폴더가 있어야 합니다. 백슬래시(\) 문자는 런타임에 자동으로 추가되므로 폴더 경로의 끝에 포함하지 마세요. 원시 데이터 파일을 저장하려면 별도의 폴더를 사용하는 것이 좋습니다. -
$ExportFileName
: 각 파일 이름의 접두사입니다. 하루에 하나의 파일이 저장되므로 스크립트는 파일에 포함된 데이터와 데이터를 검색한 날짜 및 시간을 나타내는 접미사를 추가합니다. 예를 들어 2023년 4월 25일 오전 9시(UTC)에 스크립트를 실행하여 2023년 4월 23일의 활동 데이터를 추출한 경우 파일 이름은 PBIActivityEvents-20230423-202304250900입니다. 파일이 저장된 폴더 구조가 유용하긴 하지만, 각 파일 이름은 완전히 자체적으로 설명할 수 있어야 합니다.
현재 날짜로부터 최소 하루 전의 데이터를 추출하는 것이 좋습니다. 이렇게 하면 하루의 일부 이벤트만 검색하는 것을 피할 수 있으며, 각 내보내기 파일에 24시간의 전체 데이터가 포함되어 있다고 확신할 수 있습니다.
스크립트는 전날까지 최대 28일의 데이터를 수집합니다. 감사된 이벤트의 타임스탬프는 항상 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을 사용하면 호출할 때마다 하루 동안의 활동을 요청할 수 있습니다. 반면 API와 직접 통신하는 경우에는 API 요청당 1시간만 요청할 수 있습니다.
- cmdlet은 연속 토큰을 자동으로 처리합니다. API를 직접 사용하는 경우 연속 토큰을 확인하여 앞으로 더 많은 결과가 있는지 확인해야 합니다. 일부 API는 많은 양의 데이터를 반환할 때 성능상의 이유로 페이지 매김 및 연속 토큰을 사용해야 합니다. 첫 번째 레코드 집합을 반환한 다음 연속 토큰을 사용하여 후속 API 호출을 수행하고 다음 레코드 집합을 검색할 수 있습니다. 연속 토큰이 반환되지 않을 때까지 API를 계속 호출합니다. 연속 토큰 사용은 논리적 결과 집합을 통합할 수 있도록 여러 API 요청을 통합하는 방법입니다. 연속 토큰 사용의 예제는 활동 이벤트 REST API를 참조하세요.
- cmdlet은 Microsoft Entra ID 액세스 토큰 만료를 처리합니다. 인증을 받으면 액세스 토큰은 기본적으로 1시간 후에 만료됩니다. 이 경우 cmdlet은 자동으로 새로 고침 토큰을 요청합니다. API와 직접 통신하는 경우 새로 고침 토큰을 요청해야 합니다.
자세한 내용은 API 또는 PowerShell cmdlet 선택을 참조하세요.
참고 항목
샘플 응답은 이전 예제에 표시된 응답과 유사한 출력이므로 생략되었습니다.
관련 콘텐츠
이 문서와 관련된 보다 자세한 내용을 알아보려면 다음 리소스를 참조하세요.
- Power BI에서 사용자 활동 추적
- Power BI 구현 계획: 테넌트 수준 감사
- Fabric 채택 로드맵: 감사 및 모니터링
- 궁금한 점이 더 있나요? 패브릭 커뮤니티에 질문해 보세요
- 제안 사항은? 패브릭 개선을 위한 아이디어 제안