T-SQL中Windows身份验证用户需要创建External_Access或Unsafe程序集的访问权限是什么?

时间:2018-01-11 10:03:42

标签: sqlclr

我正在尝试使用Sqlclr和C#来执行POC以从存储过程调用.Net代码(dll)。我正在尝试写入EventLogs。我能够创建一个安全的程序集,然后在我的dll周围创建一个存储过程包装器。但是在执行代码失败时 - 对于事件日志访问,需要使用External_Access / Unsafe权限集创建程序集。

当我尝试使用外部装配时,它不起作用。所以我选择了从签名的dll创建登录的路线。

  • 我使用Visual Studio签署了dll。在项目属性签名选项卡下,我没有密码(snk文件)签名。

  • 然后我用dll在sql中创建了一个非对称密钥。

  • 使用这个非对称密钥,我创建了一个Login in Master。
  • 然后我授予了此登录外部访问程序集。
  • 更改数据库以使用我尝试创建包装程序的特定数据库
  • 在下一步中,我尝试使用External_Access创建程序集 许可集。
  • 此错误消息 -

Msg 300 - 对象'服务器',数据库'master'

上的外部访问程序集权限被拒绝
  • 然后我尝试了设置Database Trustworthy的路线 开启只是为了检查这个概念是否真的有效。
  • 失败,但同样的例外。

我的问题是我的Windows身份验证登录是否需要具有更多权限才能设置External_Access权限。它需要SA帐户吗?

2 个答案:

答案 0 :(得分:2)

首先,你的意思是在master上运行它(根据错误信息)?

要使用TRUSTWORTHY,用户需要<{3}} 系统管理员,但使用TRUSTWORTHY通常是个坏主意。

要创建具有EXTERNAL_ACCESS的程序集,登录需要服务器上的 EXTERNAL ACCESS ASSEMBLY 权限。要将程序集创建为UNSAFE,登录需要服务器上的 UNSAFE ASSEMBLY 权限。您可以阅读有关here的更多信息。

尼尔斯

答案 1 :(得分:1)

鉴于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部分是在这些约束条件下工作的两种方法。

  1. 如果您使用的是SQL Server 2017,是否尝试过授予基于密钥的非对称登录UNSAFE ASSEMBLY权限?
  2. 除了GRANT EXTERNAL ACCESS ASSEMBLY之外,您是否为该登录做了其他事情?你有DENY什么?
  3. 要尝试的另一件事是将基于非对称密钥的登录添加到sysadmin固定服务器角色:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [{LoginName}];
    

    虽然不应该,但旧版文档(2008 R2及之前版本)声明这是一项要求。我从来不需要这样做,但值得测试,因为如果没有其他工作,它将使我们更接近实际问题。请务必将TRUSTWORTHY设置回您OFF所在的数据库中的ON

  4. 此外,您可能希望查看我在SQL Server Central上编写的一系列文章,这些文章解释了一般使用SQLCLR的各个方面:

    Stairway to SQLCLR