我需要知道指定的目录(具有登录凭据的本地或共享路径)是否具有写入权限。
我正在使用 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模式下使用inf CreateFile),如果成功创建,则将其删除。但我不想使用此方法,因为我不希望我的应用程序在每次用户指定位置时创建临时文件。
请建议应该做什么。
您需要复制 Windows 执行的安全检查。这AccessCheck
功能会有所帮助。目前,您在查看文件属性方面已经离题了。 Windows 安全性比这复杂得多。
虽然你说你不想这样做,但正确的解决办法是不要尝试检查。只要做你想做的事就可以了。如果系统判定用户没有足够的权限,则CreateFile
将失败,最后一个错误将被设置为ERROR_ACCESS_DENIED
。不需要临时文件。你只是尝试去做你正在做的事情,然后让它失败。无论如何,您都必须处理失败,因为文件操作失败的原因有很多,而不仅仅是安全性。
俗话说,请求原谅胜于请求许可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)