AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 180142
Accepted
John K. N.
John K. N.
Asked: 2017-07-19 07:20:21 +0800 CST2017-07-19 07:20:21 +0800 CST 2017-07-19 07:20:21 +0800 CST

寻找 FILESTREAM 内幕信息

  • 772

在 Microsoft SQL Server 2012 上激活 FILESTREAM 功能后,SQL Server 将在系统上创建一个“隐藏”共享。份额定义如下:

Sharename          FILESTREAM_SHARE
Path               \\?\GLOBALROOT\Device\RsFx0320\<localmachine>\FILESTREAM_SHARE
Remark             SQL Server FILESTREAM share
Maximum users      unlimited
Users Caching      Manual caching of documents 
Permissions        NT-AUTHORITY\Authenticated Users, FULL

该名称是您在SQL Server 配置管理器中最初配置 FILESTREAM 时提供的共享名称。但它是为了什么?

至今

我从以下位置开始通读所有可用的 FILESTREAM 文档:

  • 文件流(SQL 服务器)
  • 启用和配置 FILESTREAM
  • 创建启用 FILESTREAM 的数据库
  • 创建用于存储 FILESTREAM 数据的表
  • ...以及所有相关的
  • FILESTREAM 与其他 SQL Server 功能的兼容性
  • FILESTREAM DDL、函数、存储过程和视图
  • 使用 OpenSqlFilestream 访问 FILESTREAM 数据
  • 论文SQL Server 2008 - SQL Server 2008 中的 FILESTREAM 存储
  • 和文章FILESTREAM (OLTP)---a Technical Reference Guide for Designing Mission-Critical OLTP Solutions参考了许多其他材料

...但没有提及份额及其作用或用途。您输入名称,SQL Server 将在后台创建共享。

启用 FILESTREAM 的数据库

当您创建启用 FILESTREAM 的数据库时,该数据库引用一个文件组,该文件组引用一个与共享完全无关的目录(建议在单独的驱动器上),该目录最初是在 FILESTREAM 配置期间创建的。

屏幕截图 启用 FILESTREAM 的数据库脚本

创建启用 FILESTREAM 的数据库的脚本 是的,我确实意识到所有路径都在 C:; 这只是一个例子

Paul Randall 等人的白皮书。继续解释...

FILESTREAM 数据存储在文件系统中一组称为数据容器的 NTFS 目录中,这些目录对应于数据库中的特殊文件组。对 FILESTREAM 数据的事务访问由 SQL Server 和作为在 Windows 级别启用 FILESTREAM 的一部分而安装的文件系统筛选器驱动程序控制。使用文件系统过滤器驱动程序还允许通过 UNC 路径远程访问 FILESTREAM 数据。SQL Server 维护从表行到与其关联的 FILESTREAM 文件的排序链接。这意味着直接通过文件系统删除或重命名任何 FILESTREAM 文件将导致数据库损坏。

...在文档(第 14 页)的更下方,他们继续进行...

每个具有 FILESTREAM 数据容器的 NTFS 卷都有一个 FILESTREAM 文件系统筛选器驱动程序,并且每个版本的 SQL Server 都有一个在卷上具有 FILESTREAM 数据容器的驱动程序。每个筛选器驱动程序负责管理该卷的所有 FILESTREAM 数据容器,以及使用特定 SQL Server 版本的所有实例。

例如,托管三个 FILESTREAM 数据容器(三个 SQL Server 2008 实例各一个)的 NTFS 卷将只有一个 SQL Server 2008 FILESTREAM 文件系统筛选器驱动程序。

问题

  1. 很高兴知道 SQL Server 的一切都很好并且捆绑在一起,但是这个共享实际上有什么作用呢?它是所谓的“文件系统过滤驱动程序”吗?
  2. 看到任何经过身份验证的用户都可以访问“共享”,安全隐患是什么?
  3. 设备 RsFx0320 是 Windows Server 2012 引入的弹性文件系统格式的前身吗?

如果您可以提供我的问题的答案,那么如果您可以提供源参考,那就太好了。

sql-server sql-server-2008
  • 2 2 个回答
  • 1860 Views

2 个回答

  • Voted
  1. Best Answer
    Sean Gallardy
    2017-07-28T15:03:09+08:002017-07-28T15:03:09+08:00

    在 Microsoft SQL Server 2012 上激活 FILESTREAM 功能后,SQL Server 将在系统上创建一个“隐藏”共享。

    默认情况下它不这样做,您必须选择启用共享。这是通过 SQL Server 配置管理器完成的。如果您取消选择Enable FILESTREAM for file I/O access,共享将被删除。

    在此处输入图像描述

    1. 很高兴知道 SQL Server 的一切都很好并且捆绑在一起,但是这个共享实际上有什么作用呢?

    该共享允许客户端(本地和远程)拥有一个单一的共享位置,以使用流式 Windows api 访问文件流数据。这与用于文件流访问的 SQL Server 实例级别设置结合使用Full Access Enabled,任何其他访问设置都不应与流 API 一起使用。

    在此处输入图像描述

    1. ...是所谓的“文件系统过滤驱动程序”吗?

    不它不是。这只是一个文件共享。

    我试图不弄混水,但您确实要求提供尽可能多的信息。实际上,在上面的删除线文本中,我确实说这不是过滤器驱动程序。然而,这在技术上是半真半假的。是的,它是一个共享文件夹,但它实际上是通过过滤器驱动程序共享的。我真的对此进行了辩论,因为它开始变成一个没有源代码的兔子洞,你真的无法进入(老实说,在我看来,除了学术之外,它没有什么价值)。

    过滤器驱动程序的重点是做一些事情,但其中之一是通过各种接口对存储在文件流目标中的数据进行事务访问;SQL Server、Transact SQL、Windows API。它还执行一些其他项目 - 但是通过共享提供的访问权限是通过过滤器驱动程序完成的。事实上,如果您尝试访问文件流中的文件并且不是管理员或 SQL Server,您应该无法访问它们。

    所以,是的,这既是也不是过滤器驱动程序。它是通过过滤器驱动程序公开的一半 Windows 文件共享。您可以看到这是您查看共享的路径属性。

    get-wmiobject -class Win32_share | where {$_.Description -like 'SQL Server*'} | ft name, path -autosize
    

    2.看到任何经过身份验证的用户都可以访问“共享”,有什么安全隐患?

    您可以更改权限并要求正确设置设置。安全隐患是任何其他文件共享的安全隐患。

    3. 设备 RsFx0320 是 Windows Server 2012 引入的弹性文件系统格式的前身吗?

    不,这是特定版本的过滤器驱动程序的名称。例如,这是一个加载 2016 的系统RsFx0410。ReFS 是一个文件系统,这是一个位于文件系统和微型端口驱动程序之间的过滤器驱动程序。实际上,令人不安的是,这是一个遗留过滤器驱动程序,由高度末端的 .10 表示......嗯。您还会注意到它的高度相当低,这对于 3rd 方过滤器驱动程序通常是不可接受的。

    在此处输入图像描述

    如果您可以提供我的问题的答案,那么如果您可以提供源参考,那就太好了。

    我没有这方面的来源,但通过屏幕截图和更改设置的配置选项备份了我的信息。通过查看产品本身并了解窗口的工作原理(例如:过滤器驱动程序),可以找到此答案中的所有内容。

    • 5
  2. Sting
    2017-07-28T08:20:08+08:002017-07-28T08:20:08+08:00

    以下是我对您的问题的看法:

    1. 很高兴知道 SQL Server 拥有一切美好的东西并且捆绑在一起,但这个共享实际上有什么作用?它是所谓的“文件系统过滤驱动程序”吗?

    SQL Server 文件流访问就是对文件的访问。共享通过文件共享提供该位置。

    您可以使用 OpenSqlFilestream 上的一些 C# 代码轻松地看到这一点

    https://learn.microsoft.com/en-us/sql/relational-databases/blob/access-filestream-data-with-opensqlfilestream

    如您所见,CreateFile 没有 FILE_SHARE_READ,也没有文件魔术,没有文件流:

    try
        {
            if ( (srcHandle = CreateFile(
                srcFilePath,
                GENERIC_READ,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_FLAG_SEQUENTIAL_SCAN,
                NULL)) == INVALID_HANDLE_VALUE )
                throw szErrMsgSrc;
    

    注意: 至于为什么没有本地服务器/无共享 FILESTREAM 选项——我不知道。听起来有些人可能会喜欢这种额外的安全级别。

    2.看到任何经过身份验证的用户都可以访问“共享”,有什么安全隐患?

    哇,好问题。看来,任何经过身份验证的用户都可以使用共享权限,但是,底层的 NTFS 权限应该微调安全性。但是,这对我来说似乎是一个安全漏洞。我必须进一步调查 NTFS 权限的微调程度,但我绝对不喜欢通用文件共享权限。加油微软,所有“经过身份验证的用户”?对或错,我认为微软倾向于忽略共享/关注 NTFS 权限。

    多年来,提供​​“经过身份验证的用户”一直是一个争论不休的话题。这是我反复阅读的关于“经过身份验证的用户”的最佳博客之一。它在 Windows 中根深蒂固,我认为他们不会说这是一个合法的风险——直到他们的新产品问世并摆脱它。

    https://social.technet.microsoft.com/Forums/windowsserver/en-US/bb74fa7c-89bd-476d-88bf-e88cd66618e6/why-is-authenticated-users-in-the-local-users-group-by-默认?论坛=winserversecurity

    3. 设备 RsFx0320 是 Windows Server 2012 引入的弹性文件系统格式的前身吗?

    看起来是基于 SQL 而不是基于 O/S。RsFx0320.sys 是 SQL 2008。如下所示,SQL 2012 是 RsFx0201.sys,SQL 2014 是 RsFx0300.sys:

    https://support.microsoft.com/en-us/help/2961258/fix-cannot-access-the-data-in-filetable-after-you-upgrade-from-sql-ser

    Microsoft 展示了当您从 2012 升级到 2014 时会发生什么:

    To work around this issue, change manually the path property of the resource <AvailabilityGroupName>_FSShare to point to the correct driver: From
    '\\?\GLOBALROOT\Device\RsFx0201\<localmachine>\{AvailabilityGroupID}' to '\\?\GLOBALROOT\Device\RsFx0300\<localmachine>\{AvailabilityGroupID}'
    
    • 2

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve