如何在启用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不应该以管理员身份运行
答案 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中嵌入清单,也可以使用单独的清单文件来控制权限。