Windows UAC的C ++问题

时间:2014-02-10 13:04:47

标签: c++ windows windows-8 uac

我有一个用C ++编写的软件安装在大约1000台PC上,这对Windows UAC有一些困难。我正在努力使事情正常运行,但我需要一些帮助来理解问题并找到正确的解决方案。

情况如下:我需要在一些text / xml文件中写一些数据,所以我开始(在XP中)将它们写在可执行文件夹中。不推荐,我知道。当Vista启动时,所有文件都开始保存到VirtualStore文件夹,这对我来说很好,所以我保持原样不变。当时我和一些用户遇到了一些问题(参见问题1),但我手动修复了它们就是这样。现在使用Windows 8我遇到了不同的问题(问题2),我想一劳永逸地修复它们。

  1. 第一个问题:在Windows Vista中,有些用户最终发现他们的软件“空”,就像刚安装时一样。他们所有的工作都没了。事实证明,Suddendly Vista正在C:\ Program Files \ {MyApp}中寻找他们的文件而不是在VirtualStore中查找。将文件从VirtualStore复制到程序文件夹解决了问题,从未理解为什么
  2. 第二个问题:现在有了Windows 8,一些用户[其中少数用户]遇到了一个不同的,奇怪的事实;我的应用程序似乎无法在VirtualStore中创建文件,但它可以编辑现有文件。因此,如果我手动创建文件,一切正常。如果不是应用程序不起作用:既不在程序文件夹中也不在虚拟商店中修改文件
  3. 现在我想解决问题。我的计划是移动CSIDL_LOCAL_APPDATA中需要修改的所有文件,并让软件在那里保存。只有可执行文件才会出现在程序文件夹中。但是为了向后兼容,似乎我不能使用似乎是Vista +特定的SHGetKnownFolderPath。所以我会使用SHGetFolderPath,我已经弃用了,但我应该在XP中工作,并在Vista +中充当SHGetKnownFolderPath的包装器,这对我有好处。

    我的问题:

    • 关于我的问题的任何想法1& 2?我想了解他们,以确保我完全击败他们。
    • 我的UAC规划是否合规?据我所知,但是......
    • 任何确保XP兼容性的方法,但我的解决方法?我不喜欢使用已弃用的功能,但我绝对不希望有两个版本(XP和Vista +)来处理!

    非常感谢您提供的任何帮助。 卢卡

1 个答案:

答案 0 :(得分:0)

这些是我对问题的看法1& 2: 1.如果您正在编写应用程序正在使用的文件,则您的文件将写入C:\ Program Files的子目录中。要在此位置(C:\ Program Files)写入文件,您的应用程序必须以管理员身份运行。出于兼容性原因,如果您尝试将数据写入需要管理员权限来写入数据的目录,则Windows Vista会将数据写入VirtualStore。 2. Windows 8不再使用VirtualStore。但是,读访问权限不需要管理员权限。 是的,您的计划符合UAC标准。您的程序和程序使用的文件必须保存在两个不同的目录中。 我将使用ShGetFolderPath函数来获取AppData目录的路径。此外,此功能与Windows XP兼容。您可以检查操作系统版本并使用适用于此版本的功能/接口。在Windows 8中更改了GetVersion和GetVersionEx。这就是为什么我建议在Windows 8上使用Version Helper functions进行版本检查。