使用T-SQL修改filstream目录权限

本文关键字:权限 filstream T-SQL 修改 使用 | 更新日期: 2023-09-27 18:05:13

使用SQL Server 2012与文件流。考虑以下SQL脚本:

CREATE DATABASE [Test]
GO
ALTER DATABASE [Test] ADD FILEGROUP [FileStream] CONTAINS FILESTREAM
GO
ALTER DATABASE [Test] ADD FILE (
    NAME = 'Test_FileStream',
    FILENAME = 'C:'Data')
    TO FILEGROUP [FileStream]
GO

显然,C:'Data文件夹是由SQL Server创建的。因此,此文件夹的所有者是SQL Server帐户(通常为MSSQL$SQLEXPRESS)。我的软件需要通过NTFS文件系统直接读取文件流,因此我将FilestreamEffectiveLevel设置为3的值。因此,SQL Server需要写入文件流数据的权利(显然),客户端需要读取文件流数据的权利。

客户端将使用SqlFileStream读取数据:

using (var transaction = new TransactionScope())
{
    var fileStreamData = GetFileStreamData();
    using (var stream = new SqlFileStream(
        fileStreamData.FilePath,
        fileStreamData.TransactionContext,
        FileAccess.Read,
        FileOptions.SequentialScan,
        0))
    {
        var data = new byte[stream.Length];
        stream.Read(data, 0, data.Length);
    }
}

由于我的普通用户需要读访问文件流数据,C:'Data文件夹必须是普通用户可读的。我可以手动解决这个问题,右键单击文件夹,提升,并添加必要的读取权限。

问题是我不想要这个手动步骤!当我在C#代码中运行CreateDatabase()时,我希望所有内容都正确配置。我尝试了这个代码,但是它抛出了一个UnauthorizedAccessException:

var di = new DirectoryInfo(@"C:'Data");
var ds = di.GetAccessControl();
ds.AddAccessRule(new FileSystemAccessRule(
    @"Everyone",
    FileSystemRights.Read,
    AccessControlType.Allow));
di.SetAccessControl(ds);

是的,如果我运行我的软件升高它工作。问题是上面的代码需要在单元测试中运行。在这种情况下,提升Visual Studio将使单元测试的结果变得无用!我以管理员身份使用模拟运行测试,但未提升。

总结
  • SQL Server为文件流数据创建一个目录。
  • 普通用户无法读取该目录
  • 普通用户需要对该目录进行读访问。
  • 读权限需要从Unit Test编程授予。
  • 单元测试以模拟管理员的身份运行,但由于明显的原因不会提升。

我如何告诉SQL Server授予某些组/用户对新建的filestream目录的读访问权限?

我能想到几个主意:

  1. 在不需要提升的情况下,使用某种T-SQL来改变权限。
  2. 使用xp_cmdshell修改权限而不需要提升。
  3. SQL Server上运行C# code,修改权限。同样,没有海拔

我确信SQL Server有能力设置权限,因为它实际上拥有对象。

使用T-SQL修改filstream目录权限

据我所知,SQL Server不公开使用T-SQL更改存储文件流数据的目录权限的能力。此特性是可能的,因为SQL Server拥有该目录,但它似乎不存在。

你的c#代码不能在没有提升的情况下更新文件权限的原因是因为你的用户帐户既不拥有目录也没有被授予"更改权限"权限。Administrators组确实具有更改权限的能力,但是您必须进行升级才能使用该组成员资格。同样,除非你想禁用UAC(不推荐)或打乱本地安全策略(very不推荐),否则你没有办法解决这个问题。

因此,选项2听起来是最好的选择。xp_cmdshell将作为拥有该目录的SQL Server服务帐户运行您的命令,因此它应该能够更改ACL。您可以使用cacls命令更改该文件夹的权限。您可能想要一个类似这样的命令:

cacls "C:'Data" /e /g Users:r
    cacls      -- Change ACLs
    "C:'Data"  -- Directory to change
    /e         -- Edit the current ACL instad of replacing it
    /g Users:r -- Grant the "Users" group read-only access

参见:cacls文档,xp_cmdshell文档