如何使用PowerBI API或Azure门户提取所有PowerBI用户和工作区访问?

时间:2019-02-15 04:38:41

标签: azure powerbi portal

Power BI的新功能。试图获取有权访问每个仪表板的用户的报告。任何指针都会有所帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用Get-PowerBIWorkspace中的Microsoft Power BI Cmdlets获取工作区列表,然后列出基础Office 365组的成员(除非您正在使用没有基础Office 365组的新预览工作区) )使用Get-UnifiedGroup cmdlet。要使用它,您需要Connect to Exchange Online PowerShell。然后枚举组,枚举当前组成员,并将其导出为CSV(或以所需方式处理结果)。如果您有权限,请提供-Scope Organization参数,或忽略该参数以获取工作区列表。

Import-Module MicrosoftPowerBIMgmt

$password = "xxxxxxxx" | ConvertTo-SecureString -asPlainText -Force
$username = "xxxxxxxx@example.com" 
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

Connect-PowerBIServiceAccount -Credential $credential

$Session = New-PSSession -ConfigurationName Microsoft.Exchange `
    -ConnectionUri https://outlook.office365.com/powershell-liveid/ `
    -Credential $credential `
    -Authentication Basic `
    -AllowRedirection

Import-PSSession $Session

$Groups = Get-PowerBIWorkspace #-Scope Organization
$Groups | ForEach-Object {
    $group = $_
    Get-UnifiedGroupLinks -Identity $group.Name -LinkType Members -ResultSize Unlimited | ForEach-Object {
        $member = $_
        New-Object -TypeName PSObject -Property @{
            Member = $member.Name
            Group = $group.Name
        }
    }
} | Export-CSV "D:\\PowerBIGroupMembers.csv" -NoTypeInformation -Encoding UTF8

Remove-PSSession $Session

Disconnect-PowerBIServiceAccount

答案 1 :(得分:1)

下面是我创建的脚本。首先更改您的PowerBI凭据的用户名和密码。该脚本收集结果,然后打开两个Out Grid窗口(工作区和工作区用户)。然后,您可以将网格结果复制/粘贴到excel中。这不会导出共享的报告和仪表板。

我安装了两个PBI powershell模块。我认为此脚本仅使用MicrosoftPowerBIMgmt。

检查是否具有PBI模块。

get-module -ListAvailable | where {$_.Name -like '*BI*'}

并检查可用的cmdlet。

get-command -module MicrosoftPowerBIMgmt.Admin | sort CommandType, name
get-command -module MicrosoftPowerBIMgmt.Capacities | sort CommandType, name
get-command -module MicrosoftPowerBIMgmt.Data | sort CommandType, name
get-command -module MicrosoftPowerBIMgmt.Profile | sort CommandType, name
get-command -module MicrosoftPowerBIMgmt.Reports | sort CommandType, name
get-command -module MicrosoftPowerBIMgmt.Workspaces | sort CommandType, name
get-command -module PowerBIPS | sort CommandType, name

PBI的工作空间和权限

#****************
#------------------------------------------------------
# --> PBI WORKSPACES & PERMISSIONS
#
# Export PBI results to grid for copy/paste to Excel table
# * All groups (Active/Deleted)
# * All workspaces (Active)
# * All workspace permissions
#
# RestAPI call for each workspace (Group Users) 
# * https://docs.microsoft.com/en-us/rest/api/power-bi/groups/getgroupusers
#
#------------------------------------------------------ 


#****************
#------------------------------------------------------
# --> PBI Connection
#------------------------------------------------------ 
Write-Host " PBI credentials ..." -ForegroundColor Yellow -BackgroundColor DarkGreen

## PBI credentials 

$password = "myPassword" | ConvertTo-SecureString -asPlainText -Force
$username = "myemail@domain.com" 
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

## PBI connect 

Connect-PowerBIServiceAccount -Credential $credential

# Login-PowerBI


#****************
#------------------------------------------------------
# --> Workspace info 
# 
# * Get-PowerBIWorkspace > "WARNING: Defaulted to show top 100 workspaces. Use -First & -Skip or -All to retrieve more results."
# * Grid exported for workspaces
#------------------------------------------------------ 
Write-Host " Workspace info ..." -ForegroundColor Yellow -BackgroundColor DarkGreen
    
## List all groups, Select ID desired for Variables section 
## PBIWorkspace properties values are NULL if Scope is not set to Organization 
# Get-PowerBIWorkspace -Scope Organization -Filter "tolower(name) eq 'BI Team POC - DEV'" 

# SET
$Groups = Get-PowerBIWorkspace -Scope Organization -All | SORT @{Expression="Type"; Descending=$True}, Name

$Groups_deleted = $Groups | SELECT Id, Name, Type, State | WHERE State -EQ 'Deleted'
$Groups = $Groups | SELECT Id, Name, Type, State | WHERE State -NE 'Deleted'
$GroupWorkspaces = $Groups | WHERE Type -eq 'Workspace' 

# PRINT
$Groups_deleted | Select Id, Name, Type, State | ft –auto 
$Groups | Select Id, Name, Type, State | ft –auto 
$GroupWorkspaces | Select Id, Name, Type | ft –auto 
Get-PowerBIWorkspace -Scope Organization -Name "BI Team Sandbox" | Select Id, Name, Type | ft –auto 

# OUT GRID
$GroupsWorkspaces | Select Id, Name, Type | Out-GridView 
$Groups | Select Id, Name, Type | Out-GridView
$Groups_deleted | Select Id, Name, Type, State | Out-GridView


#------------------------------------------------------ 
## LOOP FOLDERS ##################
# * RestAPI call for each workspace (Group Users) 
# * Grid exported for workspace user access
#------------------------------------------------------ 

# Clear variable before loop to reseat array data collector 
clear-variable -name WorkspaceUsers

Write-Host " Looping ..." -ForegroundColor Yellow -BackgroundColor DarkGreen

foreach ($GroupWorkspaceId in $GroupWorkspaces.Id) {

    $WorkspaceObject = Get-PowerBIWorkspace -Scope Organization -Id $GroupWorkspaceId
    $pbiURL = "https://api.powerbi.com/v1.0/myorg/groups/$GroupWorkspaceId/users"
    $WorkspaceObject | Select Id, Name, Type | ft –auto 

    Write-Host ($WorkspaceObject.Name +" | "+ $WorkspaceObject.Type)  -ForegroundColor White -BackgroundColor Blue
    Write-Host $GroupWorkspaceId -ForegroundColor White -BackgroundColor Blue
    Write-Host $pbiURL -ForegroundColor White -BackgroundColor Blue


#****************
#------------------------------------------------------
# --> 1. API Call for WORKSPACE USERS  
#------------------------------------------------------ 
    Write-Host " API Call ..." -ForegroundColor Yellow -BackgroundColor DarkGreen
     
    ## API call
    $resultJson = Invoke-PowerBIRestMethod –Url $pbiURL –Method GET 
    $resultObject = ConvertFrom-Json -InputObject $resultJson 

    ## Collect data fields for each loop
    $WorkspaceUsers += $resultObject.Value | 
    SELECT @{n='WorkspaceId';e={$GroupWorkspaceId}}, 
            @{n='Workspace';e={$WorkspaceObject.Name}}, 
            displayName, 
            emailAddress, 
            @{n='UserRole';e={$_.groupUserAccessRight}}, 
            @{n='Principle';e={$_.principalType}} |
        SELECT Workspace, displayName, UserRole, Principle, emailAddress | 
        SORT UserRole, displayName 
    
    ## Print loop results
    $WorkspaceUsers | ft -auto | Where{$_.WorkspaceId -eq $GroupWorkspaceId} 

    clear-variable -name resultJson
    clear-variable -name resultObject

}
## END LOOP  ##################
#------------------------------------------------------ 

## Export user access for all workspaces
    $WorkspaceUsers | SORT Workspace, UserRole, displayName | Out-GridView