首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用T更改文件流目录权限?

使用T更改文件流目录权限?
EN

Stack Overflow用户
提问于 2013-03-21 15:29:42
回答 1查看 1.6K关注 0票数 3

SQL Server 2012丝状物结合使用。考虑一下这个SQL脚本:

代码语言:javascript
复制
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创建的。因此,这个文件夹的所有者是Server帐户(通常是MSSQL$SQLEXPRESS)。我的软件要求直接通过NTFS文件系统读取文件,因此我将FilestreamEffectiveLevel设置为3。因此,SQL Server需要写入文件数据的权限(显然),客户端需要读取文件数据的权限。

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

代码语言:javascript
复制
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);
    }
}

由于我的常规用户需要读取对filestream数据的访问权限,所以常规用户必须能够读取C:\Data文件夹。我可以通过右键单击文件夹、提升和添加必要的读取权限来手动修复这个问题。

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

代码语言:javascript
复制
var di = new DirectoryInfo(@"C:\Data");
var ds = di.GetAccessControl();
ds.AddAccessRule(new FileSystemAccessRule(
    @"Everyone",
    FileSystemRights.Read,
    AccessControlType.Allow));
di.SetAccessControl(ds);

是的,如果我运行我的软件提升了它的工作。问题是上面的代码需要在单元测试中运行。在这种情况下,提升Visual会使单元测试的结果变得无用!我确实使用冒充作为管理员运行我的测试,但是没有提升。

摘要

  • SQL Server为filestream数据创建一个目录。
  • 普通用户无法读取该目录。
  • 常规用户需要对此目录进行读取访问。
  • 需要从Unit Test以编程方式授予读取权限。
  • 单元测试是以管理员模拟的方式运行的,但由于明显的原因,没有提升。

问题

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

我能想到几个想法:

  1. 使用某种T-SQL更改权限,而不需要提升。
  2. 使用xp_cmdshell更改权限,而不需要提升。
  3. 在更改权限的C#上运行SQL Server代码。再一次,没有海拔。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 20:05:27

据我所知,Server没有公开使用tell对存储filestream数据的目录更改权限的能力。这个特性是可能的,因为SQL Server拥有这个目录,但它似乎不存在。

您的C#代码在没有提升的情况下无法更新文件权限的原因是您的用户帐户既没有拥有该目录,也没有被授予对它的“更改权限”权限。Administrators组确实具有更改权限的能力,但您必须升级才能使用该组成员资格。同样,除非您想禁用UAC (不推荐)或处理本地安全策略(非常不推荐),否则您无法避免这种情况。

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

代码语言:javascript
复制
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

另见:文档文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15551701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档