Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

C# clr udf pour l'appartenance au groupe Active Directory

Très probablement, tous ces assemblages devront être définis sur UNSAFE , en particulier les trois System.DirectoryServices* Bibliothèques .NET Framework que vous avez importées. De plus, puisque vous importez des des bibliothèques .NET Framework non prises en charge , vous devrez définir la base de données sur TRUSTWORTHY ON afin de les faire travailler. Définition d'une base de données sur TRUSTWORTHY ON est généralement quelque chose que vous voulez éviter car il s'agit d'un risque pour la sécurité, mais dans ce cas, je ne pense pas que cela puisse être évité.

Cela dit, je ne suis pas sûr que vous ayez même besoin de créer cette fonction vous-même dans SQLCLR. Si vous voulez simplement savoir si une connexion (connexions Windows uniquement, évidemment) appartient à un groupe Active Directory particulier, il existe une fonction intégrée qui devrait fais ça pour toi. Le IS_MEMBER la fonction indiquera si le courant La connexion est membre du groupe Windows spécifié (spécifié comme Domain\Group ). La différence dans le fonctionnement de cette fonction par rapport à celle que vous créez est qu'elle ne fonctionne que pour la connexion actuelle ; vous ne pouvez pas y transmettre de connexion arbitraire. MAIS, cela ne nécessite aucun des efforts supplémentaires et des risques de sécurité qui font partie de ceci Solution SQLCLR. Donc, quelque chose à considérer :-).

Commentaire d'O.P. sur cette réponse :

Dans ce cas, créez simplement le SQL dynamique en deux couches au lieu de la couche habituelle. Quelque chose comme :

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

Dans cette approche, la requête exécutant OPENQUERY est Dynamic SQL, mais la requête donnée à OPENQUERY à exécuter est un littéral de chaîne.