Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检测文件是否存在,而不受权限问题的影响?_C++_Security_Winapi_Filesystems - Fatal编程技术网

C++ 如何检测文件是否存在,而不受权限问题的影响?

C++ 如何检测文件是否存在,而不受权限问题的影响?,c++,security,winapi,filesystems,C++,Security,Winapi,Filesystems,至少有三种技术可用于检测文件是否存在: 查询文件属性 将FindFile()与特定文件名一起使用,而不是使用搜索模式 在读取模式下打开文件,查看由此产生的任何错误 上述所有情况似乎都存在虚假否定。也就是说,我被告知,由于网络上文件io的工作方式出现故障,或者由于文件权限问题,文件实际上不存在 我有一个客户,他可以看到资源管理器中存在一个文件,删除该文件,但如果他们试图查看该文件,就会被授予“拒绝访问”权限 我没有成功地复制这种行为。但是我可以创建一个文件存在的情况,但是由于对它的权限限制,我无法

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

  • 查询文件属性
  • 将FindFile()与特定文件名一起使用,而不是使用搜索模式
  • 在读取模式下打开文件,查看由此产生的任何错误
  • 上述所有情况似乎都存在虚假否定。也就是说,我被告知,由于网络上文件io的工作方式出现故障,或者由于文件权限问题,文件实际上不存在

    我有一个客户,他可以看到资源管理器中存在一个文件,删除该文件,但如果他们试图查看该文件,就会被授予“拒绝访问”权限

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

    至于我的最终用户(或任何人)将如何在这种情况下结束,我并不清楚。我没有具体的想法-可能是文件之前打开时出现电源故障,可能是某种网络故障导致文件句柄锁定在外国PC上的死机进程上。。。?我只是在编故事,因为我不知道是什么导致了这种情况的发生

    然而,我真正不具备的是查询窗口并知道“文件X是否存在”的能力

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


    Hokay-这越来越奇怪了

    只要我问两次,使用任何一种文件检测技术都能奏效。第一次总是告诉我“不存在”。第二次+告诉我“是的,它在那里,但你不能打开它。”

    该文件位于Windows Server 2008 NTFS驱动器上的共享文件夹中。该文件由所有人共享。我已手动添加“所有人拒绝读取”ACL访问该文件,以模拟我的客户问题。因此,我拒绝读取,但没有其他访问权限,仅访问该文件,而不访问共享或该文件所在的文件夹

    (我使用Explorer进行了此修改,而不是我自己的软件或命令行实用程序)

    我可以看到该文件存在于该服务器上的本地管理员帐户中。我甚至看不到它存在于我的本地工作站中,在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等效的
    \u access

    使用shell函数

    另一种方法是模仿Delphi/BCB中的
    FileExists
    ,即获取文件的
    WIN32\u FIND\u数据,从而检查它是否存在

    顺便说一句,您提到的情况完全是人为的。它与
    SeChangeNotifyPrivilege
    有关,每个默认安装都将分配给甚至是非特权用户。用户权限称为“绕过遍历检查”(在安全设置->本地策略->用户权限分配下的
    secpol.msc
    中):) 这意味着,对于所有实际用途,如果您知道某个文件的路径和名称,您应该能够找出该文件是否存在



    是的,Jerry是对的,这是一个安全漏洞。但这是一个经过计算的漏洞。特权(“用户权限”)正是一种忽略某些权限问题的方式。这正是Windows中特权的目的。

    如果权限设置为“您甚至不允许查看此文件的名称”(例如,拒绝您访问该文件所在的目录),任何“查看”该文件的能力,即使只是确认或否认其存在,都是一个明显的安全漏洞

    因此,我只能看到一些可能性。最明显的是使用管理员帐户搜索文件。这可能会让用户感到烦恼,因为他们很可能需要输入该管理员帐户的凭据才能使用它。对于没有管理员帐户访问权的用户(您希望是大多数)这根本不起作用

    另一种可能是发现并利用一个安全漏洞,让你做你想做的事,即使你真的不应该这样做。这(至少)是同样有问题的——几乎任何修补程序、服务包等都可能“堵塞”你正在利用的安全漏洞,你的代码将停止工作。同样,至少有一个合理的机会,某种反恶意软件可能会决定(或多或少正确地)你的代码是顽皮的,并告诉用户它做得不好