c# - 使用 T-SQL 更改 filstream 目录权限?

标签 c# sql-server unit-testing filestream

使用 SQL Server 2012 filestreams .考虑这个 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服务器 需要写入 文件流数据的权限(显然),客户端需要读取 文件流数据的权限。

客户端将使用 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 将使单元测试的结果变得无用!我确实以管理员身份使用 impersonation 运行我的测试, 但未提升。

总结

  • SQL Server 为文件流数据创建一个目录。
  • 普通用户无法读取该目录。
  • 普通用户需要对此目录的读取权限。
  • 需要通过单元测试以编程方式授予读取权限。
  • 单元测试以模拟管理员的身份运行,但出于显而易见的原因未提升。

问题

我如何告诉 SQL Server 授予某些组/用户对新创建的文件流目录的读取权限?

我可以想到几个想法:

  1. 使用某种 T-SQL 无需提升即可更改权限。
  2. 无需提升即可使用 xp_cmdshell 更改权限。
  3. 在更改权限的 SQL Server 上运行 C# 代码。同样,没有提升。

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

最佳答案

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

您的 C# 代码无法在没有提升的情况下更新文件权限的原因是您的用户帐户既不拥有该目录,也没有被授予对其的“更改权限”权限。 Administrators 组确实可以更改权限,但您必须提升权限才能使用该组成员身份。同样,除非您想禁用 UAC(不推荐)或破坏本地安全策略(非常不推荐),否则您没有办法解决这个问题。

因此,选项 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 documentation , xp_cmdshell documentation

关于c# - 使用 T-SQL 更改 filstream 目录权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551701/

相关文章:

Sql IN 子句会降低性能

java - 尝试为 JPA 表添加新值时出错

SQL 服务器 : SELECT rows using ROW_NUMBER and CASE statement

java - Junit 模拟对象

android - 无法使用 Gradle (decard-gradle) 构建测试

c# - 是否有任何与 C# winforms 应用程序不兼容的开源许可证?

c# - GLSL 自旋锁永远阻塞

c# - WPF Mahapps - 如何隐藏汉堡菜单集合中的选项卡?

c# - 从 MVC 应用程序发送文件到 Web API 性能

android - 针对 Firebase 的单元测试确保触发回调