如何以编程方式确定有权访问特定 SSRS 报告的登录名/用户?
我想创建一个数据集市,以便为想要查看谁有权访问特定报告的经理填充报告。目前,我们将权限分配给 Active Directory 组,然后 SQL Server 和 SSRS 使用这些组来确定权限。我想知道 SSRS 的元数据中是否有一个表可以跟踪如何将权限分配给报告。
这个脚本可以完成您想要的大部分功能,您可以根据您的需要对其进行调整:
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 上运行脚本
上面的脚本可以工作,但请记住,它还会显示已删除的用户 - 即不再位于 Active Directory 中的用户,这有时可能会令人困惑。
此外,Microsoft 并不正式支持对其 ReportServer 数据库的任何查询。
这是我提出的一个查询,它仅显示唯一的权限(根文件夹以及文件夹安全继承被破坏的位置),而不是列出每个报告目录项。如果您有大量报告,此布局对于访问评论等内容更易于阅读。使用 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
;