sql-server - 调用 CLR 函数时出现 SecurityException 错误 "Revisited"

标签 sql-server multithreading security permissions sqlclr

我只在本地运行 SQL Server。
我正在使用 VS 2017 社区构建一个项目。
我创建了一个 CLR 程序,并将其作为程序集成功上传。
类和方法是公开的。
我创建了一个 SQL 标准 proc 以使用 permissions_set = external_access 调用 clr proc。
值得信赖已开启。
更改授权设置为 sa。

它所做的只是执行一个bat文件:
cmd.exe c:\temp\test.bat

但我仍然收到错误 6522 安全异常。

当我将该方法作为控制台应用程序运行时,它运行完美。但在 SQL Server 中,
不行。

如果您有任何建议,我将不胜感激 - 这是我第一次尝试使用 CLR。

Code:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Diagnostics;
using System.Text;


public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void RunTestBat()
    {
        ProcessStartInfo pPStartInfo = new ProcessStartInfo("cmd.exe");
        pPStartInfo.WorkingDirectory = @"C:\Temp";

        pPStartInfo.UseShellExecute = true;
        pPStartInfo.Arguments = string.Format(@" /C test.bat");

        Process p = new Process();
        p.StartInfo = pPStartInfo;        
        p.Start();
        p.WaitForExit();
    }
};

最佳答案

[SQLCLR] proc with permissions_set = external_access



那就是问题所在。您正在使用线程,这需要 PERMISSION_SET成为 UNSAFE .

此外,虽然 Visual Studio 在这方面提供的帮助很少,但通常不应将数据库设置为 TRUSTWORTHY ON。 .是的,这是解决这个烦人问题的简单方法,但它不是一个好的/长期的解决方法,尤其是对于生产而言。有一种方法(实际上是两种方法)可以正确设置以使用非对称 key /强名称 key 或证书来处理安全性。这两种方法都可以在 Visual Studio/SQL Server Data Tools (SSDT) 的结构中工作。这里有一些信息(我在 S.O. 上的回答):

CLR Strict Security on SQL Server 2017

还有我的两篇博客文章,每一篇都处理不同的方法:
  • SQLCLR vs. SQL Server 2017, Part 2: “CLR strict security” – Solution 1
  • SQLCLR vs. SQL Server 2017, Part 3: “CLR strict security” – Solution 2

  • 有关一般使用 SQLCLR 的更多信息,请访问:

    SQLCLR.org

    关于sql-server - 调用 CLR 函数时出现 SecurityException 错误 "Revisited",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52303084/

    相关文章:

    sql-server - Docker Container 运行后立即退出

    c# - 如何监控 Parallel.ForEach 的进度

    计算系统调用次数

    Java 安全 : how to clear/zero-out memory associated with an object?(和/或确保这是特定变量的唯一实例/副本)

    sql - 如果没有行匹配,这个计数怎么会返回 0?

    sql - 在 SQL Server 中解析 XML 并将其导入表

    python - SQL服务器: find list of records in one select query that are not in another select query

    c# - 在单独的线程中启动 WPF 窗口

    使用多个线程计算素数

    javascript - 谷歌分析电子商务跟踪