Search code examples
azure-devopspowerbipowerbi-datasource

How to update Azure SQL datasource credentials of PowerBI dataset programmatically?


I have an Azure Devops Process which uses a Service Principle to deploy a Power BI report from a .pbix file and updates the data source to point at the production Azure SQL server.

The outcome is that the report and dataset are deployed and the connection is updated, however the CREDENTIALS are blank (Username and Password), so in order to make it usable, someone has to log on to Power BI service, open the Dataset and update the credentials, which means there is a manual step involved in our CI/CD process.

I need help with updating the source credentials for the new data source via code so that this manual process is not needed

snippet of powerbi logging page

Any suggestion will be of great help. Thank You.


Solution

  • Here is a sample PowerShell script, using Microsoft Power BI Cmdlets, which will patch the credentials of the dataset and commented at the end are few rows, which will refresh the dataset after that (uncomment them if needed). Just replace the x-es at the top with the actual values (workspace and dataset name, application ID, etc.).

    <#
    
    Patch the credentials of a published report/dataset, so it can be refreshed.
    
    #>
    
    # Fill these ###################################################
    $tenantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # Get from Azure AD -> Properties (https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Properties)
    $applictionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # Get Application (client) ID from Azure AD -> App registrations (https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps)
    $applicationSecret = "xxxxxxxxxxxxxxxx" # Create it from application's "Certificates & secrets" section
    $workspaceName = "xxxxxxxx"
    $reportName = "xxxxxxxx" # Actually it is dataset name
    $sqlUserName = "xxxxxxxx"
    $sqlUserPassword = "xxxxxxxxxx"
    ################################################################
    
    Import-Module MicrosoftPowerBIMgmt
    
    $SecuredApplicationSecret = ConvertTo-SecureString -String $applicationSecret -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($applictionId, $SecuredApplicationSecret)
    
    $sp = Connect-PowerBIServiceAccount -ServicePrincipal -Tenant $tenantId -Credential $credential
    
    $workspace = Get-PowerBIWorkspace -Name $workspaceName
    
    $dataset = Get-PowerBIDataset -WorkspaceId $workspace.Id -Name $reportName
    
    $workspaceId = $workspace.Id
    $datasetId = $dataset.Id
    
    $datasources = Get-PowerBIDatasource -WorkspaceId $workspaceId -DatasetId $datasetId
    
    foreach($datasource in $datasources) {
      
      $gatewayId = $datasource.gatewayId
      $datasourceId = $datasource.datasourceId
      $datasourePatchUrl = "gateways/$gatewayId/datasources/$datasourceId"
    
      Write-Host "Patching credentials for $datasourceId"
    
      # HTTP request body to patch datasource credentials
      $userNameJson = "{""name"":""username"",""value"":""$sqlUserName""}"
      $passwordJson = "{""name"":""password"",""value"":""$sqlUserPassword""}"
    
      $patchBody = @{
        "credentialDetails" = @{
          "credentials" = "{""credentialData"":[ $userNameJson, $passwordJson ]}"
          "credentialType" = "Basic"
          "encryptedConnection" =  "NotEncrypted"
          "encryptionAlgorithm" = "None"
          "privacyLevel" = "Organizational"
        }
      }
    
      # Convert body contents to JSON
      $patchBodyJson = ConvertTo-Json -InputObject $patchBody -Depth 6 -Compress
    
      # Execute PATCH operation to set datasource credentials
      Invoke-PowerBIRestMethod -Method Patch -Url $datasourePatchUrl -Body $patchBodyJson
    }
    
    #$datasetRefreshUrl = "groups/$workspaceId/datasets/$datasetId/refreshes"
    #Write-Host "Refreshing..."
    #Invoke-PowerBIRestMethod -Method Post -Url $datasetRefreshUrl