调用 CLR 函数时出现 SecurityException 错误 "Revisited"
SecurityException error when calling CLR function "Revisited"
我 运行宁 SQL 仅本地服务器。
我正在使用 VS 2017 社区构建一个项目。
我创建了一个 CLR 过程,并成功地将其作为程序集上传。
class 和方法是 public。
我创建了一个 SQL 标准过程来调用带有 permissions_set = external_access 的 clr 过程。
值得信赖的是。
更改权限设置为 sa.
它所做的只是执行一个bat文件:
cmd.exe c:\temp\test.bat
但我仍然收到错误 6522 安全异常。
当我 运行 将该方法用作控制台应用程序时,它 运行 非常完美。但是在 SQL 服务器中,
不行
如果有任何建议,我将不胜感激 - 这是我第一次尝试使用 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
。是的,这是解决这个烦人问题的简单方法,但这不是一个好的/长期的解决方法,尤其是对于生产而言。有一种方法(实际上是两种方法)可以正确设置以使用非对称密钥/强名称密钥或证书来处理安全性。这两种方法都可以在 Visual Studio / SQL 服务器数据工具 (SSDT) 的结构中工作。这里有一些信息(我在 S.O 上的回答):
还有我的两篇博文,每篇都涉及不同的方法:
- 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 的更多信息,请访问:
我 运行宁 SQL 仅本地服务器。 我正在使用 VS 2017 社区构建一个项目。 我创建了一个 CLR 过程,并成功地将其作为程序集上传。 class 和方法是 public。 我创建了一个 SQL 标准过程来调用带有 permissions_set = external_access 的 clr 过程。 值得信赖的是。 更改权限设置为 sa.
它所做的只是执行一个bat文件: cmd.exe c:\temp\test.bat
但我仍然收到错误 6522 安全异常。
当我 运行 将该方法用作控制台应用程序时,它 运行 非常完美。但是在 SQL 服务器中, 不行
如果有任何建议,我将不胜感激 - 这是我第一次尝试使用 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
。是的,这是解决这个烦人问题的简单方法,但这不是一个好的/长期的解决方法,尤其是对于生产而言。有一种方法(实际上是两种方法)可以正确设置以使用非对称密钥/强名称密钥或证书来处理安全性。这两种方法都可以在 Visual Studio / SQL 服务器数据工具 (SSDT) 的结构中工作。这里有一些信息(我在 S.O 上的回答):
还有我的两篇博文,每篇都涉及不同的方法:
- 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 的更多信息,请访问: