31. ledna 2020

Power BI a PowerShell


Když jsem se zamýšlel o čem napsat další blog post, odpověď byla zřejmá. Nejlepší bude popsat to s čím se opět “trápím” v práci. Protože když to řeším já, tak pravděpodobně i někdo další. Slovy jednoho kolegy: “Co je účelem tohohle cvičení?” Proč Power BI a PowerShell?
Některá funkcionalita Power BI služby je nedostupná přes uživatelské rozhraní, ale je zatím dostupná přes programové API. Obvzláště pokud se jedná o správu služby, reportů, datasetů a tak dále.
Vývoj na této straně probíhá ve stylu napřed zpřístupnit funkcionalitu přes API, pak zjednodušit pro správce a uživatele přes PowerShell a pak možná někdy (pokud vůbec) se to dostane do UI (uživatelské rozhraní).
Na rovinu, PowerShell se učím a je to pro mě výstup mimo komfortní zónu. Nicméně v poslední době jsem potřeboval řešit například tyto úlohy.
Automatické přepnutí datasetů z jednoho serveru na druhý v době údržby a pak zpět (jde to ručně, ale u více reportů je to tak trochu opruz).
Získání logů o používání Power BI reportů přes celý tenant a nejen Workspace.
A když jsem se pídil po tom jak těchto úloh dosáhnout, byl jsem odkázán na PowerShell. Počáteční “ale fuj” jsem musel nahradit za “asi se to tedy budu muset naučit”
Kdo jste došli do stejné fáze, já jsem k učení základů využil následující kurz na Channel 9
Pro ty už PowerShellem trochu popsané, prvně je potřeba nainstalovat cmdlety pro správu Power BI. Dokumentaci najdete zde
Power BI Management modul nainstalujeme následovně
Install-Module -Name MicrosoftPowerBIMgmt
Jako příklad využití přidávám skript, který projde Power BI logy pro tenant (musíte být Power BI Admin). Interval hledání je od 1.11.2019 do včerejška. Ve smyčce projde datumy po jednom a zavolá
Get-PowerBIActivityEvents cmdlet (ten má omezení na data z jednoho dne, abysme tolik netýrali backend Power BI Service). Uloží aktivity typu “viewreport” do proměnné activities a následně uloží na disk jako json soubor. Logy poté můžete analyzovat klasicky v Power BI Desktopu.
Začátek skriptu
Cls
Login-PowerBI
$mindate = Get-Date "01/11/2019"
$maxdate = Get-Date
$maxdate = $maxdate.AddDays(-1)

for ($i =  $mindate; $i -lt $maxdate; $i=$i.AddDays(1))
{$i.ToShortDateString()
$date = $i.ToString("yyyy-MM-dd")
$filename = "D:\jiri_data\activities_" + $date + ".json"
$dateStart = $date + "T00:00:00"
$dateEnd = $date + "T23:59:59"
$activities = Get-PowerBIActivityEvents -StartDateTime $dateStart -EndDateTime $dateEnd -ActivityType viewreport -ResultType JsonString
$activities | Out-File -FilePath $filename
}

Konec skriptu
Pro všechny malicherné byrokratické hnidopichy tam venku (ano, mám na mysli i A.J.Rimmera), vím že by se to dalo zapsat jednoduššeji a úsporněji, to není nic nového :)
Má to ale i druhou vadu na kráse, funkční. Login-PowerBI cmdlet vyhodí přihlašovací okénko pro přihlášení do služby. To značně omezuje automatizaci přes SQL server agenta. Takže aktuálně se trápím opět mimo svou komfortní zónu s registrací Power BI app a narážím na nedostatečná práva v rámci Azure portálu.
Kdo máte tohle prokopnuté a byli byste ochotni se podělit o řešení, napište mi prosím email. Díky :)
Závěr
Tohle je jen jeden z případů využití PowerShellu v kombinaci s Power BI službou. Odpověď “použij PowerShell, tam to jde” jsem slyšel/četl od produktového týmu víckrát, než je mi milé. Přece jen já jsem převážně BI architekt a vývojář a ne správce služeb. Pokud Vám skript nefunguje, můžu Vás ujistit, že mě ano. Možná nemáte dostatečná oprávnění na Power BI službu, může to být i něco jiného.

2 komentáře:

  1. Možná by pomohlo uložit heslo PowerBI admina někam do adresáře v bin, jak je níže samozřejmě s omezeným přístupem.
    $path = 'C:\Temp'
    $passwd = Read-Host "Enter password" -AsSecureString
    $encpwd = ConvertFrom-SecureString $passwd
    $encpwd > $path\password.bin

    Nísledně zavolat script s tímto loginem a heslem a třeba se okno už nezobrazí
    $encpwd = Get-Content $path\password.bin
    $passwd = ConvertTo-SecureString $encpwd
    $cred = new-object System.Management.Automation.PSCredential 'domena\power_bi_admin',$passwd
    Start-Process PowerShell -Cred $cred -ArgumentList '-noexit','-File','C:\Temp\muj_script.ps1'

    OdpovědětVymazat
  2. Díky za tip Jiří. Vyzkouším :)

    OdpovědětVymazat