T-SQL 中的 Windows 经过身份验证的用户需要什么访问权限才能创建 External_Access 或不安全程序集?
What access does a Windows authenticated user in T-SQL need to create an External_Access or Unsafe Assembly?
我正在尝试使用 Sqlclr 和 C# 进行 POC,以从存储过程调用 .Net 代码 (dll)。我正在尝试写入 EventLogs。我能够创建一个安全程序集,然后围绕我的 dll 创建一个存储过程包装器。但是在执行代码时它失败了——为了访问事件日志,需要使用 External_Access/ Unsafe 权限集创建程序集。
当我对外部组件进行同样的尝试时,它不起作用。所以我选择了从签名的 dll 创建登录的路线。
我使用 Visual Studio 签署了 dll。在项目属性签名选项卡下,我在没有密码的情况下签名(snk 文件)。
然后我使用 dll 在 sql 中创建了一个非对称密钥。
- 使用这个非对称密钥,我在 Master 中创建了一个登录名。
- 然后我授予了这个登录外部访问程序集。
- 更改数据库以使用我试图在其中创建包装程序的特定数据库
- 在下一步中,我尝试使用 External_Access 创建程序集
权限集。
- 失败并显示错误消息 -
消息 300 -
对象 'server'、数据库 'master'
的外部访问程序集权限被拒绝
- 然后我尝试通过设置 Database Trustworthy 的途径
到 ON 只是为了检查这个概念是否真的有效。
- 这失败了,出现了同样的异常。
我的问题是我的 Windows 身份验证登录是否需要更多权限才能设置 External_Access 权限。是否需要 SA 帐户?
首先,您的意思是 运行 在 master 上执行此操作(根据错误消息)?
要使用 TRUSTWORTHY
,用户需要 sysadmin 按照 here,但使用 TRUSTWORTHY
通常不是一个好主意。
要使用 EXTERNAL_ACCESS
创建程序集,登录需要对服务器有 EXTERNAL ACCESS ASSEMBLY 权限。要将程序集创建为 UNSAFE
,登录需要对服务器具有 UNSAFE ASSEMBLY 权限。您可以阅读更多相关信息 here。
尼尔斯
如果 SQL Server 2017 中与创建程序集相关的安全方面发生了相当大的变化,那么了解您正在使用的 SQL Server 版本将大有帮助.我写了一系列文章来解释 SQL Server 2017 中的总体问题,并提供了一些可以在 Visual Studio / SSDT:
中自动执行的解决方案
SQLCLR vs. SQL Server 2017, Part 1: “CLR strict security” – The Problem
第 1 部分主要是解释,而第 2 部分和第 3 部分是在这些限制条件下工作的两种方法。
- 如果您使用的是 SQL Server 2017,您是否尝试过授予基于非对称密钥的登录
UNSAFE ASSEMBLY
权限?
- 除了
GRANT EXTERNAL ACCESS ASSEMBLY
之外,您还为该登录做了其他事情吗?你DENY
有什么事吗?
另一件事是将基于非对称密钥的登录添加到 sysadmin
固定服务器角色:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [{LoginName}];
虽然这 不应该 是必要的,但较旧的文档(2008 R2 及之前)声明这是一项要求。我从来不需要这样做,但值得测试,因为如果没有别的办法,它会让我们更接近实际问题。请务必在您将其变为 ON
.
的数据库中将 TRUSTWORTHY
设置回 OFF
此外,您可能想查看我在 SQL Server Central 上撰写的系列文章,这些文章一般解释了使用 SQLCLR 的各个方面:
我正在尝试使用 Sqlclr 和 C# 进行 POC,以从存储过程调用 .Net 代码 (dll)。我正在尝试写入 EventLogs。我能够创建一个安全程序集,然后围绕我的 dll 创建一个存储过程包装器。但是在执行代码时它失败了——为了访问事件日志,需要使用 External_Access/ Unsafe 权限集创建程序集。
当我对外部组件进行同样的尝试时,它不起作用。所以我选择了从签名的 dll 创建登录的路线。
我使用 Visual Studio 签署了 dll。在项目属性签名选项卡下,我在没有密码的情况下签名(snk 文件)。
然后我使用 dll 在 sql 中创建了一个非对称密钥。
- 使用这个非对称密钥,我在 Master 中创建了一个登录名。
- 然后我授予了这个登录外部访问程序集。
- 更改数据库以使用我试图在其中创建包装程序的特定数据库
- 在下一步中,我尝试使用 External_Access 创建程序集 权限集。
- 失败并显示错误消息 -
消息 300 - 对象 'server'、数据库 'master'
的外部访问程序集权限被拒绝- 然后我尝试通过设置 Database Trustworthy 的途径 到 ON 只是为了检查这个概念是否真的有效。
- 这失败了,出现了同样的异常。
我的问题是我的 Windows 身份验证登录是否需要更多权限才能设置 External_Access 权限。是否需要 SA 帐户?
首先,您的意思是 运行 在 master 上执行此操作(根据错误消息)?
要使用 TRUSTWORTHY
,用户需要 sysadmin 按照 here,但使用 TRUSTWORTHY
通常不是一个好主意。
要使用 EXTERNAL_ACCESS
创建程序集,登录需要对服务器有 EXTERNAL ACCESS ASSEMBLY 权限。要将程序集创建为 UNSAFE
,登录需要对服务器具有 UNSAFE ASSEMBLY 权限。您可以阅读更多相关信息 here。
尼尔斯
如果 SQL Server 2017 中与创建程序集相关的安全方面发生了相当大的变化,那么了解您正在使用的 SQL Server 版本将大有帮助.我写了一系列文章来解释 SQL Server 2017 中的总体问题,并提供了一些可以在 Visual Studio / SSDT:
中自动执行的解决方案SQLCLR vs. SQL Server 2017, Part 1: “CLR strict security” – The Problem
第 1 部分主要是解释,而第 2 部分和第 3 部分是在这些限制条件下工作的两种方法。
- 如果您使用的是 SQL Server 2017,您是否尝试过授予基于非对称密钥的登录
UNSAFE ASSEMBLY
权限? - 除了
GRANT EXTERNAL ACCESS ASSEMBLY
之外,您还为该登录做了其他事情吗?你DENY
有什么事吗? 另一件事是将基于非对称密钥的登录添加到
sysadmin
固定服务器角色:ALTER SERVER ROLE [sysadmin] ADD MEMBER [{LoginName}];
虽然这 不应该 是必要的,但较旧的文档(2008 R2 及之前)声明这是一项要求。我从来不需要这样做,但值得测试,因为如果没有别的办法,它会让我们更接近实际问题。请务必在您将其变为
ON
. 的数据库中将
TRUSTWORTHY
设置回 OFF
此外,您可能想查看我在 SQL Server Central 上撰写的系列文章,这些文章一般解释了使用 SQLCLR 的各个方面: