Olá pessoal,
Recentemente precisei fazer um script para publicar relatorios no Power BI e uma das tarefas que precisei fazer foi gerar um Embed Token via rest para publica-lo como parte de outro componente web. Como meu tempo era curto pesquisei na galeria de modulos do powershell se havia algum modulo com as funcionalidades basicas que eu precisava e me deparei com este modulo: MicrosoftPowerBIMgmt.
Para seguir com os passos abaixo, voce deverá ter seu Power BI configurado com seu Azure AD, permitindo autenticação via Service Principal e criar um service principal no seu Azure AD com acesso ao relatório ou dashboard.
Primeiro precisamos nos autenticar com on Power BI com o service principal, lembre-se de declarar as variaveis com o TenantId, ApplicationId e clientsecret:
$PowerBIServiceAccount = @{
ServicePrincipal = $True
Credential = [pscredential]::new($ApplicationId, (ConvertTo-SecureString -String $clientsecret -AsPlainText -Force))
Tenant = $TenantId
ErrorAction = 'Stop'
}
Connect-PowerBIServiceAccount @PowerBIServiceAccount
Em seguida podemos listar a Workspace e o Report dentro dela que queremos gerar o token, neste exemplo o relatório se chama DevTestReport:
$Workspace = Get-PowerBIWorkspace
$Report = Get-PowerBIReport -WorkspaceId $Workspace.Id -Name 'DevTestReport'
Por fim podemos gerar o token, no corpo informando o nivel de acesso e as Identidades com acesso a ele, no exemplo abaixo temos uma Array com 5 nomes de usuário e estou utilizando o Get-Random para selecionar um aleatoriamente. Podemos também informar Roles se houver alguma e qual o DatasetId do report. O output da chamada esta em formato Json então devemos converte-lo para objeto novamente e o token estará presente na propriedade token.
$PowerBIRestMethod = @{
Url = 'https://api.powerbi.com/v1.0/myorg/groups/{0}/reports/{1}/GenerateToken' -f $Workspace.Id, $Report.Id
Method = 'Post'
Body = @{
accessLevel = 'View'
Identities = @(
@{
username = @('username1', 'username2', 'username3', 'username4', 'username5') | Get-Random
roles = @(
'Role'
)
datasets = @(
'{0}' -f $Report.DatasetId
)
}
)
} | Convertto-Json -Depth 3
}
$response = Invoke-PowerBIRestMethod @PowerBIRestMethod | ConvertFrom-Json
$response.token
Este token pode ser utilizado dentro de uma aplicação web para embedar o report dentro dela.
Ao final podemos desconectar da sessão do Power BI com o seguinte comando:
Disconnect-PowerBIServiceAccount
Script completo:
$PowerBIServiceAccount = @{
ServicePrincipal = $True
Credential = [pscredential]::new($ApplicationId, (ConvertTo-SecureString -String $clientsecret -AsPlainText -Force))
Tenant = $TenantId
ErrorAction = 'Stop'
}
Connect-PowerBIServiceAccount @PowerBIServiceAccount
$Workspace = Get-PowerBIWorkspace
$Report = Get-PowerBIReport -WorkspaceId $Workspace.Id -Name 'DevTestReport'
$PowerBIRestMethod = @{
Url = 'https://api.powerbi.com/v1.0/myorg/groups/{0}/reports/{1}/GenerateToken' -f $Workspace.Id, $Report.Id
Method = 'Post'
Body = @{
accessLevel = 'View'
Identities = @(
@{
username = @('username1', 'username2', 'username3', 'username4', 'username5') | Get-Random
roles = @(
'Role'
)
datasets = @(
'{0}' -f $Report.DatasetId
)
}
)
} | Convertto-Json -Depth 3
}
$response = Invoke-PowerBIRestMethod @PowerBIRestMethod | ConvertFrom-Json
$response.token
Disconnect-PowerBIServiceAccount
Dúvidas? Sugestões? Comente!
Até a próxima!