Power BI: Mitä raportteja meillä on? Mistä raporttiemme data tulee?

Millä raporteilla on lähteenä käytöstä poistuva SQL palvelin? Ketkä hallinnoivat näitä raportteja? Onko tähän valmista ratkaisua?

Tässä blogitekstissä käydään läpi yksi ratkaisu yllämainittuihin kysymyksiin tai esimerkiksi ratkaisu koko Power BI ympäristön automaattiseen dokumentointiin. Blogissa näytetään miten PowerShellillä saadaan organisaation kaikkien ryhmien (groups, workspace), niiden datamallien ja datalähteiden tiedot automaattisesti helppoon muotoon.

Oikeudet

Jos tarvitaan pääsy koko organisaation tietoihin, on oltava Power BI Admin oikeudet, mikä on mahdollista saada O365 admin portaalin kautta. Muussa tapauksessa omilla tunnuksilla pääsee käsiksi niihin tietoihin mihin omilla tunnuksilla on oikeudet.

(ohjeet admin oikeuksien saamiseksi: https://docs.microsoft.com/en-us/power-bi/service-admin-role)

PowerShell ISE ja asennus

Seuraavaksi tarvitaan PowerShell ISE ja vielä admin oikeuksilla. Tämä löytyy suoraan Windows 10 käyttöjärjestelmästä:

Lisäksi pitää asentaa Power BI moduuli PowerShelliin

Kirjoitetaan:

 Install-Module -Name MicrosoftPowerBIMgmt 

tekstikenttään, maalataan kyseinen teksti ja aja valinta (Run Selection)

Jos et käynnistänyt adminoikeuksilla PowerShelliä tulee jotain tämän näköistä:

Jos pyytää hyväksyntää asennukselle se toki annetaan:

Kysymys saattaa myös olla PowerShellin puolelle, jolloin pitää painaa y ja Enter.

Power BI rajapintojen käyttö

Seuraavaksi kirjaudutaan sisään komennolla:

 Login-PowerBI 

(Valitaan teksti ja painetaan, aja valinta)

Tämän ajamalla tulee tavallinen O365 kirjautumisikkuna, johon kirjaudutaan omalla/admin tunnuksella.

Jos kaikki meni hyvin, niin pitäisi näkyä kirjautumistiedot kyseisen tunnuksen ympäristöstä.

Kokeilumielessä voi ajaa(vastaavasti kuin edellä):

 Get-PowerBIWorkspace 

Saadaan taulukko työtiloista jokseenkin tämän näköisenä:

Hienoa nyt tiedämme kaikki organisaation työtilat, ja meillä on vastaus kysymykseen mitä työtiloja organisaatiossamme on.
Lisäksi jos haluamme tallentaa tuloksen muistiin ja näyttää tuloksen ja laskea työtilojen määrä onnistuu se ajamalla tämä koodi:

$items = Get-PowerBIWorkspace
$items
$items.Count

Vastaavat ohjeet:
https://powerbi.microsoft.com/en-us/blog/announcing-apis-and-powershell-cmdlets-for-power-bi-administrators/
https://www.youtube.com/watch?v=SQ7ufcRayYY

Miten saada kaikki hyödyllinen data helppoon muotoon?

Tässä kohtaa huomataan nopeasti, että listasta tuli melko pitkä. Lisäksi siitä puuttuu tietoja kuten esimerkiksi mitä datalähteitä työtilassa käytetään ja sitä on oikeastaan lähes mahdotonta hyödyntää millään järkevällä tavalla. Toistaiseksi ei ole olemassa komentoa, mikä hakisi kaikki tiedot mitkä meitä tässä kohtaa voisi kiinnostaa ja tekisi niistä kaunista listaa.

Eli teimme tästä valmiin ratkaisun!

Ohje: 

  1. Kopioi koko koodi PowerShelliin. (Koodi ohjeiden jälkeen)
  2. Muuta parametrikohdasta osoitetta niin että se osoittaa omalla koneella olevaan kansioon mihin haluat tallentaa datan.
  3. Valitse koko koodi ja aja se samoin kuin on edellisissä kohdissa tehty.
  4. Ajoin aikana ja sen jälkeen pitäisi näyttää tältä:
  5. Workspace tarkoittaa työtilaa. Merkin” /” jälkeen näkee kuinka monta on viellä jäljellä. RowNbr kertoo montako datariviä on haettu.
  6. Avaa CSV tiedosto esimerkiksi Power BI:llä kansiosta, jonka määrittelit kohdassa 2 ja selvitä helposti vastaukset otsikossa mainittuihin kysymyksiin.

Koodi

Ohessa on PowerShell koodi, mikä käy läpi kaikki työtilat, niiden datamallit ja datamallien lähteet, sekä kirjoittaa tiedot CSV tiedostoon.

 
#Parameters:
$CSV = “C:\Users\KristjanVaalberk\Desktop\AllGroupsDatasetsSources.csv” # location and name for the csv file

#Loop All workspaces, datasets, sources and save to CSV

“Start Get Datasources”
$CountRows = 0
$CountWorkspaces = 0
$workspaces = Get-PowerBIWorkspace -Scope Organization #All workspaces
$workspacesTotal = $workspaces.count
“Total workspaces :” + $workspacesTotal
$GroupDatasetSource = New-Object System.Collections.ArrayList
$workspaces | ForEach-Object -Process{ ## for every workspace/groups
$Workspace = $_
$CountWorkspaces++
“Workspace: ” + $CountWorkspaces + “/” + $workspacesTotal
$GroupDatasets = Get-PowerBIDataset -Scope Organization -Workspaceid $_.id ## get all datasets in groups/workspace and save to $GroupDatasets (array)
IF($GroupDatasets.count -eq 0) { #group has no datasets
$i2 = 0
Do { # Loop all users in group
$temp = “” | select “GroupId”, “GroupName”, “GroupDescription”,”GroupType”, “GroupState”, “GroupIsReadOnly”, “GroupIsOrphaned”, “GroupIsOnDedicatedCapacity”,
“GroupCapacityId”, “GroupUserPrincipalName”, “GroupAccessRight” , “Datasetid”, “Datasetname”, “DatasetaddRowsAPIEnabled”, “DatasetconfiguredBy”, “DatasetisRefreshable”, “DatasetisEffectiveIdentityRequired”,
“DatasetisEffectiveIdentityRolesRequired”, “DatasetisOnPremGatewayRequired” ,”SourceName”,”SourceConnectionString”,”SourceDatasourceType”,”SourceConnectionDetails”,
“SourceGatewayId”,”SourceDatasourceId”
$temp.GroupId = $Workspace.id
$temp.GroupName = $Workspace.Name
$temp.GroupDescription = $Workspace.Description
$temp.GroupType = $Workspace.Type
$temp.GroupState = $Workspace.State
$temp.GroupIsReadOnly = $Workspace.IsReadOnly
$temp.GroupIsOrphaned = $Workspace.IsOrphaned
$temp.GroupIsOnDedicatedCapacity = $Workspace.IsOnDedicatedCapacity
$temp.GroupCapacityId = $Workspace.CapacityId
IF($Workspace.users.AccessRight.count -eq 1) {
$temp.GroupAccessRight = $Workspace.users.AccessRight
$temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName
}
Elseif ($GroupDatasets.users -eq $null){
$temp.GroupAccessRight = ‘NotFound’
$temp.GroupUserPrincipalName = ‘NotFound’
}
Else {
$temp.GroupAccessRight = $Workspace.users.AccessRight[$i2]
$temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName[$i2]
}

$temp.Datasetid = ‘NotFound’
$temp.Datasetname = ‘NotFound’
$temp.DatasetaddRowsAPIEnabled = ‘NotFound’
$temp.DatasetconfiguredBy = ‘NotFound’
$temp.DatasetisRefreshable = ‘NotFound’
$temp.DatasetisEffectiveIdentityRequired = ‘NotFound’
$temp.DatasetisEffectiveIdentityRolesRequired = ‘NotFound’
$temp.DatasetisOnPremGatewayRequired = ‘NotFound’

$temp.SourceName = ‘NotFound’
$temp.SourceConnectionString = ‘NotFound’
$temp.SourceDatasourceType = ‘NotFound’
$temp.SourceConnectionDetails = ‘NotFound’
$temp.SourceGatewayId = ‘NotFound’
$temp.SourceDatasourceId = ‘NotFound’

$GroupDatasetSource.Add($temp) | Out-Null

$CountRows++
“RowNbr :” + $CountRows

$i2++

} While ($i2 -le $Workspace.users.AccessRight.count-1)

}

$GroupDatasets | ForEach-Object -Process{ #for all datasets
$Datasets = $_

$DatassetCount = $Datasets.count
$Datasets | ForEach-Object -Process{ #all sources in dataset
$Source = Get-PowerBIDatasource -DatasetId $_.id -ErrorAction SilentlyContinue

$SourceCount = $Source.count
$i = 0
Do {
$i2 = 0
Do { # Loop all users in group

$temp = “” | select “GroupId”, “GroupName”, “GroupDescription”,”GroupType”, “GroupState”, “GroupIsReadOnly”, “GroupIsOrphaned”, “GroupIsOnDedicatedCapacity”,
“GroupCapacityId” , “GroupUserPrincipalName”, “GroupAccessRight”, “Datasetid”, “Datasetname”, “DatasetaddRowsAPIEnabled”, “DatasetconfiguredBy”, “DatasetisRefreshable”, “DatasetisEffectiveIdentityRequired”,
“DatasetisEffectiveIdentityRolesRequired”, “DatasetisOnPremGatewayRequired” ,”SourceName”,”SourceConnectionString”,”SourceDatasourceType”,”SourceConnectionDetails”,
“SourceGatewayId”,”SourceDatasourceId”

$temp.GroupId = $Workspace.id
$temp.GroupName = $Workspace.Name
$temp.GroupDescription = $Workspace.Description
$temp.GroupType = $Workspace.Type
$temp.GroupState = $Workspace.State
$temp.GroupIsReadOnly = $Workspace.IsReadOnly
$temp.GroupIsOrphaned = $Workspace.IsOrphaned
$temp.GroupIsOnDedicatedCapacity = $Workspace.IsOnDedicatedCapacity
$temp.GroupCapacityId = $Workspace.CapacityId
IF($Workspace.users.AccessRight.count -eq 1) {
$temp.GroupAccessRight = $Workspace.users.AccessRight
$temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName
}
Elseif ($GroupDatasets.users -eq $null){
$temp.GroupAccessRight = ‘NotFound’
$temp.GroupUserPrincipalName = ‘NotFound’
}
Else {
$temp.GroupAccessRight = $Workspace.users.AccessRight[$i2]
$temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName[$i2]
}
$temp.Datasetid = $Datasets.id
$temp.Datasetname = $Datasets.name
$temp.DatasetaddRowsAPIEnabled = $Datasets.addRowsAPIEnable
$temp.DatasetconfiguredBy = $Datasets.configuredBy
$temp.DatasetisRefreshable = $Datasets.isRefreshable
$temp.DatasetisEffectiveIdentityRequired = $Datasets.isEffectiveIdentityRequired
$temp.DatasetisEffectiveIdentityRolesRequired = $Datasets.isEffectiveIdentityRolesRequired
$temp.DatasetisOnPremGatewayRequired = $Datasets.OnPremGatewayRequired
IF ($SourceCount -eq 0) {
$temp.SourceName = ‘NotFound’
$temp.SourceConnectionString = ‘NotFound’
$temp.SourceDatasourceType = ‘NotFound’
$temp.SourceConnectionDetails = ‘NotFound’
$temp.SourceGatewayId = ‘NotFound’
$temp.SourceDatasourceId = ‘NotFound’

}
Else{
$temp.SourceName = $Source[$i].name
$temp.SourceConnectionString = $Source[$i].ConnectionString
$temp.SourceDatasourceType = $Source[$i].DatasourceType
$temp.SourceConnectionDetails = $Source[$i].ConnectionDetails
$temp.SourceGatewayId = $Source[$i].GatewayId
$temp.SourceDatasourceId = $Source[$i].DatasourceId
}
$GroupDatasetSource.Add($temp) | Out-Null
$CountRows++
“RowsNbr :” + $CountRows
$i2++
} While ($i2 -le $Workspace.users.AccessRight.count-1)
$i++
} While ($i -le $SourceCount-1)

}
}

}

“Total datarows: “+ $CountRows
“Export to CSV: ” + $CSV
$GroupDatasetSource | Export-Csv $CSV
“All done”
 

Muita hyödyllisiä linkkejä:

Power BI Management module in the PowerShell Gallery https://www.powershellgallery.com/packages/MicrosoftPowerBIMgmt

Power BI cmdlets documentation https://docs.microsoft.com/en-us/powershell/power-bi/overview?view=powerbi-ps

Open Source repository for Power BI cmdlets on GitHub https://github.com/Microsoft/powerbi-powershell

Power BI SDK for .NET https://github.com/Microsoft/PowerBI-CSharp

Power BI REST API Reference https://docs.microsoft.com/en-us/rest/api/power-bi/

Quick reference for PowerShell cmdlets, REST APIs, and SDK for Power BI administration https://docs.microsoft.com/en-us/power-bi/service-admin-reference

Power BI Community site https://community.powerbi.com/