Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

C# clr udf para associação de grupo do Active Directory


Muito provavelmente, todos esses Assemblies precisarão ser definidos como UNSAFE , especialmente os três System.DirectoryServices* Bibliotecas do .NET Framework que você importou. Além disso, como você está importando bibliotecas .NET Framework não suportadas , você precisará definir o banco de dados para TRUSTWORTHY ON para fazê-los funcionar. Configurando um banco de dados para TRUSTWORTHY ON normalmente é algo que você deseja evitar, pois é um risco de segurança, mas, neste caso, não acredito que possa ser evitado.

Dito isso, não tenho certeza de que você precise criar essa função no SQLCLR. Se você está apenas querendo saber se um login (somente logins do Windows, obviamente) pertence a um grupo específico do Active Directory, há uma função interna que deve fazer isso por você. O IS_MEMBER função indicará se o atual O logon é membro do grupo Windows especificado (especificado como Domain\Group ). A diferença de como essa função funciona em relação à que você está criando é que ela só funciona para o Login atual; você não pode passar nenhum Login arbitrário para ele. MAS, também não requer nenhum esforço extra e riscos de segurança que fazem parte isto Solução SQLCLR. Então, algo a considerar :-).

Comentário de O.P. nesta resposta:

Nesse caso, apenas faça o SQL Dinâmico com duas camadas de profundidade em vez da camada usual. Algo na linha de:
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);

Nesta abordagem, a consulta que executa OPENQUERY é SQL dinâmico, mas a consulta dada a OPENQUERY para executar é um literal de string.