c++ - 如何检测文件是否存在而不会因权限问题而脱轨?

标签 c++ security winapi filesystems

至少有三种技术可以检测文件是否存在:

  1. 查询文件属性
  2. 使用 FindFile() 和特定文件名而不是搜索模式
  3. 以读取模式打开文件并查看由此产生的错误

以上所有内容似乎都存在误报问题。也就是说,我被告知该文件实际上并不存在,因为网络上的 file-io 工作方式出现故障,或者由于文件权限问题。

我有一位客户可以看到资源管理器中存在一个文件,并删除该文件,但如果他们尝试查看该文件,则会收到“访问被拒绝”的消息。

我未能成功复制这种确切的行为。但我可以创建的是文件存在的情况,但由于限制权限,我无法在我的用户凭据下看到该文件夹​​中的文件。也就是说,GetFileAttributes()、FindFile() 和 fopen() 返回失败,即找不到该文件的文件(但如果我在不同帐户下查看同一文件夹 - 比如说网络管理员,我可以看到该文件肯定存在)。

至于我的最终用户(或任何人)在这种情况下最终会如何,对我来说是不透明的。我没有具体的想法 - 也许在文件先前打开时出现电源故障,也许某种网络故障导致文件句柄保持锁定到外国 PC 上的死进程,...?我只是编造一些东西,因为我不知道什么会导致这种情况发生。

但是,我真正不具备的是查询 Windows 并了解“文件 X 是否存在”这一事实的能力

有谁知道一种技术可以诚实地回答这个问题,无论用户的权限如何(假设他们被允许查询文件夹本身的内容 - 我不是要求未经授权的访问场景 - 只是一个“正常”用户X无法编辑文件Y,但仍想知道文件Y是否存在。


Hokay - 这变得很奇怪。

只要我问两次,使用任何文件检测技术都可以。第一次总是告诉我“不存在”。 Second+ 告诉我“是的,它就在那里,但你无法打开它。”

相关文件位于 Windows Server 2008 NTFS 驱动器上的共享文件夹中。它是共享的,供每个人完全控制。我已手动将“Everyone Deny Read”ACL 添加到文件中,以模拟我的客户问题。因此,我拒绝读取,但没有其他访问权限,并且仅限于文件,而不是共享或该文件所在的文件夹。

(我使用资源管理器进行此修改,而不是我自己的软件或命令行实用程序)。

我可以从该服务器上的本地管理员帐户看到该文件存在。我什至无法从我的本地工作站看到它存在,在 Windows 7 下以标准用户身份登录、启用 UAC、未提升的资源管理器/应用程序。


如果文件的读取访问被明确拒绝,则该文件将不再可见(除了不适用该拒绝的帐户,或具有某种后门方式的本地管理员)尽管拒绝 ACL 仍可查看该文件)。

我尝试过 FindFirstFile、GetAttributes、CreateFile、_taccess_s 和 PathFileExists。在每种情况下,第一次尝试访问文件都会指示“未找到文件”,但连续第二次尝试会导致无错误(找到文件)。

我无法开始解释这些结果。我认为此时我需要在本地运行所有测试,以从组合中删除网络文件共享。这些结果对我来说没有多大意义。


来自服务器上本地管理员帐户的文件夹的 fltmc 输出:

Filter Name                     Num Instances    Altitude    Frame
------------------------------  -------------  ------------  -----
aksdf                                   8       145900         0
luafv                                   1       135000         0

最佳答案

有一个名为 access 的 POSIX 函数可以执行此操作。看起来有一个 Windows 等效的 _access:http://msdn.microsoft.com/en-us/library/1w06ktdy(v=vs.80).aspx

关于c++ - 如何检测文件是否存在而不会因权限问题而脱轨?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11247980/

相关文章:

c++ - SendInput 始终将鼠标指针移动到左上角

c - MS Win32 安全函数中的内存分配

c++ - std::uncaught_exceptions 对避免所有异常有用吗?

java - Tomcat 推荐人锁定

security - Mongodb 安全

c - 放弃作为沙盒的常规非 root 用户的权限?

c# - GetKeyboardState 在远程桌面全屏模式下不起作用

c++ - WriteFile 写入错误

c++ - 这个声明是什么意思?异常()抛出()

c++ - 如何访问c文件中公共(public)类函数修改的c++全局变量