原文地址: http://www.microsoft.com/msj/1198/ntfs/ntfs.aspx
加密数据流
加密是NTFS 5.0的又一个新功能,它可以保护你的数据免受那些对机器有物理访问的用户的侵扰。当单个机器共享多人时,你的电脑被偷了,或者你讨厌的同事在你的电脑上乱搞时,加密可以保护你的数据。然而加密不能阻止其他人访问你的文件,它做的是阻止文件流的内容被他人所理解。
NTFS系统加密利用CryptoAPI的优势来创建公共密钥。加密密钥存储在一个非分页池里,这样不被写在硬盘上,就不会被偷了。此外,密钥可以存在安全设备上,比如智能卡。虽然远程服务器上的文件可以加密,但数据本身在网络上不是加密的。如果这个对你很重要,你要使用类似安全套接字层的东西(SSL)。加密可以施加在文件上(文件的各种流),或者目录本身,同时流数据的加密解密对应用程序来说是透明的。
如果一个员工离开了公司或者丢失了加密密钥,NTFS系统有内置的恢复支持,那么加密的数据可以被访问。实际上,NTFS不会允许文件被加密,除非系统被配置了至少有一个恢复密钥。对于一个域名环境,恢复密钥在域控制器处定义,所有同域名下的机器被强制使用该密钥。对于广大家庭用户,NTFS自动生成恢复密钥,把该密钥保存为机器密码。你可以在管理员账户上使用命令行工具来恢复数据。
判断文件系统是否支持加密,调用GetVolumeInformation,检查FILE_SUPPORTS_ENCRYPTION位标志。要加密、解密时,简单调用一下EncryptFile或者DecryptFile就可以了。这两个函数可以操作文件的任意流,也可以开启或关闭子文件夹下的所有文件,你可以调用GetFileAttributes,检查FILE_ATTRIBUTE_ENCRYPTED位标志来检查文件是否被加密了。
NT 5.0自带了一个命令行工具,叫Cipher.exe。很容易处理加密文件流。用它,你可以加密或解密文件以及目录,设置恢复策略。新的Win32 函数 openEncryptedFileRaw,readEncrypedFileRaw,WriteEncrypedFileRaw,CloseEncrytedFileRaw,允许应用程序打开文件的加密内容,并正常的读写。
多分点
多分点,NTFS 5.0又一个新功能,允许一段代码在文件或目录被打开时执行,重分析点(多分点)是系统控制属性,可以和任何文件或目录关联,多分点的值是用户控制数据,最大是16KB。重分析数据含有一个32位重分析标志(微软定义),**表示哪些文件系统过滤器被通知重分析属性关联的文件或目录正在被访问。文件系统过滤器可以执行任何代码来控制文件或目录的访问。因为多分点属性的值最大是16KB,所有附加的数据都可以具有各种意义的文件系统过滤器。文件系统过滤器能完全改变文件数据的模样,所以WIndowsNT只允许管理员来安装新的文件系统过滤器。如果系统依照多分析标志不能找到文件系统过滤器,那么文件和目录就不可访问;可是,它们可以被删掉。
多分点用来创建NTFS目录结?NTFS目录结允许你重定向文件/文件夹请求到另一个位置。举个例子,好比你有一个C:\CDROM这样的目录。如果你在这个目录放了一个目录结,把它指向你的X:\驱动器,在Shell命令行发出一个DIR命令,你实际得到的是你的CD-Rom驱动器目录。只有空目录可以有一个关联的多分点,一旦该目录有了多分点后,目录下将不能再创建任何文件和子文件夹。
NTFS目录结允许你把现有的单个目录从多个位置被访问。文件的硬链接和这个类似,除了一点,不能保证系统里是不是存在这个目标目录。鉴于安全原因,系统不会允许你依照UNC路径或映射驱动器来创建目录结。如果你要这么做,你可以使用分布式文件系统(DFS)设备,把不同机器上的卷映射到一个命名空间。**对于本地卷,卷安装点函数(SetVolumeMountPoint)把本机上所有的卷移植到同一个本地命名空间。
没有Win32 函数提供给创建一个NTFS目录结,也没有界面或工具来允许用户创建。有一个WINDOWS NT DDK自带的,LINKD.EXE,可以来创建,我们希望微软将来公开更多的目录结技术。
一如往常,你可以调用GetVolumeInformation,检查FILE_SUPPORT_REPARSE_POINTS标志为来判断文件系统是否支持多分点。调用GetFileAttribute检查FILE_ATTRIBUTE_REPARSE_POINT标志位来判断某个目录或文件有多分点。调用CreateFile,打开某个文件或目录,然后调用DeviceIoControl传入FSCTL_SET_REPARSE_POINT 或是FSCTL_GET_REPARSE_POINT来设置/获取文件/文件夹的多分点数据。传入FSCTL_DELETE_REPARSE_POINT控制码来删掉多分点。顺便说一下,调用CreateFile函数打开一个目录时,不要忘了指定FILE_FLAG_BACKUP_SEMANTICS标志。
正常情况下,当你打开有多分点关联的文件时,文件系统会通知相应的文件系统过滤器,过滤器稍后会更新或修改这个打开文件的程序,应用程序可以打开文件并在CreateFile时传入FILE_FLAG_OPEN_REPARSE_POINT标志位来显式禁止多分点的修改。这就能让应用程序获取到文件/文件夹流中的原始数据。在调用CreateFile时传入FILE_FLAG_OPEN_REPARSE_POINT,你尽可以设置、获取、删掉文件的多分点数据,如果不这么做的话,文件系统过滤器会禁止你访问多分点的请求。
多分点唯一有用的地方是在和文件系统过滤器结合时,所以我们不写例子程序来演示怎么设置和获取、删除等操作了。理解多分点很有用,因为Windows NT 5.0计划附带的很多新功能(用文件系统过滤器实现的)都需要多分点。
举个例子,新的分级存储管理服务要把一个文件从用户硬盘移动到辅助存储设备,文件的存储从硬盘上移走了(簇已经被释放),但是文件条目仍然在硬盘上,**要获取多分点属性。当用户试图修改文件时,分级存储管理文件系统过滤器把文件从辅助存储设备拷贝到硬盘,移除多分点,进而允许应用程序正常的修改文件。
另一个使用多分点服务是本地结构化存储(NSS)服务,NSS文件系统过滤器在硬盘上制造出一个文件,看起来像OLE-结构化存储文件,OLE文档可能包含文字文档、电子表格、PPT演示文稿等等数据,从历史上看,OLE库把所有这些不同的嵌入式对象数据放到一个文件中。这样使得复制文件和携带一切嵌入式对象很容易。但如果你修改这些对象时,更新的对象放在文件的末尾,旧对象在文件中没有移除。旧有对象没得到移除而提高性能;如果OLE移除了这些旧对象,那就要在硬盘里重写整个文件了,浪费了时间。OLE文档文件因此远远大于自己所需要的大小,浪费了大量磁盘空间。
利用NTFS 5.0其对于数据流、多分点、NSS的支持,OLE不再浪费宝贵的磁盘集群(簇)了,不再有性能上的损失了。每一个嵌入式对象现在在文件都有驻留自己相应的数据流。更新对象意味着一个新流为新对象创建,原数据流被销毁,引起文件系统回收磁盘空间。NSS文件系统过滤器使这些操作对应用程序透明。NSS过滤器也允许NSS文件被复制到软盘,文件转化成旧文件格式,**反之亦然。
另一个使用多分点标志的服务时单实例存储服务(SIS),这个服务允许硬盘上的文件经由不同的名字但只有一次来访问。这很像文件硬链接,不同的是,每一处文件的引用都有自己的属性集。
分层存储管理,本机结构存储,单实例存储将包括在以后的文章中。
配额,指标
NTFS下的硬盘配额允许管理员来控制每个用户在一个NTFS卷上持有多大的磁盘空间,磁盘指标完全透明给用户。如果用户试图超出其指标,系统会提示磁盘已满。用户可以删除文件来回收磁盘空间,让其他用户来取得部分文件的所有权,增加用户的指标。当文件创建时,文件所有者的安全ID和文件关联起来,该文件数据流的存储占用与文件所有者相抵。
指标是基于文件的逻辑大小。这意味着一个文件正常情况是10MB,但被压缩至8MB大小,算作10MB的磁盘配额。同样,一个稀疏文件逻辑上大小是10MB,但实际上是0字节的存储也算作10MB的硬盘配额。**这个功能,设计用来允许不同的卷指标设置可以比较。
管理员可以在NTFS卷属性页的指标标签下决定如何配置配额。
缺省情况,NTFS卷第一次打开时配额追踪是禁用的,管理员可以修改,告诉NTFS 系统追踪用户的配额,而无需实际执行对用户的任何限制。这就允许了管理员监视每个用户拥有的存储是多少。这项功能开启之后,系统会浏览驱动器的所有文件然后建立一个配额信息;这项事务会占用很长时间,但需要立即去做。管理员同样可以配置NTFS来追踪每个用户存储并强制作限制。如果限制被强制了,NTFS系统可以在用户接近各自的指标时记录日志,管理员可以生成报告。属性页上的配额条目按钮会运行一个工具,这个工具允许管理员查看特定卷的用户配额使用统计。
通过调用GetVolumeInformation检查FILE_VOLUME_QUOTAS位标志来确定本文件系统是否支持磁盘配额。应用程序可以调用GetDiskFreeSpaceEx,这个函数返回的是该调用者还剩下多少未使用的字节,和整个卷下多少未使用的字节。然后你的应用程序可以决定这两个值哪个可以使用。每当有数据写入到文件的尾部,系统都会检查用户是否用尽了他自己的配额,如果是,文件写操作就失败了。
Figure 9列举了COM接口,允许应用程序和磁盘配额交互。
Interface | Description |
IDiskQuotaControl | Provides methods for controlling how NTFS tracks quotas and logs quota events. Also allows you to add and remove user SIDs to the quota database. |
IDiskQuotaEvents | You must implement this interface if you want to receive quota-related event notifications. |
IDiskQuotaUser | Allows the modification of a specific user's quota information. |
IDiskQuotaUserBatch | Allows multiple IDiskQuotaUser objects to be added to the quota database in a single call, thus improving performance. |
IEnumDiskQuotaUsers | Enumerates user quota entries on a volume. |
结语
可靠变化日志,维护了一个卷所有文件目录变化的数据库,我们强烈推荐你学习,简化你的编程。