在 Windows 7 上访问 C:\ 驱动器
我在 Windows 7 计算机上拥有完全管理员权限,但当我运行在 c:\ 驱动器上创建文件的应用程序时,我收到错误代码 5(访问被拒绝)。我知道 Windows 7 不允许在 C 盘和程序文件等受保护区域中创建文件,如果我从其他地方复制文件,文件资源管理器会显示“管理”消息框,之后它允许,但我的应用程序可以获得写入级别使用权?
在我的应用程序中,用户可以选择他们想要创建文件的文件夹,因此如果他们选择 c:\ 驱动器,他/她显然会收到此错误,这是不希望的。
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 上的方法吗?还有其他办法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(3)
如果是用户提供路径,那么您应该通知他们该文件无法保存到此位置,并要求提供另一个名称。
通常是 shell,GetSaveFileName
函数,返回前检查是否可以在所选目录中创建新文件,参见="">OFN_NOTESTFILECREATE href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx" rel="nofollow">OPENFILENAME
结构。
另一种选择是处理这种情况并自行显示 UAC 确认。但这个解决方案需要付出比其实际价值更多的努力。您无法提升当前进程,因此将文件保存到受保护区域的操作必须在另一个进程中实现。同时你当前的进程有数据需要保存,所以你必须实现两个进程之间的通信。阅读为 Windows Vista 设计 UAC 应用程序更多信息。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
正如 Kolink 指出的,您的应用程序需要以管理员权限运行。为了自动执行此操作,请按照此处的说明嵌入清单。
编辑:对于 VS2010:项目属性>配置属性>链接器>清单文件将“UAC 执行级别”更改为所需的值。
As Kolink noted, your application needs to run with administrator privileges. In order to do that automatically, embed a manifest as explained here.
EDIT: For VS2010: Project Properties > Configuration Properties > Linker > Manifest File Change the 'UAC Execution Level' to the desired value.