9

開発中のアプリケーションの使用状況をログに記録するには、アプリケーションを使用するすべてのユーザーが、自分の資格情報で SQL Server データベースに対してクエリを実行する必要があります。

パスワードを取得可能な方法で保存しないようにするために、ユーザーごとに接続を作成することはできません (ログイン時に短いウィンドウを過ぎてパスワードを知る必要があるため)。

この問題 (最適ではない可能性があります) に対する一見明白な解決策は、すべての機密性の高いクエリを一般的な「アプリケーション」ユーザーとして実行し、ログインしているユーザーになりすますことです (ログインしているユーザーをユーザー名に関連付けるだけで済みます)。 ..これは悪いことではありません)。

私の問題は、特定の役割のすべてのユーザー、または一般的なすべてのユーザーに偽装を許可する方法がわからないことです (たとえば、アプリがシステム管理者になりすますことを望まないため、最も明るいアイデアではありません)。

grant impersonate on all to ApplicationLogin

機能せず、ロールのメンバーに偽装を許可することが可能であることを示唆するドキュメントはありません...

何か案は?

4

2 に答える 2

4

動的 sql を使用できます。以下のコードは、特定の役割に関連するすべてのユーザーを取得し、ユーザーに偽装する権限を付与します。アプリケーション ログインでユーザーを作成してデータベースに関連付け、特定のロールのすべてのメンバーに偽装する権限を付与する必要があります。これはコードです:

CREATE TRIGGER S2
ON DATABASE
FOR CREATE_USER
AS

CREATE TABLE #T
(PRINCIPAL_NAME NVARCHAR(100),ROLE_NAME NVARCHAR(100));
WITH L AS (SELECT *
            FROM (SELECT P.name AS 'PRINCIPAL_NAME',R.role_principal_id AS 'GH'
                FROM SYS.database_principals P,sys.database_role_members R
                WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id
                AND type<>'R') S INNER JOIN (SELECT P.name AS 'ROLE_NAME',P.principal_id AS 'GHA'
                                                FROM SYS.database_principals P,sys.database_role_members R
                                                WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id
                                                AND type='R') D
                ON D.GHA=S.GH)
INSERT INTO #T
SELECT DISTINCT PRINCIPAL_NAME,ROLE_NAME
FROM L
------------ ENTER ROLE NAME HERE 
WHERE ROLE_NAME LIKE '%%'
------------
DECLARE @P NVARCHAR(100),@TEXT NVARCHAR(MAX)=''
------------------------- CHANGE IT TO YOUR DESIRED NAME OF YOUR APPLICATION USER
DECLARE @APPUSER NVARCHAR(100)='APPLICATION_USER'
-------------------------
DECLARE C CURSOR FOR SELECT PRINCIPAL_NAME FROM #T
OPEN C
FETCH NEXT FROM C INTO @P
WHILE(@@FETCH_STATUS=0)
    BEGIN
        SET @TEXT+='GRANT IMPERSONATE ON USER::['+@P+'] TO '+@APPUSER+' '
        FETCH NEXT FROM C INTO @P
    END
CLOSE C
DEALLOCATE C
DROP TABLE #T
EXEC(@TEXT)

私はそれがあなたのために働くことを願っています.

于 2013-10-18T19:13:03.100 に答える