Troubleshooting “Service Unavailable” and URL Reservations in Power BI Report Server

Troubleshooting “Service Unavailable” and URL Reservations in Power BI Report Server

Running into a “Service Unavailable” error when accessing your Power BI Report Server? You’re not alone. This issue can be frustrating, especially when everything else seems to be configured correctly.

One common cause is incomplete URL reservations in http.sys. This is especially relevant if your Report Server is set up to respond to multiple addresses, like in a scale-out deployment or an Availability Group setup (see my previous post: Power BI Report Server: Managing Multi-Homed URLs in an Availability Group Setup – New Row).

What’s Going Wrong?

Power BI Report Server relies on URL reservations to bind its endpoints. If any of these are missing, the server might not respond correctly—even if the configuration file looks fine.

Required URL Reservations

For each hostname your Report Server should respond to, the following paths must be registered in http.sys:

  • /PowerBI
  • /wopi
  • /Reports
  • /ReportServer

These reservations must be made using the correct SDDL string and service account:

  • Account: NT SERVICE\PowerBIReportServer
  • SDDL: S-1-5-80-1730998386-2757299892-37364343-1607169425-3512908663

You can find official information from Microsoft here.

Digging Deeper: Check the Log Files

If you’re still stuck, head over to the log directory:

C:\Program Files\Microsoft Power BI Report Server\PBIRS\LogFiles\

Open the latest RSPowerBI_yyyy_mm_dd_hh_mm_ss.log file and look for entries like this:

Could not start PBIX
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.Net.HttpListenerException: Access is denied

This error typically means the Report Server tried to bind to a URL that wasn’t properly reserved in http.sys. The “Access is denied” part is a strong hint that the required permissions or bindings are missing.

The Fix: PowerShell to the Rescue

To make life easier, I’ve written a PowerShell script that checks all required URL reservations for a list of hostnames and adds any missing ones automatically. Just populate the $hostnames variable with all the addresses your Report Server should respond to.

This script ensures your server is properly registered and avoids those annoying “Service Unavailable” errors. You need to start PowerShell as an administrator in order to run it successfully.

$hostnames = @(
    "reportserver1",
    "reportserver2",
    "sqlag01"
)

foreach ($hostname in $hostnames) {
    echo $hostname
    $urlaclReportServer = netsh http show urlacl | Select-String -Pattern "https://$hostname/ReportServer"
    $urlaclReports = netsh http show urlacl | Select-String -Pattern "https://$hostname/Reports"
    $urlaclPowerBI = netsh http show urlacl | Select-String -Pattern "https://$hostname/PowerBI"
    $urlaclWopi = netsh http show urlacl | Select-String -Pattern "https://$hostname/wopi"

    # Check and add URL reservation for PowerBI
    if (-not $urlaclPowerBI) {
        netsh http add urlacl url="https://$($hostname):443/PowerBI" user="NT SERVICE\PowerBIReportServer" SDDL="D:(A;;GX;;;S-1-5-80-1730998386-2757299892-37364343-1607169425-3512908663)"
        Write-Output "URLACL for https://$hostname/PowerBI added."
    } else {
        Write-Output "URLACL for https://$hostname/PowerBI already exists."
    }

    # Check and add URL reservation for wopi
    if (-not $urlaclWopi) {
        netsh http add urlacl url=https://$($hostname):443/wopi user="NT SERVICE\PowerBIReportServer" SDDL="D:(A;;GX;;;S-1-5-80-1730998386-2757299892-37364343-1607169425-3512908663)"
        Write-Output "URLACL for https://$hostname/wopi added."
    } else {
        Write-Output "URLACL for https://$hostname/wopi already exists."
    }

    # Check and add URL reservation for Reports
    if (-not $urlaclReports) {
        netsh http add urlacl url=https://$($hostname):443/Reports user="NT SERVICE\PowerBIReportServer" SDDL="D:(A;;GX;;;S-1-5-80-1730998386-2757299892-37364343-1607169425-3512908663)"
        Write-Output "URLACL for https://$hostname/Reports added."
    } else {
        Write-Output "URLACL for https://$hostname/Reports already exists."
    }

    # Check and add URL reservation for ReportServer
    if (-not $urlaclReportServer) {
        netsh http add urlacl url=https://$($hostname):443/ReportServer user="NT SERVICE\PowerBIReportServer" SDDL="D:(A;;GX;;;S-1-5-80-1730998386-2757299892-37364343-1607169425-3512908663)"
        Write-Output "URLACL for https://$hostname/ReportServer added."
    } else {
        Write-Output "URLACL for https://$hostname/ReportServer already exists."
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.