使用 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
授予某些组/用户对新创建的文件流目录的读取权限?
我可以想到几个想法:
- 使用某种
T-SQL
无需提升即可更改权限。 - 无需提升即可使用
xp_cmdshell
更改权限。 - 在更改权限的
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
关于c# - 使用 T-SQL 更改 filstream 目录权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551701/