Windows:如何获得已打开文件的模式/访问权限?

Posted

技术标签:

【中文标题】Windows:如何获得已打开文件的模式/访问权限?【英文标题】:Windows: How do I get the mode/access rights of an already opened file? 【发布时间】:2012-02-25 08:12:02 【问题描述】:

我正在编写一个使用数据库库的程序。该库让我可以访问它用来访问我的表的文件句柄。我找到了一个 Windows API,它允许我通过句柄检索有关文件的信息,但我还没有找到任何方法来确定该文件的访问模式/权限。在这一点上,我确信我可能会在不知道这些信息的情况下生活,但作为我的顽固诅咒,我还没准备好放手。显然,Windows 知道这些信息 - 所以问题是如何才能将这些信息从其中提取出来?

我找到的 API 函数是:GetFileInformationByHandleEx,它带我靠近水坑,但不让我喝水。

文件模式信息有用的原因是我需要修改表头信息。如果文件已经处于正确模式,那么我不必关闭表打开文件修改文件关闭文件然后重新打开表。

是的,在我被告知实现目标的所有可用选项之前 - 我对这些不感兴趣。我只对原始问题感兴趣 - 如何确定已打开文件的模式。我期待任何回复,并提前感谢您。

谢谢, 罗伯特·米利根

【问题讨论】:

您可以尝试向此类文件写入内容,如果失败则必须重新打开它。不确定 WinAPI 是否从用户空间提供这样的功能,我怀疑你会想编写驱动程序来导出这样的功能。 【参考方案1】:

不知道有没有对应的Win32 API,如果真的需要,可以调用NtQueryObject(ObjectBasicInformation)。

【讨论】:

感谢您的帮助。我正在使用 qResult := NtQueryInformationFile(DataSet.DBFHandle.FileHandle, iostatus, AccessInfo, SizeOf( AccessInfo), ficFileAccessInformation);【参考方案2】:

好的。所以我终于把这部分弄明白了——感谢你的指导、大量的 MSDN 研究和大量的试验和错误。

要弄清楚这一切有几个棘手的问题。

1) ACCESS_MASK 肯定没有像我预期的那样反映访问模式。文档让我期望高 4 位反映我打开文件时使用的“通用”模式 - 错误!这些显示在特定权利部分。哎呀-我仍然不知道什么时候真正使用了高 4 位,但是对于这个练习,我不需要。

2) 一旦我明白了这一点,我不得不偶然发现文档让我知道,当我打开 GENERIC_READ 时,它被翻译成:

FILE_GENERIC_READ

由以下组成:

STANDARD_RIGHTS_READ | 文件读取数据 | FILE_READ_ATTRIBUTES | FILE_READ_EA | 同步

理解这个概念后,其余的一切就都到位了。现在我的理解与 Process Hacker 告诉我的信息相关。

3) 我在从 UI 到代码的过程中也遇到了一个严重错误(读取一个常量放错了位置),这曾经让整个世界都在我的脚下倒下。

这很棒,因为我现在可以弄清楚打开文件时使用了哪些访问模式。原始问题已回答!

现在我希望能够确定文件所处的“共享”模式 - 如果可能的话。有什么想法吗?

再次感谢您的帮助

【讨论】:

【参考方案3】:

也许想通了?从我对文档的阅读中,您似乎可以通过调用ReOpenFile 和dwDesiredAccess0dwShareMode 来识别打开句柄的原始“共享模式”,其中一个(或多个?)要查询的模式,即FILE_SHARE_DELETEFILE_SHARE_READFILE_SHARE_WRITE。如果ReOpenFile 返回一个有效的句柄——然后你可以关闭/释放它——那么原始文件上是否存在该共享模式?

来源

"如果dwDesiredAccess 为零 (0),则应用程序可以在不访问设备的情况下查询设备属性。如果应用程序想要确定软盘驱动器的大小及其支持的格式而不需要软盘,这将非常有用在驱动器中。”https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-reopenfile

【讨论】:

有一个共享访问记录,它是引用给定文件系统文件或目录的所有内核文件对象的公共文件系统上下文的一部分。共享访问记录包含 7 个计数器: 1 个计数器用于打开文件并进行数据访问的次数; 3 个计数器,用于读取/执行、写入/附加或删除数据访问打开的次数;和 3 个计数器,用于共享读取/执行、写入/附加和删除数据访问的打开次数。如果打开不请求数据访问,则不检查共享访问记录并且不更新。 Process Explorer 显示了 file object 的 SharedReadSharedWriteSharedDelete 标志,这些标志在创建时设置,以便能够在文件对象在不再被引用时被清理。在用户模式下,无法检查这些标志。由于新的打开使用考虑所有打开的公共共享访问记录,因此无法推断特定打开的标志。

以上是关于Windows:如何获得已打开文件的模式/访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决局域网没有访问权限的

win10共享文件夹不成功?

共享文件夹怎么才能访问

win10共享文件无法访问怎么办?

Hosts文件怎么获取权限

共享文件夹无法访问没有权限