Functions/Backup-BsgPbiTenant.ps1
<#
.SYNOPSIS Backup a Power BI tenant to a local directory. .DESCRIPTION The workspaces, objects and data from a Power BI Service tenant are saved to files in a local directory. .PARAMETER Path The path to the root folder, where the temporary files will be saved. Subfolders will be created automatically. .EXAMPLE # Backup Tenant Backup-BsgPbiTenant -Path "C:\temp\BSG PBI Administration" .INPUTS .OUTPUTS .NOTES This script uses the Power BI Management module for Windows PowerShell. If this module is not installed, install it by using the command 'Install-Module -Name MicrosoftPowerBIMgmt -Scope CurrentUser'. #> function Backup-BsgPbiTenant{ param ( [Parameter(Mandatory=$true)][string]$Path ) try { Write-Host Write-Host Write-PSFHostColor -Level Host -DefaultColor white -String "---------------------------------------------------------------------------------------------" Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String " <c='green'>Backup tenant...</c>" Write-Host Write-PSFHostColor -Level Host -DefaultColor white -String "---------------------------------------------------------------------------------------------" Write-Host Write-Host # Login and confirm tenant Write-PSFHostColor -Level Host -DefaultColor gray -String "Choose the tenant and user to start the backup..." Write-PSFHostColor -Level Host -DefaultColor gray -String "You need to be a <c='white'>Power BI Administrator</c> to backup the tenant." try{ Logout-PowerBI $PbiLogin = Login-PowerBI -ErrorAction Stop } catch{ throw "Error trying to connect to Power BI tenant." } $TenantId = $PbiLogin.TenantId $UserName = $PbiLogin.UserName Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String "You are logged in as user <c='white'>$userName</c> in tenant <c='white'>$TenantId</c>." Write-PSFHostColor -Level Host -DefaultColor gray -String "<c='white'>Would you like to start the backup? [y/n]: </c>" $confirmTenant = Read-Host Write-Host if ($confirmTenant -eq 'y'){ # continue... } else{ Write-PSFHostColor -Level Host -DefaultColor gray -String "Backup stopped." Exit } # Define path to workspaces $Path_Backup = Join-Path -Path $Path -ChildPath "Backup" $Path_Workspaces = Join-Path -Path $Path_Backup -ChildPath "Workspaces" $Path_Gateways = Join-Path -Path $Path_Backup -ChildPath "Gateways" # === # Delete old workspace backups if exists? # = if (Test-Path $Path_Workspaces){ Write-Warning "A workspace backup already exists." Write-PSFHostColor -Level Host -DefaultColor gray -String "Location: <c='white'>$Path_Workspaces</c>" Write-PSFHostColor -Level Host -DefaultColor gray -String "It is recommended to delete old backups to have a clean backup." Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String "<c='white'>Would you like to delete the old workspace backups? [y/n]: </c>" $confirmation = Read-Host Write-Host if ($confirmation -eq 'y'){ Remove-Item -Path $Path_Workspaces -Force -Recurse } else{ Write-PSFHostColor -Level Host -DefaultColor gray -String "Backup stopped." Exit } } # === # Delete old gateway backups if exists? # = if (Test-Path $Path_Gateways){ Write-Warning "A gateway backup already exists." Write-PSFHostColor -Level Host -DefaultColor gray -String "Location: <c='white'>$Path_Gateways</c>" Write-PSFHostColor -Level Host -DefaultColor gray -String "It is recommended to delete old backups to have a clean backup." Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String "<c='white'>Would you like to delete the old gateway backups? [y/n]</c>." $confirmation = Read-Host Write-Host if ($confirmation -eq 'y'){ Remove-Item -Path $Path_Gateways -Force -Recurse } else{ Write-PSFHostColor -Level Host -DefaultColor gray -String "Backup stopped." Exit } } # Define base URLs for API requests $RequestUrlBase = "https://api.powerbi.com/v1.0/myorg" # === # Get gateways # = try{ $RequestUrl = "$RequestUrlBase/gateways" $Source_Gateways = Invoke-PowerBIRestMethod -Url $RequestUrl -Method Get | ConvertFrom-Json } catch{ throw "Error after calling request URL: `"$RequestUrl`"." } # === # Export every gateway # = foreach ($Gateway in $Source_Gateways.value) { $Source_GatewayId = $Gateway.id Export-BsgPbiGateway -Source_GatewayId $Source_GatewayId -Path $Path } # === # Get workspaces (API-Request) # = try{ $RequestUrl = "$RequestUrlBase/groups" $Source_Workspaces = Invoke-PowerBIRestMethod -Url $RequestUrl -Method Get | ConvertFrom-Json } catch{ throw "Error after calling request URL: `"$RequestUrl`"." } # === # Backup every workspace # = foreach ($Workspace in $Source_Workspaces.value) { $Source_WorkspaceName = $Workspace.name Backup-BsgPbiWorkspace -Source_WorkspaceName $Source_WorkspaceName -Path $Path -PbiConnection $PbiLogin } Write-Host Write-Host Write-PSFHostColor -Level Host -DefaultColor white -String "---------------------------------------------------------------------------------------------" Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String " <c='green'>Tenant backup finished.</c>" Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String " Location: <c='white'>$Path</c>" Write-Host Write-PSFHostColor -Level Host -DefaultColor gray -String " Developed by <c='white'>BSGroup Data Analytics AG</c>" Write-PSFHostColor -Level Host -DefaultColor white -String "---------------------------------------------------------------------------------------------" Write-Host Write-Host } catch{ Write-Host Stop-PSFFunction -Message "Failed to backup the tenant." -EnableException $False -Errorrecord $_ } } |