【问题标题】:How do I create a file in VC++ 6.0 when UAC is on?当 UAC 打开时,如何在 VC++ 6.0 中创建文件?
【发布时间】:2009-07-02 08:07:46
【问题描述】:

当 UAC 开启但没有以管理员身份运行时,如何在 C++ 中创建文件?

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

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

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

示例代码: 常量 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 不应该以管理员身份运行

【问题讨论】:

  • 我强烈怀疑是路径问题。桌面不是用户配置文件的一部分吗?您应该在代码中获取该文件夹的路径,而不是通过硬编码作为假定路径。
  • Vista 桌面文件夹位于 c:\Users\USERNAME\ 而不是 ib ProgramData。如果您尝试创建一个名为 Desktop 的文件夹然后写入您的文件,则情况不同。
  • 在 Visata 中,示例路径:“C:\ProgramData\Desktop\sample.txt”表示“C:\Users\Public\Desktop\sample.txt”

标签: c++ windows windows-vista uac


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    如果您不被允许在某处写东西,那么您就是不被允许的。如果你能以某种方式做到这一点,那将是hacking。

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

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

    【讨论】:

      【解决方案3】:

      看看The Manifest File Mechanism。

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

        • 我认为您的意思是“程序文件”在这里代替了 ProgramData。对“程序文件”文件夹进行了虚拟化,并且 ProgramData 不需要管理员权限。
        • 如何使用 VC++ 6.0 做到这一点??
        猜你喜欢
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-26
        • 2011-09-15
        相关资源
        最近更新 更多