Sql server SQL xp\u为非管理员创建\u子目录

Sql server SQL xp\u为非管理员创建\u子目录,sql-server,Sql Server,我想让非管理员能够使用xp_create_subdir在SQL server的本地硬盘上创建文件夹。原因-需要创建文件夹结构,以便制造设备可以FTP大型文件。文件的元数据存储在SQL中 服务器是SQL 2016 Express。操作系统是Windows10Pro 我已经找到了很多关于如何让它工作的解释,但是我不知道我遗漏了什么。我使用SA帐户创建了如下存储过程: use [DBname] CREATE PROCEDURE dbo.usp_CreateDirectory @director

我想让非管理员能够使用xp_create_subdir在SQL server的本地硬盘上创建文件夹。原因-需要创建文件夹结构,以便制造设备可以FTP大型文件。文件的元数据存储在SQL中

服务器是SQL 2016 Express。操作系统是Windows10Pro

我已经找到了很多关于如何让它工作的解释,但是我不知道我遗漏了什么。我使用SA帐户创建了如下存储过程:

use [DBname]
CREATE PROCEDURE dbo.usp_CreateDirectory
    @directoryFullPath varchar(500)
WITH EXECUTE AS owner
AS
BEGIN
    SET NOCOUNT ON;
    EXEC master.dbo.xp_create_subdir @directoryFullPath;
END
GO
GRANT EXECUTE ON dbo.usp_CreateDirectory TO [TestUser]
GO
运行存储过程的代码:

DECLARE @RC int
DECLARE @directoryFullPath varchar(500)
set @directoryFullPath = 'd:\FTP_Root\2020\08\22\'
EXECUTE @RC = dbo.usp_CreateDirectory
   @directoryFullPath
GO
在Windows中,我已授予NT Service\MSSQL${InstanceName}对d:\FTP\u Root的完全访问权限\

我错过了什么?在MSSMS中运行xp\u create\u subdir'C:\FTP\u Root\2020\08\22'可以正常工作

以SA或非管理员TestUser身份运行存储过程会得到以下结果:

Msg 229,14级,状态5,程序xp\u创建\u子目录,第1行[批次] 开始行2]对象的执行权限被拒绝 “xp\u create\u subdir”、数据库“mssqlsystemresource”、架构“sys”


我在另一个网站上发现:

这里的标题有两个要点

  • 虽然这个职位很老,, 为了解决这个问题,您应该确保您的数据库是可信的,因为SP xp_create_subdir位于不同的数据库上

    您仍然需要将“with Execute”设置为“dbo”

    alter database[DBNAME]在上设置可信

    -

  • 并且一定要理解在上使用SET Trusty的安全性后果。这可能不是问题,也可能是。这要看情况而定,但在阅读之前你不会知道

    -

  • 在这一点上,我完全同意Jeff的观点。如果您远程关注安全性,请在调整之前了解可信设置的作用


    我认为这里更大的问题是问为什么SQL Server需要创建目录?Powershell可以查询数据库中的目录路径并创建目录。您可以拥有一个SQL Server代理作业,该作业将在SQL Server代理帐户或SQL代理服务帐户的安全上下文中执行此操作(我会亲自选择代理账户,但那只是我自己).

    值得信赖的设置解决了这个问题。使用SQL代理运行SQL Express。这不是一个选项。我可以使用Powershell脚本和Windows调度程序,但需要将频率设置得相当高,但使用xp_create_subdir要容易得多,因为我可以在需要时准确触发它。我很高兴它能为您工作。另外一点警告:om我在Trusty=ON方面的经验。如果您的环境可能会根据CIS基线进行审核,那么您可能需要更多地了解它为什么会启用。