-1

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

我正在使用 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 模式下使用 CreateFile),如果创建成功,删除它。但我不想使用这种方法,因为我不希望我的应用程序在每次用户指定位置时都创建一个临时文件。

请建议应该做什么。

4

2 回答 2

2

您需要复制 Windows 执行的安全检查。该AccessCheck功能将对此有所帮助。您目前在查看文件属性方面做得很差。Windows 安全性远比这复杂得多。

虽然你说你不想做,但正确的解决办法是不要去尝试检查。简单地做任何你想做的事情。如果系统判断用户没有足够的权限,那么CreateFile会失败,最后的错误会被设置为ERROR_ACCESS_DENIED。不需要临时文件。你只是尝试做你正在做的任何事情,然后让它失败。无论如何,您都必须处理失败,因为文件操作失败的方式有很多,而不仅仅是安全性。

俗话说,求饶不如求准。

于 2013-11-15T07:07:17.720 回答
1

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

于 2013-11-15T07:00:14.387 回答