2012-02-17 68 views
1

驱动器,我有我的Windows 7机器上完全管理员权限,但是当我跑我的应用程序,创建了基于C文件:\驱动器,我得到错误代码5(访问被拒绝)。我知道Windows 7不允许在受保护区域创建文件,如c盘和程序文件,如果我从其他位置复制文件,文件浏览器会弹出'管理'消息框,之后它允许但我的应用程序可以获得写入级别访问?访问C: Windows 7上

在我的应用程序,用户将获得挑选他们想要的,所以如果他们选择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上走的路吗?有没有其他方法?

+0

[Windows 7是否与Vista有相同的问题?](http://stackoverflow.com/questions/5210575/does-windows-7-have-the-same-problem-as-vista) – 2012-02-17 17:57:17

+0

不,您唯一的选择是使用* Windows * *和* Windows XP中的相应文件夹。这将是用户的文件夹之一,而不是磁盘的根目录。切勿将东西放入磁盘的根目录中。 – 2012-02-17 17:57:57

+1

@CodyGray他们不一样,但他们都与UAC有关。 – zar 2012-02-17 19:30:23

回答

3

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

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

+1

真正的答案是在您提供的链接的评论部分的两行中,因为文章的其余部分与VS2005相关,Microsoft尚未更新此内容。我正在重新发布两行解决方案: 对于VS2010: 项目属性>配置属性>链接器>清单文件 将'UAC执行级别'更改为所需的值。 – zar 2012-02-17 21:39:55

+0

@zadane:哎呀,对不起。感谢您找到更正。我已经将它添加到其他人的答案中。 – 2012-02-19 21:55:31

1

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

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

+0

我可以以编程方式使用管理员权限运行它吗? – zar 2012-02-17 16:02:15

+1

@zadane我真的很希望最后一个问题的答案是,你不能。否则似乎不安全。 – webdreamer 2012-02-17 16:10:29

+0

如果你不喜欢随机文件出现在根目录下,那么你不应该允许。 OP想要这样做,这就是他们问的原因。 – stu 2014-01-14 20:35:02

0

如果它是谁提供了路径的用户,那么你应该通知他们该文件无法保存到这个位置,并要求提供另一个名称。

通常shell,GetSaveFileName函数,检查新文件是否可以在返回之前在选定目录下创建,请参阅标志OFN_NOTESTFILECREATE中描述的OPENFILENAME结构。

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

+0

我想'检查是否可以在选定目录中创建新文件',但CreateFile()返回代码5'访问被拒绝',这是我可能出于其他原因获得的相同泛型代码。由于权限问题,我怎样才能区分这个文件夹? 'GetSaveFileName'确实如果目标文件夹是c:\ – zar 2012-02-20 20:02:46

+0

@zadane'访问被拒绝'表示您没有权限写入(或读取)到文件夹。如果以完全管理员权限提升权限,则无权保留写入文件夹的权限。我想检查它的唯一方法是分析文件夹的ACL,例如,以检查管理员组是否有写权限。但它不是防弹的。 – 2012-02-21 05:51:39