当UAC打开时,如何在VC ++ 6.0中创建文件?

时间:2009-07-02 08:07:47

标签: c++ windows windows-vista uac

如何在启用UAC但不以管理员身份运行时使用C ++创建文件?

我正在尝试在Vista的UAC启用时在VC ++ 6.0中的以下路径中创建一个文本文件:“C:\ Programdata \ Desktop”。但是,Createfile(...)因“拒绝权限”而失败。

当我以“以管理员身份运行”运行示例应用程序时,它可以运行。但我的示例应用程序不应该“以管理员身份运行”。

当UAC启用时,是否有任何API可以授予上述路径?

示例代码: const nSize = 100; CStdioFile文件; CFileException obFileExp; CString csFilePath(_T(“C:\ ProgramData \ Desktop \ sample.txt”));

if (!file.Open( csFilePath , CFile::modeCreate | CFile::modeWrite ,&obFileExp ) )
{
    // opening of file failed  
    TCHAR szErr[nSize];
    obFileExp.GetErrorMessage(szErr,nSize);
    AfxMessageBox(szErr);
    return ;
}  

file.WriteString( "welcome" );

file.Close( );

注意:UAC应该打开,VC ++ 6.0不应该以管理员身份运行

4 个答案:

答案 0 :(得分:5)

C:\ ProgramData \ Desktop是C:\ Users \ Public \ Desktop的别名 - 这是所有用户共享的桌面,并且由系统管理员配置。

启用UAC后,访客,Users组成员或Administrators组的非提升成员无法在共享桌面上创建文件或文件夹,而不会破坏Windows的整个安全模型。

例如,可以使用管理员帐户 - 在应用程序设置期间的UAC提升期间 - 添加一个访问控制列表条目,向用户组的用户授予对子文件夹或文件的某种创建/写入控制权限。 Public \ Desktop。

因此,除非您的“示例程序”试图演示一种从未经高速度的帐户在共享位置写入文件的方法,否则最好不要在用户自己的桌面上创建文件 - c:\ Users \ YourUserAccount \桌面 - 您检索的路径当然是使用适当的(SHGetSpecialFolderLocation)API!

答案 1 :(得分:2)

如果你不被允许在某个地方写东西,你绝不允许。如果你能够做到这一点,它将黑客攻击

话虽如此,我知道的最后一件事是允许应用程序在vista中的programdata中编写。多数民众赞成应该做的事情。存储程序的数据。但我不确定它中的Desktop文件夹。据我所知,vista中没有这样的标准文件夹。

请您详细说明您要在该文件夹中保存的确切内容?

答案 2 :(得分:0)

根据我的知识,如果UAC在&你需要写入C:\ Program Files“这是一个受限制的文件夹你需要拥有管理员权限。

没有解决方法。最多的UAC可能会虚拟化您的应用程序,从而使您的应用程序认为其写入C:\ Program Files,但实际上它将写入%UserProfile%中的虚拟文件夹。

而不是让用户总是右键点击 - >运行方式,您可以将权限设置为“RequireAdministrator”的清单(使用外部清单工具)嵌入。因此,无论何时执行您的应用,都会以用户身份提示是否允许您的应用升级或拒绝。

如果您必须写入programdata,则不需要管理员权限。

答案 3 :(得分:0)

查看The Manifest File Mechanism

您可以在您的exe中嵌入清单,也可以使用单独的清单文件来控制权限。