Le portail SSRS affiche « An error occurred when invoking the authorization extension » après un changement d’autorisations ? Voici une procédure fiable, reproductible et sûre pour restaurer l’accès, corriger la cause racine et éviter toute récidive.
Symptômes observés dans SSRS
- Le portail Web affiche An error has occurred. An error occurred when invoking the authorization extension.
- Le menu contextuel (trois points) de tout dossier ou rapport déclenche la même erreur.
- Tous les autres utilisateurs perdent l’accès au portail SSRS.
- Les journaux SSRS contiennent une NullReferenceException dans
Microsoft.ReportingServices.Authorization.SdAndType.GetRightSecDesc
lors de l’appel àWindowsAuthorization.GetPermissions
. - Le problème est apparu juste après avoir modifié les autorisations d’un seul rapport.
<h3>Extrait de log typique</h3>
<pre><code>[xx:xx:xx.xxx] ERROR: An error occurred when invoking the authorization extension.
System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.ReportingServices.Authorization.SdAndType.GetRightSecDesc(…) at Microsoft.ReportingServices.Authorization.WindowsAuthorization.GetPermissions(…)
<p><strong>Emplacement des logs</strong> : selon la version, consultez le dossier <code>...Reporting Services\LogFiles</code> (ex. : <code>C:\Program Files\Microsoft SQL Server Reporting Services\SSRS\LogFiles</code> ou <code>C:\Program Files\Microsoft SQL Server\MSRSXX.MSSQLSERVER\Reporting Services\LogFiles</code>).</p>
Ce qui se passe techniquement
Au chargement du portail, SSRS interroge l’authorization extension pour déterminer les droits de l’utilisateur sur la racine /
puis sur les éléments chargés (dossiers, rapports, sources de données). Si l’extension retourne un objet null ou un descripteur de sécurité (ACL) incohérent pour un seul élément, la résolution des permissions échoue et la page entière lève l’erreur ci‑dessus.
Les causes fréquentes :
- Descripteur de sécurité corrompu sur un élément (modification d’ACL sans héritage, suppression d’un rôle intégré, identité inexistante…)
- Bug ou régression dans une extension d’autorisation personnalisée qui renvoie
null
depuisGetPermissions
ou un chemin de code associé. - Compte de service SSRS insuffisamment autorisé sur
ReportServer
/ReportServerTempDB
, empêchant la lecture des ACL.
Plan de remédiation rapide
Appliquez les étapes suivantes dans l’ordre. Elles corrigent l’immense majorité des « authorization extension » liées aux ACL.
<table>
<thead>
<tr>
<th>Étape</th>
<th>Action recommandée</th>
<th>Pourquoi / effet attendu</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Réinitialiser les autorisations de la racine</strong></td>
<td>
<ul>
<li>Exécuter <code>rs.exe</code> avec le script <code>ResetAllSecurityToBuiltinGroups.rss</code> pour remettre les rôles intégrés.</li>
<li>Alternative PowerShell : utiliser votre fonction wrapper <code>Set-PSSRSRootAcl</code> ou les cmdlets <em>ReportingServicesTools</em> équivalentes.</li>
<li>Vérifier que <strong>BUILTIN\Administrators</strong> (ou un compte « break‑glass ») est <em>Content Manager</em> à la racine et <em>System Administrator</em> au niveau système.</li>
</ul>
</td>
<td>Supprime les ACL corrompues et restaure les rôles intégrés, ce qui fait disparaître l’erreur au chargement du portail.</td>
</tr>
<tr>
<td><strong>Tester sans extension personnalisée</strong></td>
<td>
<ul>
<li>Si vous avez une extension d’autorisation « maison », commentez-la dans <code>RSReportServer.config</code> pour revenir aux extensions Windows natives.</li>
<li>Redémarrez le service SSRS et testez le portail.</li>
<li>Corrigez tout chemin de code pouvant retourner <code>null</code> dans <code>GetPermissions</code> et validez l’instance.</li>
</ul>
</td>
<td>Isoler l’extension confirme si la nullité provient du code personnalisé.</td>
</tr>
<tr>
<td><strong>Vérifier les rôles du compte de service</strong></td>
<td>
<ul>
<li>Sur <code>ReportServer</code> et <code>ReportServerTempDB</code>, le compte de service doit être <em>dbo</em> ou membre de <em>db_owner</em>.</li>
<li>Dans SSRS, attribuer au compte (ou groupe AD) les rôles <em>System Administrator</em> et <em>Content Manager</em> à la racine.</li>
</ul>
</td>
<td>Évite les échecs de lecture/écriture des ACL au niveau base, sources et abonnements.</td>
</tr>
<tr>
<td><strong>Redémarrer et purger le cache</strong></td>
<td>
<ul>
<li>Redémarrer le service <em>SQL Server Reporting Services</em>.</li>
<li>Vider <code>RSTempFiles</code> si présent et le cache du navigateur, puis se reconnecter.</li>
</ul>
</td>
<td>Recharge propre de la configuration et des ACL corrigées.</td>
</tr>
<tr>
<td><strong>Sauvegarder la clé de chiffrement</strong></td>
<td>
<ul>
<li>Avant toute manipulation : <code>rskeymgmt -e -f <chemin\clé.rskey> -p <motDePasse></code>.</li>
</ul>
</td>
<td>Nécessaire pour restaurer les données chiffrées (sources, abonnements, etc.).</td>
</tr>
<tr>
<td><strong>Demander de l’aide spécialisée</strong></td>
<td>
<ul>
<li>Si le problème persiste, regrouper version SSRS, type d’authentification et extrait complet du log, puis solliciter le forum Microsoft Q&A dédié SSRS.</li>
</ul>
</td>
<td>Permet un diagnostic approfondi par des ingénieurs SSRS.</td>
</tr>
</tbody>
</table>
<blockquote>
<strong>Conseil</strong> : réalisez toutes ces actions durant un créneau de maintenance. Assurez-vous de conserver un compte « break‑glass » local Administrators qui reste <em>System Administrator</em> et <em>Content Manager</em>.
</blockquote>
Procédure détaillée pas à pas
<h3>Préparation et sauvegardes</h3>
<ul>
<li>Exporter la clé de chiffrement :
<pre><code>rskeymgmt -e -f "D:\Backup\ssrs-key.rskey" -p "MotDePasseFort#2025"</code></pre>
</li>
<li>Sauvegarder <code>RSReportServer.config</code>, <code>RSPortal.exe.config</code> (si applicable) et les bases <code>ReportServer</code> / <code>ReportServerTempDB</code>.</li>
<li>Option utile : dumper l’état actuel des ACL pour audit et éventuelle restauration (voir script plus bas).</li>
</ul>
<h3>Réinitialiser les ACL via rs.exe</h3>
<p>Créez un fichier <code>ResetAllSecurityToBuiltinGroups.rss</code> avec le contenu suivant et exécutez-le. Ce script nettoie les ACL explicites, rétablit l’héritage et ajoute les rôles intégrés à la racine.</p>
<pre><code>' ResetAllSecurityToBuiltinGroups.rss
‘ Usage: rs.exe -i ResetAllSecurityToBuiltinGroups.rss -s http:///reportserver -e Mgmt2010 Public Sub Main() Dim rs As New ReportingService2010() rs.Credentials = System.Net.CredentialCache.DefaultCredentials
' 1) Rôle système
Dim sysPol(0) As Policy
sysPol(0) = New Policy()
sysPol(0).GroupUserName = "BUILTIN\Administrators"
sysPol(0).Roles = New Role(0) {}
sysPol(0).Roles(0) = New Role()
sysPol(0).Roles(0).Name = "System Administrator"
rs.SetSystemPolicies(sysPol)
' 2) Rôle item à la racine
Dim rootPol(0) As Policy
rootPol(0) = New Policy()
rootPol(0).GroupUserName = "BUILTIN\Administrators"
rootPol(0).Roles = New Role(0) {}
rootPol(0).Roles(0) = New Role()
rootPol(0).Roles(0).Name = "Content Manager"
rs.SetItemPolicies("/", rootPol)
' 3) Reforçage de l’héritage : suppression des ACL explicites sous la racine
Dim items() As CatalogItem = rs.ListChildren("/", True)
For Each it As CatalogItem In items
' Clear policy to inherit
rs.InheritParentSecurity(it.Path)
Next
Console.WriteLine("Sécurité réinitialisée. Vérifiez l’accès au portail.")
End Sub
<p>Commande d’exécution :</p>
<pre><code>rs.exe -i "D:\Scripts\ResetAllSecurityToBuiltinGroups.rss" -s "http://localhost/reportserver" -e Mgmt2010 -l</code></pre>
<h3>Option PowerShell</h3>
<p>Si vous utilisez votre fonction <code>Set-PSSRSRootAcl</code> (ou le module <em>ReportingServicesTools</em>), adaptez :</p>
<pre><code># Exemples : ajustez les cmdlets si votre environnement diffère.
$uri = « [http://localhost/reportserver](http://localhost/reportserver) » # Système : garantir le rôle System Administrator # (équivalent à SetSystemPolicies) # Grant-RsSystemRole -Identity « BUILTIN\Administrators » -RoleName « System Administrator » -ReportServerUri $uri # Racine : garantir Content Manager à BUILTIN\Administrators # Grant-RsCatalogItemRole -Path « / » -Identity « BUILTIN\Administrators » -RoleName « Content Manager » -ReportServerUri $uri -Overwrite # Héritage : supprimer les ACL explicites sous la racine # Get-RsCatalogItem -Path « / » -Recurse | ForEach-Object { Clear-RsCatalogItemSecurity -Path $_.Path -ReportServerUri $uri }
<h3>Tester sans extension d’autorisation personnalisée</h3>
<p>Éditez <code>RSReportServer.config</code> et repassez aux extensions Windows natives (commentez les extensions personnalisées). Exemple :</p>
<pre><code><!-- RSReportServer.config -->
Off true
Redémarrez le service SSRS, puis testez le portail. Si l’erreur disparaît : corrigez l’extension (ne jamais retourner null
depuis GetPermissions
, journaliser les cas inattendus, ajouter des tests unitaires) avant de la réactiver.
<h3>Vérification des rôles du compte de service</h3>
<p>Depuis SQL Server, assurez <em>dbo</em> (propriétaire) ou <em>db_owner</em> sur <code>ReportServer</code> et <code>ReportServerTempDB</code> :</p>
<pre><code>-- Remplacer DOMAIN\SSRSService par votre compte de service
USE ReportServer; ALTER ROLE db_owner ADD MEMBER [DOMAIN\SSRSService]; GO USE ReportServerTempDB; ALTER ROLE db_owner ADD MEMBER [DOMAIN\SSRSService]; GO — Option : s’assurer de la propriété base — ALTER AUTHORIZATION ON DATABASE::ReportServer TO [DOMAIN\SSRSService]; — ALTER AUTHORIZATION ON DATABASE::ReportServerTempDB TO [DOMAIN\SSRSService];
Dans SSRS : au niveau système, donnez System Administrator au compte de service (ou à un groupe AD approprié). À la racine, attribuez Content Manager si nécessaire.
<h3>Redémarrage et purge</h3>
<ul>
<li>Redémarrer <em>SQL Server Reporting Services</em> via Services.msc ou :
<pre><code>net stop "SQL Server Reporting Services"
net start « SQL Server Reporting Services » Supprimer les fichiers temporaires du dossier RSTempFiles
(si présent). Vider le cache du navigateur, ouvrir une nouvelle session et vérifier l’accès.
Scripts utiles pour l’audit et la restauration
<h3>Exporter l’état des ACL (audit)</h3>
<p>Script <code>rsdumpacl.rss</code> pour inventorier les politiques effective/inheritée :</p>
<pre><code>' rsdumpacl.rss
‘ Usage : rs.exe -i rsdumpacl.rss -s http:///reportserver -e Mgmt2010 > ACL.csv Public Sub Main() Dim rs As New ReportingService2010() rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Console.WriteLine("Path;Inherits;Principals;Roles")
DumpItem("/")
End Sub Sub DumpItem(path As String) Dim rs As New ReportingService2010() rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim inherits As Boolean = rs.GetItemDataSourcePrompts(path).Length = 0 ' placeholder to force call; we will catch exceptions
Try
Dim isInherited As Boolean
Dim pol() As Policy = rs.GetItemPolicies(path, isInherited)
Dim principals As New System.Text.StringBuilder()
Dim roles As New System.Text.StringBuilder()
If Not pol Is Nothing Then
For Each p In pol
principals.Append(p.GroupUserName).Append(",")
For Each r In p.Roles
roles.Append(r.Name).Append("|")
Next
roles.Append(";")
Next
End If
Console.WriteLine(path & ";" & isInherited.ToString() & ";" & principals.ToString() & ";" & roles.ToString())
Catch ex As Exception
Console.WriteLine(path & ";ERROR;" & ex.Message.Replace(";", ",") & ";")
End Try
Dim children() As CatalogItem = rs.ListChildren(path, False)
For Each c In children
DumpItem(c.Path)
Next
End Sub
<h3>Restauration des rôles « type usine »</h3>
<p>Si vous avez besoin d’aller plus loin qu’un simple reset, conservez une copie des rôles personnalisés et des affectations pour les rejouer après stabilisation. Le reset proposé ci‑dessus remet en état de marche la plateforme et vous laisse ensuite re‑appliquer les personnalisations de manière maîtrisée.</p>
Tests de validation après correctif
Test | Détails | Résultat attendu |
---|---|---|
Connexion administrateur | Se connecter avec un compte membre de BUILTIN\Administrators. | Le portail se charge sans erreur, accès à toutes les pages d’administration. |
Menu contextuel | Clic sur les trois points d’un dossier et d’un rapport. | Le menu s’ouvre sans erreur et propose les actions disponibles. |
Héritage des autorisations | Créer un sous-dossier, vérifier qu’il hérite de la racine. | L’héritage est actif, pas d’ACL explicite inutile. |
Exécution de rapport | Exécuter un rapport standard avec source de données stockée. | Pas d’erreur « permission », les abonnements restent valides. |
Cas particuliers à ne pas oublier
- Ferme scale‑out : répliquez
RSReportServer.config
et les resets de sécurité sur tous les nœuds. Vérifiez que la clé de chiffrement est identique partout. - Reverse proxy / header d’hôte : si vous utilisez un proxy, validez que l’URL du portail et l’URL de l’API management correspondent aux mêmes hôtes et schémas pour éviter des anomalies d’authentification.
- Contexte domaine : BUILTIN\Administrators est un groupe local. Sur un contrôleur de domaine, vérifiez sa composition ou utilisez un groupe global dédié.
- Power BI Report Server : la logique d’ACL et les scripts
rs.exe
sont analogues, adaptez simplement les chemins d’installation.
Prévenir la réapparition de l’erreur
- Conserver un compte « break‑glass » membre de Administrators local, explicitement System Administrator et Content Manager.
- Interdire les ACL explicites par défaut : n’autoriser des exceptions que si documentées, et toujours au niveau d’un dossier plutôt que de l’élément final.
- Pipeline de déploiement : appliquez les rôles via scripts (rs.exe/PowerShell) versionnés, pas manuellement.
- Extension personnalisée : dans
GetPermissions
, ne retournez jamaisnull
. Préférez un tableau vide et journalisez les cas inattendus. Ajoutez des tests pour les éléments orphelins ou supprimés côté AD. - Surveillance : alertez sur les événements NullReferenceException et sur tout échec récurrent de
GetPermissions
. - Avant mise à jour : exportez systématiquement la clé de chiffrement et un dump ACL.
FAQ rapide
Q : Le reset supprime‑t‑il mes rôles personnalisés ?
R : Il restaure les rôles intégrés sur la racine et force l’héritage. Conservez une exportation des ACL et réappliquez ensuite les personnalisations de manière contrôlée.
<p><strong>Q : Où changer les rôles système vs item ?</strong><br>
R : Les rôles « System Administrator »/« System User » se règlent au niveau système ; « Content Manager », « Browser », etc., au niveau des éléments (racine, dossiers, rapports).</p>
<p><strong>Q : Pourquoi l’erreur apparaît‑elle après un seul changement d’ACL ?</strong><br>
R : Un descripteur de sécurité invalide sur un élément suffit à faire échouer la résolution des permissions, car le portail interroge globalement les droits pour composer l’UI.</p>
Cheat‑sheet des commandes
Objectif | Commande | Remarques |
---|---|---|
Exporter clé de chiffrement | rskeymgmt -e -f "D:\Backup\ssrs-key.rskey" -p "MotDePasse" | Indispensable avant toute réinstallation ou restauration. |
Réinitialiser la sécurité | rs.exe -i ResetAllSecurityToBuiltinGroups.rss -s http://serveur/reportserver -e Mgmt2010 | Rend l’accès au portail sans corruption d’ACL. |
Redémarrer service | net stop "SQL Server Reporting Services"&& net start "SQL Server Reporting Services" | Recharge la configuration et les ACL. |
Donner db_owner au service | ALTER ROLE db_owner ADD MEMBER [DOMAIN\SSRSService]; | À exécuter sur ReportServer et ReportServerTempDB . |
Checklist de diagnostic
Vérification | Comment faire | OK si… |
---|---|---|
Rôle système | Vérifier que l’admin « break‑glass » est System Administrator. | Accès à l’onglet Paramètres du portail sans erreur. |
Rôle racine | Vérifier Content Manager à / . | Possibilité de gérer dossiers/rapports à la racine. |
Héritage | Créer un sous‑dossier et vérifier l’héritage des autorisations. | L’héritage est actif, pas d’ACL explicite non voulue. |
Journaux propres | Surveiller les nouveaux logs après reset. | Aucune nouvelle NullReferenceException. |
Extension custom | Activer l’extension et rejouer les tests. | Elle ne renvoie jamais null depuis GetPermissions . |
Conclusion
La combinaison reset des ACL à la racine + validation du compte de service + désactivation temporaire de l’extension custom élimine presque toujours « An error occurred when invoking the authorization extension ». Une fois la plateforme saine, réappliquez vos délégations avec un script contrôlé, surveillez les journaux et imposez un modèle d’héritage strict. Vous limitez ainsi durablement le risque de corruption des descripteurs de sécurité et garantissez la stabilité du portail SSRS.
<h3>Rappels essentiels</h3>
<ul>
<li>Exporter la clé de chiffrement AVANT toute opération.</li>
<li>Garder un compte « break‑glass » opérationnel.</li>
<li>Documenter et scripter toutes les ACL.</li>
<li>Tester toute extension d’autorisation contre les cas « principaux absents », « éléments orphelins » et héritage cassé.</li>
</ul>