Как зарегистрировать System.DirectoryServices для использования в пользовательских функциях SQL CLR?

Я переношу старый компонент 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?

Ответ 1

Информация, полученная из других ответов, привела меня к решению. Вот шаги, которые я придумал для справок в будущем:

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

В первый раз, когда я запустил инструкцию выше, я получил следующую ошибку:

CREATE ASSEMBLY для сборки "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.

С помощью System.DirectoryServices, правильно зарегистрированного в SQL Server, я теперь могу без труда установить/зарегистрировать зависимую сборку SQL CLR.

Ответ 2

Помогает ли эта статья?

Новая "одобренная SQLCLR" сборка в пакете обновления 1

Люди часто спрашивают о наборе базы которые могут быть безопасно используется в SQLCLR. Обычно принимает форму "могу ли я использовать сборку System.XYZ.dll в процедуре SQLCLR код" или "почему я получаю" сборку System.XYZ.dll не найден ", когда я попробуйте и зарегистрируйте мою собственную сборку, которая называет это? Те, кто слышит чаще всего упоминается System.DirectoryServices.dll(Active Поддержка каталога) или System.Management.dll(поддержка WMI) или System.Remoting.dll и др. Единственный вы используете их для запуска CREATE СБОРКА на них самостоятельно, включает использование PERMISSION_SET = UNSAFE. И каталогизация всех зависимостей. Не для слабых сердце.

Кроме того - CLR SQL Server не поддерживает каждую возможную сборку - найдите списки здесь:

Одна заметка из этой второй статьи MSDN:

Неподдерживаемые библиотеки

Неподдерживаемые библиотеки все еще могут быть вызваны из управляемых хранимых процедур, триггеры, пользовательские функции, пользовательские типы и пользовательские агрегаты. Неподдерживаемая библиотека должна быть сначала зарегистрирована в базе данных SQL Server, используя оператор CREATE ASSEMBLY, прежде чем он сможет использоваться в вашем коде. Любая неподдерживаемая библиотека, которая зарегистрирована и запущена на сервере, должна быть проверены и проверены на безопасность и надежность.

Например, пространство имен System.DirectoryServices не поддерживается. Вы должны зарегистрировать сборку System.DirectoryServices.dll с помощью UNSAFE разрешений, прежде чем вы сможете позвонить из своего кода. Разрешение UNSAFE необходимо, потому что классы в пространстве имен System.DirectoryServices не соответствуют требованиям SAFE или EXTERNAL_ACCESS. Для большего информацию см. в разделе CLR Integration Programming Model Restrictions and Безопасность доступа для кода интеграции CLR.

Ответ 3

Помогает ли это: Создание сборки в SQL Server?

Честно говоря, я мало знаю об использовании CLR SQL Server. Поэтому, если это поможет, я буду придерживаться этого, чтобы научиться самому. =)

РЕДАКТИРОВАТЬ № 1

Вот еще одна интересная ссылка на эту тему.

SQL Server 2005 CLR для интеграции и сбоев регистрации ошибок

Надеюсь, это поможет!

Ответ 4

Хотелось бы добавить, что я потратил целый день, пытаясь зарегистрировать сборку, используя асимметричную подписанную DLL с ошибкой.

., не разрешен для PERMISSION_SET = UNSAFE. Сборка разрешается, когда.,.

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

Позже, чтобы узнать, что сервер SQL не любит пути с пробелами между ними