C++ 如何检测文件是否存在,而不受权限问题的影响?
至少有三种技术可用于检测文件是否存在:C++ 如何检测文件是否存在,而不受权限问题的影响?,c++,security,winapi,filesystems,C++,Security,Winapi,Filesystems,至少有三种技术可用于检测文件是否存在: 查询文件属性 将FindFile()与特定文件名一起使用,而不是使用搜索模式 在读取模式下打开文件,查看由此产生的任何错误 上述所有情况似乎都存在虚假否定。也就是说,我被告知,由于网络上文件io的工作方式出现故障,或者由于文件权限问题,文件实际上不存在 我有一个客户,他可以看到资源管理器中存在一个文件,删除该文件,但如果他们试图查看该文件,就会被授予“拒绝访问”权限 我没有成功地复制这种行为。但是我可以创建一个文件存在的情况,但是由于对它的权限限制,我无法
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中特权的目的。如果权限设置为“您甚至不允许查看此文件的名称”(例如,拒绝您访问该文件所在的目录),任何“查看”该文件的能力,即使只是确认或否认其存在,都是一个明显的安全漏洞
因此,我只能看到一些可能性。最明显的是使用管理员帐户搜索文件。这可能会让用户感到烦恼,因为他们很可能需要输入该管理员帐户的凭据才能使用它。对于没有管理员帐户访问权的用户(您希望是大多数)这根本不起作用
另一种可能是发现并利用一个安全漏洞,让你做你想做的事,即使你真的不应该这样做。这(至少)是同样有问题的——几乎任何修补程序、服务包等都可能“堵塞”你正在利用的安全漏洞,你的代码将停止工作。同样,至少有一个合理的机会,某种反恶意软件可能会决定(或多或少正确地)你的代码是顽皮的,并告诉用户它做得不好