以管理员权限运行该应用程序就可以解决问题,但我认为这是一个糟糕的解决方法。我想知道是否有任何指令或提示,使该应用程序与Vista和7兼容,因为更多的用户将很快迁移到这些操作系统。
你需要重写你的应用程序,将其文件存储在正确的位置,即使在XP中,但尤其是在Vista及以后的版本中,特别是如果启用了UAC。随着微软每个新的操作系统版本不断加强安全模型并实施控制,正确管理应用程序和用户相关文件的规则变得越来越重要。如何正确管理应用程序和用户相关文件的规则已在MSDN上有所记录,例如:“Windows 2000桌面应用程序的应用程序规范,第4章:数据和设置管理”和“Windows 2000桌面应用程序的应用程序规范,附录A:最佳实践”(是的,它们有些旧,但仍然相当相关)。查看SHGetSpecialFolderLocation(),SHGetFolderPath(),SHGetKnownFolderPath()和其他相关函数可以帮助你。
对于Vista/Win7,除非用户控制账户已关闭或应用程序正在以提升的方式运行,否则您的应用程序无法将文件放在Program Files/Programs的子文件夹中。请注意,“提升”并不一定意味着“以管理员身份登录”。非管理员用户可以提升权限,而管理员也不一定提升了权限。
如果该应用程序尝试写入Program Files但未获得提升权限,则操作系统会阻止该应用程序或“虚拟化”写入(将文件放在其他地方),这取决于UAC的配置方式。无论哪种情况,都不能帮助该应用程序成功完成它试图执行的操作。
因此,它需要把它们放在其他地方。这取决于创建文件的原因,而您没有告诉我们这些信息。您可以阅读本文了解选项。请注意,除了用户的AppData和Roaming文件夹外,还有一个“所有用户”(共享)配置文件。
您可能需要查看本文和屏幕演示,从Delphi的角度深入讨论了UAC。
除了安装时使用的文件外,您为应用程序创建的其他文件应放置在ProgramData目录中(如果是全局的),或者放置在用户ApplicationData目录中(如果是特定于用户的)。
对于必须将文件放置在程序文件目录中的情况,您可以使用com请求提升权限。 详细讨论了这一点,并且还提供了特定于Delphi的部分。 我曾经使用此方法之一是在修补用户安装基础时。 他们会收到UAC的警告,表示系统需要进行更改,因此如果您将其作为自动化任务执行,则可能需要重新考虑逻辑以使其更加用户驱动。
我曾在Stack Overflow上提出类似的问题(链接)。
最终,我意识到需要在安装时将应用程序放入Program Files(需要UAC /提升权限),然后将我的应用程序数据存储在用户的App Data文件夹中。我不得不更改程序生成“默认”配置设置的方式以及保存这些内容的位置,但最终的努力是值得的——我们最终获得了一个可以在XP、Vista和Windows 7上安装和运行的东西。
在这种情况下,我们唯一需要UAC的是在安装时,这对我来说是有意义的(在Mac上安装时也会遇到类似的问题)。在这种特殊情况下,我们没有任何所有用户共享的数据,但如果有的话,我将会查看Program Data特殊文件夹。
我们使用的安装程序软件(Setup Factory)使得这个过程相当简单(我们只需编写一小段代码来检测XP与Vista / Win7并相应地选择正确的特殊文件夹)。根据我的有限经验,在Inno Setup中也很容易实现这一点。