Sau*_*gin 13 .net directoryservices sqlclr active-directory sql-server-2008
我正在移植一个旧的3 2-bit COM组件,它是VB6为了读写Active Directory服务器而编写的.新解决方案将在C#并将使用SQL CLR用户功能.
我尝试部署的程序集SQL Server包含对它的引用System.DirectoryServices.该项目确实编译没有任何错误,但SQL Server由于以下错误,我无法将程序集部署到该程序集:
Error: Assembly 'system.directoryservices, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' was not found in the SQL catalog.
System.DirectoryServices在SQL Server上注册的正确步骤是什么?
其他答案提供的信息使我得到了解决方案.以下是我提出的步骤以供将来参考:
CREATE ASSEMBLY [System.DirectoryServices]
FROM 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll'
WITH PERMISSION_SET = UNSAFE
GO
Run Code Online (Sandbox Code Playgroud)
我第一次运行上面的语句时出现以下错误:
程序集"System.DirectoryServices"的CREATE ASSEMBLY失败,因为程序集"System.DirectoryServices"未获得PERMISSION_SET = UNSAFE的授权.如果满足以下任一条件,则授权程序集:数据库所有者(DBO)具有UNSAFE ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性; 或者使用具有UNSAFE ASSEMBLY权限的相应登录的证书或非对称密钥对程序集进行签名.
为了使CREATE ASSEMBLY语句无错误地执行,我必须首先将TRUSTWORTHY打开,如下所示:
ALTER DATABASE DatabaseName SET TRUSTWORTHY ON
GO
Run Code Online (Sandbox Code Playgroud)
一旦TRUSTWORTHY打开,命令执行没有错误但它确实提出了这个可怕的声音警告:
警告:Microsoft .NET Framework程序集'system.directoryservices,version = 2.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a,processorarchitecture = msil.' 您正在注册未在SQL Server托管环境中进行全面测试,并且不受支持.将来,如果升级或维护此程序集或.NET Framework,则CLR集成例程可能会停止工作.有关更多详细信息,请参阅SQL Server联机丛书.
通过在SQL Server中正确注册System.DirectoryServices,我现在可以毫无问题地部署/注册相关的自定义SQL CLR程序集.
这篇文章有帮助吗?
人们经常会询问可以在SQLCLR中安全使用的基类库程序集.它通常采取"我可以在SQLCLR程序代码中使用程序集System.XYZ.dll"或"我为什么得到"程序集"找不到System.XYZ.dll"的形式"当我尝试编写自己的程序集来调用这个程序时?最常听到的是System.DirectoryServices.dll(Active Directory支持)或System.Management.dll(WMI支持)或System.Remoting.dll等.您使用这些的唯一方法是对它们运行CREATE ASSEMBLY你自己,它涉及使用PERMISSION_SET = UNSAFE.并编目所有的依赖关系.不适合胆小的人.
此外 - SQL Server CLR不支持每个可想象的程序集 - 在此处查找列表:
来自第二篇MSDN文章的一条说明:
不受支持的库
仍然可以从托管存储过程,触发器,用户定义函数,用户定义类型和用户定义聚合中调用不受支持的库.必须首先使用CREATE ASSEMBLY语句在SQL Server数据库中注册不受支持的库,然后才能在代码中使用它.应检查并测试在服务器上注册和运行的任何不受支持的库的安全性和可靠性.
例如,不支持System.DirectoryServices命名空间.您必须先注册具有UNSAFE权限的System.DirectoryServices.dll程序集,然后才能从代码中调用它.UNSAFE权限是必需的,因为System.DirectoryServices命名空间中的类不满足SAFE或EXTERNAL_ACCESS的要求.有关更多信息,请参阅CLR集成编程模型限制和CLR集成代码访问安全性.