sql >> Base de Datos >  >> RDS >> Sqlserver

C# clr udf para la pertenencia a un grupo de Active Directory

Lo más probable es que todos esos ensamblajes deban establecerse en UNSAFE , especialmente los tres System.DirectoryServices* Bibliotecas de .NET Framework que importó. Además, dado que está importando bibliotecas de .NET Framework no admitidas , deberá configurar la base de datos en TRUSTWORTHY ON para que se pongan a trabajar. Establecer una base de datos en TRUSTWORTHY ON normalmente es algo que desea evitar ya que es un riesgo de seguridad, pero en este caso no creo que se pueda evitar.

Dicho esto, no estoy seguro de que necesite crear esta función usted mismo en SQLCLR. Si solo desea saber si un inicio de sesión (solo inicios de sesión de Windows, obviamente) pertenece a un grupo de Active Directory en particular, hay una función integrada que debería haz eso por ti El IS_MEMBER indicará si el actual El inicio de sesión es miembro del grupo de Windows especificado (especificado como Domain\Group ). La diferencia en cómo funciona esta función en comparación con la que está creando es que solo funciona para el inicio de sesión actual; no puede pasarle ningún inicio de sesión arbitrario. PERO, tampoco requiere ningún esfuerzo adicional ni riesgos de seguridad que son parte de esto solución SQLCLR. Entonces, algo a considerar :-).

Comentario de OP sobre esta respuesta:

En ese caso, solo haga que Dynamic SQL tenga dos capas de profundidad en lugar de una capa habitual. Algo como:

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);

En este enfoque, la consulta que ejecuta OPENQUERY es SQL dinámico, pero la consulta dada a OPENQUERY para ejecutar es un literal de cadena.