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

问题描述 投票:0回答:3

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

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

sql-server ssrs-2008
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
投票

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

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


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
;
© www.soinside.com 2019 - 2024. All rights reserved.