在哪里存储程序设置而不是HKEY_LOCAL_MACHINE?

时间:2008-11-12 20:41:37

标签: delphi registry

我有一些当前存储在HKEY_LOCAL_MACHINE中的程序设置。由于Vista和锁定用户,一些用户没有HKEY_LOCAL_MACHINE的权限,这些值也不属于HKEY_LOCAL_USER(对于所有用户必须是相同的),存储这些值的最佳替代位置是什么?

大部分设置已存储在数据库中,但在连接到数据库之前,程序需要了解一些设置。理想情况下,我想要一种实现这一点的方法,而无需检查正在运行的操作系统。

这适用于用Delphi编写的桌面应用程序。

10 个答案:

答案 0 :(得分:32)

你应该把:

  • 注册表或HKEY_CURRENT_USERCSIDL_APPDATA文件夹中CSIDL_LOCAL_APPDATA下的个人设置(如窗口位置和次要偏好设置);
  • 注册表或应用程序文件夹中HKEY_LOCAL_MACHINE下的重要应用程序设置(如用​​户不应修改的固定路径)。在管理员权限可用时,在安装时设置它们;
  • CSIDL_COMMON_APPDATA文件夹中的共享数据(所有用户应读取和写入的数据,如简单数据库)。

使用SHGetFolderPath查找CSIDL_*文件夹的位置。

根据您的需要,您可能希望同时实施所有三个选项。它没有任何问题。

答案 1 :(得分:13)

可能在注册表中放置一些我不知道的好地方,但为什么不在C:\ Documents and Settings \ All Users \ Application Data \ yourApp

中添加一个ini文件

答案 2 :(得分:2)

@uli说的是什么,只有一个例外。

永远不会改变或只应由管理员更改的设置可以 - 甚至 - 与应用程序保存在同一文件夹中,以帮助防止篡改。

数据库的连接信息听起来就像没有管理员干预就不应该更改的东西。因此,在这种情况下,您的应用程序的文件夹可能没问题。

答案 3 :(得分:1)

您提到了HKEY_LOCAL_USER,但我没有在注册表的顶层看到它。我猜你一定是指HKEY_CURRENT_USER。

我将我的用户设置放在HKEY_CURRENT_USER / Software / my-program下。我发现这可以在Vista下运行而没有问题。

但是,既然您说您的设置适用于HKEY_CURRENT_USER下您不想要的所有用户,那么您可以尝试:

  

HKEY_USERS / .DEFAULT /软件/你的程序

  

HKEY_CURRENT_CONFIG /软件/你的程序

我担心我不会使用其中任何一个位置,所以我不能告诉你他们是否在Vista上工作,但我确实看到一些软件供应商在那里添加了注册表项。

答案 4 :(得分:1)

将内容保存在%APPDATA%或%LOCALAPPDATA%

答案 5 :(得分:1)

问问自己,您的设置是否真的适合所有用户。对所有用户来说真的吗?

仔细想想这个问题:

该软件如何在Windows XP下作为标准用户运行?

  • 软件是否真的崩溃了?
  • 配置选项是否已停用?
  • 您是否告诉客户他们必须以管理员身份运行,如果他们拒绝,那么您是否会支持它?

因为如果您的软件绝对需要您是管理员,那么只需将清单添加到可执行文件中,说它需要以管理员身份运行:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
   <assemblyIdentity 
      version="1.0.0.0"
      processorArchitecture="X86"
      name="IsUserAdmin"
      type="win32"/> 

   <description>Description of your application</description> 

   <!-- Identify the application security requirements. -->
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
                <requestedExecutionLevel
               level="requireAdministrator"
               uiAccess="false"/>
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly>

而且,你是管理员。


但我不认为你真的需要成为管理员。您需要本地计算机设置的唯一时间是您将使用该软件从多个登录或会话中获得用户。如果它确实适用于每个用户,那么安装程序是否应该设置它?

我们在这里遇到了同样的问题。监控系统需要配置软件将使用哪个捕获设备。您可以说所有监视操作员都将使用相同的捕获设备,因此一旦选择它,该设置对所有操作员来说都是全局的。但这在实践中并非如此。有可能只有一次捕获设备,它就是我们使用的设备。如果有多个,那么用户可以简单地选择另一个设备。


但是有几种方法可以处理这个

i)将设置保存在注册表中,并让安装程序在密钥上设置ACL,为所有用户提供完全控制

ii)将设置保存在

  

%APPDATA%\监视\的Settings.ini

文件。让安装程序创建设置文件,并使用ACL对所有用户进行完全控制

iii)将设置存储在上述注册表项或ini文件中,然后使用

将UAC Shield添加到保存 / 确定 / 应用按钮。当用户按下按钮时,您重新启动应用程序(使用RunAsAdmin),并传递指示您要更改内容的命令行参数。

iv)与3相同,但在进入用于编辑值的屏幕之前执行此操作。

v)与4相同,但最初只读取值,如果他们想要更改它们,则必须提升。

vi)如果用户以标准用户身份运行,并且他们想要更改它们,请禁用这些选项:右键单击可执行文件并选择

  

以管理员身份运行


如果这是一个用户可以随时更改的选项(当您在Windows XP上运行并且用户是管理员时),那么似乎用户能够随意编辑该值是可以接受的。

在这种情况下,您可以让用户输入服务器的名称,因为他们之前允许这样做。如果用户有权写入HKLM,则将选项保存在那里。否则将其保存在HKCU。在阅读使用哪个服务器时,如果HKCU值不存在,请从HKCU开始,然后转移到HKLM。

答案 6 :(得分:1)

重新使用ini文件 - 请注意项目似乎有2048 byte限制。

由于这个原因,我已经解开了 - 编码的许可证信息徘徊在(当时未知的)限制和&amp;在他们过去的时候似乎总是“神秘地”打破......

答案 7 :(得分:0)

您是否可以创建一个可用于通过组策略推送注册表设置的.msi文件?

答案 8 :(得分:0)

总有老式的INI文件。它们更便于注册表设置。另一种选择是XML文件。

不要将它们存储在Program Files目录中 - Vista不会那样。

答案 9 :(得分:0)

我在这里阅读所有答案和其他地方的东西,答案似乎是......不要使用注册表!这真的是微软希望我们使用适用于所有用户的程序配置数据吗?