我需要在SSRS(T-SQL)中编写一个报告,该报告显示当前用户报告他们具有读取访问权限的SSRS报告服务器,该报告由当前的Active Directory确定。更复杂的是,Active Directory没有将组设置为组元素 - AD中的所有用户都是objectClass = User和objectCategory = Person。
我的问题是:如何编写一个将用户与其所有“memberOf”元素相匹配的查询,而不必知道组名是什么(因为它们可能会改变等等)?从那里开始,我想我可以将每个元素与报告相匹配。
编辑:这是我到目前为止所写的内容。由于语法错误,它没有创建过程,但我无法发现错误。USE [ReportServer]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[ActiveDirectoryPermissions]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Table1 TABLE
(
[GroupName] nvarchar(MAX),
[GroupPath] nvarchar(MAX)
)
INSERT INTO @Table1 ( [GroupName], [GroupPath] )
SELECT sAMAccountName as [GroupName], replace(ADsPath,'LDAP://','') as [GroupPath]
FROM OPENQUERY( ADSI,
'SELECT sAMAccountname, ADsPath
FROM ''LDAP://DC=[REDACTED],DC=COM''
WHERE objectCategory=''group'' AND CN=''*''
ORDER BY CN')
DECLARE @Table2 TABLE
(
[GroupPath] nvarchar(MAX),
[MemberName] nvarchar(MAX)
)
DECLARE table_1_cursor CURSOR FOR
SELECT GroupPath
FROM @Table1 t1
DECLARE @SQL nvarchar(MAX)
DECLARE @temp nvarchar(MAX)
OPEN table_1_cursor
FETCH NEXT FROM table_1_cursor INTO @temp
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'SELECT '''+@temp+''' AS GroupPath, cn
FROM OPENQUERY(ADSI,
''SELECT cn
FROM ''''LDAP://DC=[REDACTED],DC=com''''
WHERE
memberOf='''''+@temp+'''''
'')'
INSERT INTO @Table2 ( [GroupPath], [MemberName] )
EXEC sp_executesql @SQL;
FETCH NEXT FROM table_1_cursor INTO @temp
END
CLOSE table_1_cursor
DEALLOCATE table_1_cursor
SELECT *
FROM @Table2 t2
INNER JOIN @Table1 t1 ON (t2.GroupPath=t1.GroupPath)
GO
答案 0 :(得分:1)
注释掉存储过程的内容并创建它。然后通过一次取消注释语句来更改sproc。您还可以尝试注释掉select语句的某些部分。我怀疑问题是你在构建@sql的地方。此时我会选择@ temp和@sql。直接运行代码而不是作为过程的一部分。这样您就可以手动检查并测试输出。坚持到目前为止做得很好。那些'会让我发疯。
您缺少存储过程的最终END。下一个问题:什么是ADSI?我认为这是暴露AD的链接服务器的名称?如在
https://www.mssqltips.com/sqlservertip/2580/querying-active-directory-data-from-sql-server/
有一种访问AD的替代方法,不需要链接服务器。
EXEC master.dbo.sp_QueryAD
'SELECT sAMAccountname, ADsPath
FROM ''LDAP://OU=REDACTED,DC=REDACTED''
WHERE objectCategory=''group'' AND CN=''*''
ORDER BY CN'
有少量配置可以启用此功能,但如果您搜索错误,则只需要一点时间进行设置。