在Windows 7上访问C:\驱动器

时间:2012-02-17 15:47:26

标签: security winapi windows-7 mfc uac

我在Windows 7计算机上拥有完全的管理员权限,但是当我运行在c:\ drive上创建文件的应用程序时,我收到错误代码5(访问被拒绝)。我知道Windows 7不允许在c盘和程序文件等受保护区域中创建文件,如果我从其他地方复制文件,文件资源管理器会显示“管理”消息框,之后它会允许但是我的应用程序可以获得写入级别访问?

在我的应用程序中,用户可以选择他们想要创建文件的文件夹,这样如果他们选择c:\ drive s /他显然会得到这个错误,这是不可取的。

void CTestDlg::OnBnClickedButtonCreate()
{
    CFile f;
    CFileException e;
    TCHAR* pszFileName = _T("c:\\test.txt"); // here i am hard coding path for simplicity.
    if(!f.Open(pszFileName, CFile::modeCreate | CFile::modeWrite, &e))
    {
        TRACE(_T("File could not be opened %d\n"), e.m_cause);
    }

}

据我研究过,似乎我无法绕过UAC对话框,但是我的应用程序甚至没有呈现它(这也是可以理解的)但是我的选择是什么?

我看到我唯一的选择就是在我自己的应用程序中检测到这个,如果这是Windows 7操作系统,而不是在创建文件之前检查文件路径并提供更友好的用户信息'windows 7不喜欢你创建文件在此文件夹中,选择其他文件夹或返回xp'。这种方案是否可以用于Windows 7?还有其他办法吗?

3 个答案:

答案 0 :(得分:3)

正如Kolink所说,您的应用程序需要以管理员权限运行。为了自动执行此操作,请按照here说明嵌入清单。

编辑:对于VS2010:项目属性>配置属性>链接器>清单文件将“UAC执行级别”更改为所需的值。

答案 1 :(得分:1)

要么尝试写入受保护区域,要么要求您的应用程序以权限运行(右键单击=>以管理员身份运行)。

我知道我不喜欢我的根目录中出现的随机文件 - 我喜欢我的文件组织。

答案 2 :(得分:0)

如果是提供路径的用户,则应通知他们该文件无法保存到此位置并要求提供其他名称。

通常shell GetSaveFileName函数会检查是否可以在返回之前在所选目录中创建新文件,请参阅OPENFILENAME结构说明中的标记OFN_NOTESTFILECREATE

另一个选择是处理这种情况并自己显示UAC确认。但是这个解决方案需要比真正值得付出更多的努力。您无法提升当前进程,因此必须在另一个进程中实现将文件保存到受保护区域的操作。与此同时,您当前的进程需要保存数据,因此您必须实现两个进程之间的通信。请阅读Designing UAC Applications for Windows Vista以获取更多信息。