
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." } }