【问题标题】:How to check if application runs from \program files\如何检查应用程序是否从 \program files\ 运行
【发布时间】:2009-12-09 10:56:16
【问题描述】:

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

如果用户在本地机器上安装应用程序来编程文件,我们需要将可写文件放在其他地方以避免在 Vista 和 Win7 上进行虚拟化。但是,当安装到网络磁盘时,我们希望将这些文件与安装一起保存,以便用户之间共享访问。

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

有什么聪明的解决方案吗? 是否有我不知道的“IsRunningFromProtectedFolder()”-api? 是否有其他文件夹会出现与程序文件相同的问题?

【问题讨论】:

  • 我不在乎哪种语言。这是windows问题,不是语言问题。问题应该与您使用的任何语言相同。
  • 不要猜测用户可能需要什么,让他们选择更改数据文件的目录。例如,我们有一个客户,其系统为所有标准用户提供只读 C 驱动器。 OTOH IT 可能需要决定是否要在该系统的多个用户之间共享本地安装的数据文件。数据文件的位置是一个策略决定,与安装路径无关。
  • 有趣 - 我开始有这样的概念问题,将我的东西转移到 Vista/Win 7。所以这是我喝咖啡坐下来,急切地等待想法和建议的地方StackOverflow 的。 :-)
  • @mghie:给出选择的问题在于,我们的大多数用户没有做出选择的知识。但是我看不到任何其他好的解决方案,而且我几乎已经说服了其他决策者,不可能发现什么是正确的。要知道,我们已经决定在安装过程中询问用户它是本地的、单用户安装、服务器上的共享安装,还是终端服务的安装。我们不确定最后一个。无论如何,我们已经记录了知识渊博的 sys.admins 的调整。 @robsoft:享受你的咖啡 ;-)
  • @Vegar:做出选择的关键是要有一个合理的默认值。我从注册表中读取了该位置,但默认为“我的文档”位置。如果他们不关心,用户可以在此处拥有文件,或者如果有人愿意,可以在 UI 中更改它们。

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


【解决方案1】:

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

【讨论】:

  • 我们也必须处理终端服务,这使情况变得更加复杂......
【解决方案2】:

正如你一样,我也发现了处理 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,如果存在,选择“Bingo!没有发生虚拟化”,如果不存在,“不好,让我们找一些其他存储位置”。如果 Process-2 中的代码“失败”,则向用户显示一些错误消息。

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2010-11-05
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多