如何检查目录符号链接的目标是否存在?

问题描述 投票:0回答:1

我正在开发一个针对Windows XP的Windows应用程序。

我的应用程序需要解析文件和文件夹的符号链接。要检查目标是否存在,我可以使用CreateFile作为文件的符号链接。但是在我搜索谷歌和MSDN一整天之后,我发现如果我需要获取目录的句柄,我需要使用标志FILE_FLAG_BACKUP_SEMANTICS。这要求我的应用程序请求更高的权限。我知道很多用户对这种行为不满意,所以我需要找到另一种方法来检查目录符号链接的目标是否存在。

我也读过Symbolic Link Effects on File Systems Functions。我可以用来测试文件或目录是否存在的其他函数都检查符号链接本身,而不是它的目标。我尝试过像_access_s这样的功能。他们也只检查符号链接本身。

所以我的问题是,是否有任何方法可以检查目录符号链接的目标是否存在而不需要更高的权限。

windows winapi visual-c++ filesystems symlink
1个回答
2
投票

我可以使用CreateFile作为符号文件来获取文件句柄,然后检查文件是否存在。

如果在调用FILE_FLAG_OPEN_REPARSE_POINT中未指定CreateFile并且您获得文件句柄,则表示存在符号链接/挂载点目标。所以已经不需要检查一下了。如果调用失败,因为目标不存在,最后一个错误将是ERROR_FILE_NOT_FOUNDERROR_PATH_NOT_FOUND(也可能是ERROR_BAD_PATHNAME

关于FILE_FLAG_BACKUP_SEMANTICS - 这是CreateFile api非常糟糕的设计。这个api内部调用NtCreateFileFILE_FLAG_BACKUP_SEMANTICS映射到FILE_OPEN_FOR_BACKUP_INTENT CreateOptions标志。在IopCheckBackupRestorePrivilege内检查此标志

此函数将确定调用者是否要求执行备份或还原权限可能满足的任何访问,如果是,请执行权限检查。如果权限检查成功,则相应的位将移出AccessState结构中的RemainingDesiredAccess字段并放入PreviouslyGrantedAccess字段。

请注意,如果调用者没有任何一个或两个特权,则不会拒绝访问,因为他可能通过对象上的安全描述符被授予所需的访问权限。

因此,即使调用者没有备份或还原权限中的任何一个或两者,这也不会产生问题。

NtCreateFile有接下来的两个选项:FILE_DIRECTORY_FILEFILE_NON_DIRECTORY_FILE - 这个让我们指定我们想要创建/打开文件或目录。如果我们(潜在)创建新项目 - 我们需要指定我们想要创建目录(FILE_DIRECTORY_FILE必须设置)或不是目录(FILE_NON_DIRECTORY_FILE,但默认情况下假设这种情况 - 所以可选)。当我们打开文件时 - 这两个标志都是可选的 - 如果我们不指定两者 - 这意味着我们不关心我们打开文件或目录。如果我们关心这个 - 需要指定其中一个标志。

但如果看到CreateFile可见,那就不存在明确映射到FILE_DIRECTORY_FILEFILE_NON_DIRECTORY_FILE的选项。 CreateFile用于此... FILE_FLAG_BACKUP_SEMANTICS选项。从我的观点来看,这是非常不符合逻辑的,但原样。当FILE_FLAG_BACKUP_SEMANTICS没有设置CreateFile传递FILE_NON_DIRECTORY_FILE选项为NtCreateFile。当它设置 - 通过FILE_OPEN_FOR_BACKUP_INTENT而不通过FILE_NON_DIRECTORY_FILE。这允许您打开文件或目录。没有设置FILE_DIRECTORY_FILE的选项 - 因为这个CreatrFile无法创建新目录。

所以相反有FILE_DIRECTORY_FILEFILE_NON_DIRECTORY_FILE的单独选项,CreateFile滥用FILE_FLAG_BACKUP_SEMANTICS这里有双重意义

© www.soinside.com 2019 - 2024. All rights reserved.