SSRS - 通过 ReportServer 数据库表确定报告权限?

22

如何以编程方式确定具有访问特定SSRS报告权限的登录用户?

我想创建一个数据集市,以便为希望查看谁可以访问特定报告的经理填充报告。我们目前将权限分配给Active Directory组,然后由SQL Server和SSRS使用这些组来确定权限。我想知道是否有一个在SSRS元数据中跟踪如何将权限分配给报告的表。

3个回答

35
这是一个可满足大部分需求的脚本,你可以根据自己的需要进行调整:
select C.UserName, D.RoleName, D.Description, E.Path, E.Name 
from dbo.PolicyUserRole A
   inner join dbo.Policies B on A.PolicyID = B.PolicyID
   inner join dbo.Users C on A.UserID = C.UserID
   inner join dbo.Roles D on A.RoleID = D.RoleID
   inner join dbo.Catalog E on A.PolicyID = E.PolicyID
order by C.UserName   

您可以在 SSRS SQL ReportServer 上运行脚本。


2
此查询中不需要 dbo.Policies (B)。 - Ken Mc
查找过期角色的理想选择。 - JsonStatham

2

上述脚本可以工作,但请记住,它也会显示已删除的用户 - 即不再在Active Directory中的用户,有时可能会令人困惑。

此外,微软并不正式支持任何针对其ReportServer数据库的查询。


GetPolicies() 方法可用于检索正确的权限。 - Aftab Ansari

0
这是我想出来的一个查询,它只显示唯一权限(根文件夹和任何文件夹安全继承被打破的地方),而不是列出每个报表目录项。如果你有很多报表,这种布局更容易阅读,比如访问审查。已在SQL 2014上进行了测试。
注意:正如Paul所提到的,这将显示在SSRS中分配的内容,但不知道Active Directory帐户是否被禁用或已被删除。
select 
     [Path] = 
        case 
        when r.RoleFlags = 1 and c.Path is null
        then N'-Site Settings-' 
        else 
            case 
            when c.Path = N'' 
            then N'/' 
            else c.Path 
            end 
        end
    , MemberName = u.UserName
    , r.RoleName
    , RoleDescription = r.Description
    --, pur.PolicyID
    , RoleType = --Roles.RoleFlags values are from SecurityScope enum. Used to interpret Roles.TaskMask field.
        case r.RoleFlags
        when 0 then 'Folder Security'
        when 1 then '-Site Settings-'
        when 2 then 'Model Item'
        else concat('Unknown: ', r.RoleFlags)
        end
    , ReportServerName = @@SERVERNAME
    , ExecTime = getdate()
    --, r.RoleFlags
from ReportServer.dbo.PolicyUserRole pur
   inner join ReportServer.dbo.Users u on pur.UserID = u.UserID
   inner join ReportServer.dbo.Roles r on pur.RoleID = r.RoleID
   --get the root catalog item for each policy
   outer apply (
        select top 1 c.Path, c.Name
        from ReportServer.dbo.Catalog c 
        where pur.PolicyID = c.PolicyID 
            and r.RoleFlags = 0 --Catalog items
        order by len(c.path) - len(replace(c.path, N'/', N'')) --get the highest level items where this policy is applied.  Children that inherit from here will have more "/"s than the parent.
            , c.path
    ) c
order by 
    RoleType,
    c.Path,
    u.UserName,
    r.RoleName
;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接