1

当 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

4 回答 4

5

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

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

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

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

于 2009-07-02T09:35:51.843 回答
2

如果您不允许在某个地方写东西,那么您就是不允许的。如果你能以某种方式做到这一点,那将是黑客攻击

话虽如此,我知道的最后一件事是允许应用程序在 vista 中写入 programdata。这就是它应该做的。存储程序的数据。但我不确定其中的桌面文件夹。据我所知,vista 中没有这样的标准文件夹。

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

于 2009-07-02T08:21:19.390 回答
0

看看清单文件机制

您可以在 exe 中嵌入清单,或者您可以拥有一个单独的清单文件,您可以通过该文件控制权限。

于 2009-07-02T08:24:48.760 回答
0

据我所知,如果 UAC 已打开并且您需要写入 C:\Program Files",这是一个受限文件夹,您需要具有管理员权限。

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

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

如果您必须写入程序数据,则不需要管理员权限。

于 2009-07-02T08:21:26.207 回答