我可以拒绝给别人FILE_SHARE_WRITE而不给自己GENERIC_WRITE吗?

时间:2016-01-19 15:45:36

标签: winapi

当我注意到它时,我正在编写一个自定义写锁定类。我的班级没有理由真正写入文件,只是为了拒绝别人写作的能力,所以我自然而然地尝试了这个:

lockHandle = CreateFileW(fileName, 0, FILE_SHARE_READ, 0, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL, 0);

如您所见,我设置了dwDesiredAccess=0dwShareMode=FILE_SHARE_READ。但是其他进程仍然可以写入该文件。我花了一些时间才意识到我需要设置dwDesiredAccess=GENERIC_WRITE,否则我的dwShareMode无效。

似乎只有在我将这些权限授予自己的情况下,我才能拒绝其他人的权限。那是对的吗?如果是这样,为什么会这样?

1 个答案:

答案 0 :(得分:1)

您是否需要请求您尝试“不共享”的访问权限;例如,GENERIC_READ和FILE_SHARE_READ将成功阻止写访问 - 这是一种非常常见的情况,也是必不可少的情况。但是,您所请求的访问权限似乎需要“足够重要”才能统计共享模式。

事实证明,所有这些访问权限被认为是重要的:READ_CONTROL,WRITE_DAC,WRITE_OWNER,FILE_READ_ATTRIBUTES,FILE_READ_EA,FILE_WRITE_ATTRIBUTES和FILE_WRITE_EA。

所有这些访问权限 都被视为重要:DELETE,FILE_EXECUTE,FILE_APPEND_DATA,FILE_READ_DATA和FILE_WRITE_DATA。

为了统计共享模式,您需要从“重要”列表中请求至少一个访问权限。这意味着您可以选择FILE_EXECUTE,这对句柄没有实际影响;如果您不小心尝试从文件中读取,则呼叫将失败。但是,由于此行为似乎没有记录,我不建议您依赖它。相反,在您的方案中,打开GENERIC_READ和FILE_SHARE_READ的文件,因为这可以依赖于工作。

如果你绝对需要一个没有GENERIC_READ访问权限的文件的句柄(我想不出任何好的理由,但可能有边缘情况)你可以使用DuplicateHandle创建一个没有访问权限的新句柄权利。在原始句柄关闭后,这甚至可以继续工作,但是再次,这是没有记录的,所以我建议不要依赖它。

注意:

  • 在Windows 7 x64 SP1上测试,在NTFS上。

  • 我只测试了几个实际上不适用于文件的访问权限,SYNCHRONIZE和FILE_DELETE_CHILD;两者都没有被认为是重要的。

  • 猜测,两个列表之间的区别在于“重要”权利都适用于文件本身,而“无关紧要”权利适用于元数据或根本不适用。

  • 这可能是因为“无关紧要”的权利不需要NTFS来打开底层文件对象,这就是共享模式实际应用的内容。请注意,那是纯粹的猜测。