Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

C# clr udf per l'appartenenza a gruppi di Active Directory

Molto probabilmente tutte queste assemblee dovranno essere impostate su UNSAFE , in particolare i tre System.DirectoryServices* Librerie .NET Framework importate. Inoltre, poiché stai importando librerie .NET Framework non supportate , dovrai impostare il database su TRUSTWORTHY ON per farli lavorare. Impostazione di un database su TRUSTWORTHY ON è in genere qualcosa che vuoi evitare in quanto rappresenta un rischio per la sicurezza, ma in questo caso non credo che possa essere evitato.

Detto questo, non sono sicuro che tu abbia nemmeno bisogno di creare questa funzione da solo in SQLCLR. Se vuoi solo sapere se un login (solo accessi Windows, ovviamente) appartiene a un particolare gruppo di Active Directory, c'è una funzione incorporata che dovrebbe fallo per te. Il IS_MEMBER funzione indicherà se il corrente L'accesso è un membro del gruppo Windows specificato (specificato come Domain\Group ). La differenza nel modo in cui funziona questa funzione rispetto a quella che stai creando è che funziona solo per il Login corrente; non puoi passare alcun accesso arbitrario al suo interno. MA, inoltre, non richiede nessuno degli sforzi aggiuntivi e dei rischi per la sicurezza che fanno parte di questo Soluzione SQLCLR. Quindi, qualcosa da considerare :-).

Commenta da OP su questa risposta:

In tal caso, basta rendere l'SQL dinamico due strati in profondità invece del solito uno strato. Qualcosa sulla falsariga di:

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
  SELECT *
  FROM   OPENQUERY([LinkedServer], N''
             SELECT *
             FROM   someResource
             WHERE  GroupName=N''''' + @Group + N'''''
             AND    ObjectName=N''''' + @Login + N''''';
                   '');
';

PRINT @SQL; -- DEBUG
EXEC (@SQL);

In questo approccio, la query che esegue OPENQUERY è Dynamic SQL, ma la query data a OPENQUERY eseguire è una stringa letterale.