最简单的方法,用于确定SQL中的Active Directory组和成员

时间:2016-07-01 17:35:10

标签: sql-server reporting-services active-directory

我需要在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

1 个答案:

答案 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'

有少量配置可以启用此功能,但如果您搜索错误,则只需要一点时间进行设置。