Mest sandsynligt skal alle disse samlinger indstilles til UNSAFE
, især de tre System.DirectoryServices* .NET Framework-biblioteker, som du har importeret. Da du også importerer ikke-understøttede .NET Framework-biblioteker
, skal du indstille databasen til TRUSTWORTHY ON
for at få dem til at arbejde. Indstilling af en database til TRUSTWORTHY ON
er typisk noget man vil undgå, da det er en sikkerhedsrisiko, men i dette tilfælde tror jeg ikke på, at det kan undgås.
Når det er sagt, er jeg ikke sikker på, at du overhovedet behøver at oprette denne funktion selv i SQLCLR. Hvis du bare vil vide, om et login (kun Windows-login, naturligvis) tilhører en bestemt Active Directory-gruppe, er der en indbygget funktion, som skal gør det for dig. IS_MEMBER
funktionen vil angive, om den aktuelle Login er medlem af den angivne Windows-gruppe (specificeret som Domain\Group
). Forskellen i, hvordan denne funktion fungerer i modsætning til den, du opretter, er, at den kun virker for det aktuelle login; du kan ikke sende noget vilkårligt login ind i det. MEN det kræver heller ikke nogen af den ekstra indsats og sikkerhedsrisici, der er en del af dette SQLCLR løsning. Så noget at overveje :-).
Kommentar fra O.P. til dette svar:
I så fald skal du bare lave den dynamiske SQL to lag dybt i stedet for det sædvanlige ene lag. Noget i retning af:
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);
I denne tilgang udfører forespørgslen OPENQUERY
er dynamisk SQL, men forespørgslen givet til OPENQUERY
at udføre er en streng bogstavelig.