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.