如何检查应用程序是否从\ program files \

时间:2009-12-09 10:56:16

标签: c# c++ delphi windows-vista program-files

是否有可靠的方法来检查应用程序是否从程序文件下的某个位置运行?

如果用户将应用程序安装到本地计算机上的程序文件,我们需要将可写文件放在其他位置以避免在Vista和Win7上进行虚拟化。但是,当安装到网络磁盘时,我们希望将这些文件保留在用户之间进行共享访问的安装。

今天我们在启动路径和CSIDL_PROGRAM_FILES之间进行字符串比较,但有些东西告诉我这是一种非常不可靠的方法。

那里有任何智能解决方案吗? 是否有'IsRunningFromProtectedFolder()' - 我不知道的api? 有没有其他文件夹提供与程序文件相同的问题?

3 个答案:

答案 0 :(得分:3)

这不是一个非常好的主意,因为用户可以在任何他们想要的地方安装它,然后检查可能会失败。而是在用户安装应用程序时有一个复选框,决定它是在本地安装还是在服务器上安装。

答案 1 :(得分:0)

正如您在处理UAC文件夹虚拟化时也发现了问题。我建议一个解决方法,它似乎应该有效。

它来自于提升的进程总是使用原始副本而不是虚拟副本(CMIIW)的假设。此外,我假设您设置处理已执行提升

我们的想法是创建一个主要安装程序应该运行的“通用”进程(非提升的,遗留的)。此过程将在用户选择的文件夹中创建一个文件名,其中包含您的程序都知道的名称和内容(例如,test73819704.bin)。如果文件夹已虚拟化,则此文件应出现在用户VirtualStore中,并且不应出现在原始文件中(从安装程序的角度和权限)。

所以选择C:\ Program_Files_But_Not_Necessarily和Process-1(提升)

  • Process-1确保没有文件C:\ Program_Files_But_Not_Necessarily \ test73819704.bin
  • 启动没有提升的Process-2
  • Process-2创建C:\ Program_Files_But_Not_Necessarily \ test73819704.bin并检查它是否真的存在。如果存在,它将返回一个良好的返回码,否则返回“失败”。
  • Process-1等待Process-2并分析结果。如果好,请检查C:\ Program_Files_But_Not_Necessarily \ test73819704.bin,如果存在,请选择“宾果!没有虚拟化”,如果不存在,“不好,让我们找一些其他存储位置”。如果Process-2中的代码“失败”,则向用户显示一些错误消息。

不幸的是我现在无法测试它,但我想它应该可行,并且这背后有一个逻辑,使用Process-2你只是模仿主程序的行为)

答案 2 :(得分:0)

我们允许用户在任何地方安装......

如果用户已采用默认值并安装在Program Files中,我们假设我们需要写入Documents and Settings / Users。否则,我们将数据写入软件所在目录下的文件夹中。这当然仍会导致问题,如果安装确实允许人们选择不使用默认值,则可以选择不同的数据位置。

最重要的是,它是一个简单的ini文件更改和一个移动数据的副本。

在启动时,我们通过将从SHGetFolderPath(CSIDL_PROGRAM_FILES)获得的值与可执行文件所在路径的起点进行比较来检测我们是否在Program Files目录中。