将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创建的。因此,这个文件夹的所有者是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);
}
}由于我的常规用户需要读取对filestream数据的访问权限,所以常规用户必须能够读取C:\Data文件夹。我可以通过右键单击文件夹、提升和添加必要的读取权限来手动修复这个问题。
问题是我不想要这个手动的步骤!当我在我的CreateDatabase()代码中运行C#时,我希望一切都能正确配置。我试过这段代码,但它抛出了一个UnauthorizedAccessException
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目录的读取访问权限?
我能想到几个想法:
T-SQL更改权限,而不需要提升。xp_cmdshell更改权限,而不需要提升。C#上运行SQL Server代码。再一次,没有海拔。我确信SQL Server具有设置权限的能力,因为它实际上拥有该对象。
发布于 2013-03-21 20:05:27
据我所知,Server没有公开使用tell对存储filestream数据的目录更改权限的能力。这个特性是可能的,因为SQL Server拥有这个目录,但它似乎不存在。
您的C#代码在没有提升的情况下无法更新文件权限的原因是您的用户帐户既没有拥有该目录,也没有被授予对它的“更改权限”权限。Administrators组确实具有更改权限的能力,但您必须升级才能使用该组成员资格。同样,除非您想禁用UAC (不推荐)或处理本地安全策略(非常不推荐),否则您无法避免这种情况。
因此,选项2听起来是您的最佳选择。xp_cmdshell将作为拥有目录的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另见:文档,文档
https://stackoverflow.com/questions/15551701
复制相似问题