需要知道目录是否具有C++的写入权限

Need to know if a directory has write permission or not in C++

本文关键字:C++ 权限 是否      更新时间:2023-10-16

我需要知道指定的目录(具有登录凭据的本地或共享路径)是否具有写入权限。

我正在使用 GetFileAttributes,但它总是返回FILE_ATTRIBUTE_DIRECTORY,没有其他内容。

我的代码如下所示

if(storageLocation != "")
{
    //! check if local storage - user name password would be empty
    if(storageUsername == "" && storagePassword == "")
    {
        //! local storage
        //! lets check whether the local path is a valid path or not
        boost::filesystem::path fpath(storageUsername.c_str());
        if(boost::filesystem::exists(fpath))
        {
            DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
            if((attrib != INVALID_FILE_ATTRIBUTES) && 
              ((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
            {
                string strWritePermission = "TRUE";
            }
        }
    }
    else
    {
        uncLocation_t uncLocation;
        uncLocation.m_location = storageLocation;
        uncLocation.m_username = storageUsername;
        uncLocation.m_password = storagePassword;
        if(0 == connectToUNCLocation(uncLocation)) // My function to connect to UNC location
        {
            //! successful connection
            DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
            if((attrib != INVALID_FILE_ATTRIBUTES) && 
               ((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
            {
                string strWritePermission = "TRUE";
            }
        }
    }
}

我不明白为什么,但 GetFileAttributes 总是返回0x16。

我已经通过创建一个共享文件夹并在其中创建 2 个文件夹对其进行了测试。一个具有只读权限,另一个具有默认权限。但是在所有 3 种情况下(共享文件夹、只读文件夹和默认权限文件夹),我都得到了相同的返回值。

有办法找到写入权限,创建一个临时文件(GENERIC_WRITE模式下的usinf CreateFile),如果成功创建,则将其删除。但我不想使用此方法,因为我不希望我的应用程序在每次用户指定位置时创建一个临时文件。

请建议应该怎么做。

您需要复制 Windows 执行的安全检查。AccessCheck函数将对此有所帮助。您目前在查看文件属性方面已经很宽泛了。Windows安全比这复杂得多。

虽然你说你不想这样做,但正确的解决方案是不要试图检查。只需做你想做的任何事情。如果系统确定用户没有足够的权限,则CreateFile将失败,最后一个错误将设置为 ERROR_ACCESS_DENIED 。不需要临时文件。你只是试着做你正在做的任何事情,让它失败。无论如何,您都必须处理失败,因为文件操作失败的方式有很多种,而不仅仅是安全性。

俗话说,求饶比许可好。

我认为您正在寻找AccessCheck。仅供参考,这不是一个C++问题,而是一个Windows API问题。