2016-07-01 4 views
1

SSRS(T-SQL)でレポートを作成する必要があります。このユーザーは、読み取りアクセス権を持つSSRSレポートサーバー現在のActive Directory問題を複雑にするために、Active Directoryにはグループ要素としてグループが設定されていません.ADのすべてのユーザーはobjectClass = UserおよびobjectCategory = Personです。SQLでActive Directoryのグループとメンバーを判別する最も簡単な方法

私の質問は、グループ名が何であるかを知らなくても(「変更される可能性がある」など)、ユーザーをすべての「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 '''[email protected]+''' AS GroupPath, cn 
     FROM OPENQUERY(ADSI, 
     ''SELECT cn 
     FROM ''''LDAP://DC=[REDACTED],DC=com'''' 
     WHERE 
     memberOf='''''[email protected]+''''' 
     '')' 
    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

構文エラーが原因でコンパイルを拒否するコードを追加しましたが、エラーが見つかりません。 –

+0

レベル102、レベル15、状態1、プロシージャActiveDirectoryPermissions、行56 [バッチ開始行8] ')'の近くの構文が正しくありません。 –

+0

うん。私がこれを読む前に欠落している「END」を捕まえた。 * derp * ADSIはADを公開するリンクサーバーです。これは今すぐ動作するはずです。あなたの助けをありがとう、マイク! –

答えて

1

ストアドプロシージャの内容をコメント化して作成します。次に、ステートメントのコメントを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' 

これを有効にするには少量の設定がありますが、エラーで検索すると設定に時間がかかります。

関連する問題