13

我正在移植一个旧的 32-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 上注册的正确步骤是什么?

4

4 回答 4

7

其他答案提供的信息使我找到了解决方案。以下是我提出的步骤以供将来参考:

CREATE ASSEMBLY [System.DirectoryServices]
FROM 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll'
WITH PERMISSION_SET = UNSAFE
GO

第一次运行上面的语句时,出现以下错误:

为程序集“System.DirectoryServices”创建程序集失败,因为程序集“System.DirectoryServices”未获得 PERMISSION_SET = UNSAFE 的授权。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该密钥具有相应的登录名并具有 UNSAFE ASSEMBLY 权限。

为了让 CREATE ASSEMBLY 语句正确执行,我必须首先打开 TRUSTWORTHY ON,如下所示:

ALTER DATABASE DatabaseName SET TRUSTWORTHY ON
GO

开启 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 程序集。

于 2010-06-02T18:51:30.107 回答
6

这里的那篇文章有帮助吗?

SP1 中的新“SQLCLR 批准”程序集

人们经常询问可以在 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 集成代码访问安全性。

于 2010-06-02T16:14:23.207 回答
0

这是否有帮助:在 SQL Server 中创建程序集

老实说,我对 SQL Server CLR 的使用了解不多。因此,如果这有帮助,我将坚持自己学习。=)

编辑#1

这是关于该主题的另一个有趣的链接。

SQL Server 2005 CLR 集成和程序集注册问题

我希望这有帮助!

于 2010-06-02T16:04:37.803 回答
0

想补充一点,我花了一天时间尝试使用非对称密钥签名的 DLL 注册程序集,但出现错误。

. . . 未授权 PERMISSION_SET = UNSAFE。大会在 时获得授权。. .

CREATE ASYMMETRIC KEY AsyKeyName FROM executable FILE = 'C:\Program Files\...'

后来才发现SQL Server不喜欢中间有空格的路径!

于 2015-06-01T14:46:07.537 回答