我有一些当前存储在 HKEY_LOCAL_MACHINE 中的程序设置。由于 Vista 和锁定用户,一些用户没有 HKEY_LOCAL_MACHINE 的权限,而且这些值也不真正属于 HKEY_LOCAL_USER(它必须对所有用户都相同),存储这些的最佳替代位置是什么?
大多数设置已经存储在数据库中,但是在连接到数据库之前程序需要了解一些设置。理想情况下,我会喜欢一种无需检查正在运行的操作系统即可实现此功能的方法。
这是一个用 Delphi 编写的桌面应用程序。
你应该把:
HKEY_CURRENT_USER
注册表CSIDL_APPDATA
或文件夹中的个人设置(如窗口位置和次要首选项)CSIDL_LOCAL_APPDATA
;HKEY_LOCAL_MACHINE
注册表或应用程序文件夹中的重要应用程序设置(如用户不应修改的固定路径) 。在安装时设置它们,当管理员权限可用时;CSIDL_COMMON_APPDATA
文件夹中的共享数据(所有用户都应该读取和写入的数据,例如简单的数据库) 。使用SHGetFolderPath查找CSIDL_*
文件夹的位置。
根据您的需要,您可能希望同时实现所有三个选项。它不会有任何问题。
可能是注册表中放置它们的好地方,我不知道,但为什么不在 C:\Documents and Settings\All Users\Application Data\yourApp 中添加一个ini文件
@uli所说的,除了一个例外 。
永远不会更改或只能由管理员更改的设置可以——应该,甚至——保存在与应用程序相同的文件夹中,以帮助防止篡改。
数据库的连接信息听起来像是在没有管理员干预的情况下不应该更改的东西。因此,在这种情况下,您的应用程序文件夹可能没问题。
您提到了 HKEY_LOCAL_USER,但我没有在注册表的顶层看到它。我猜你一定是指 HKEY_CURRENT_USER。
我将用户设置放在 HKEY_CURRENT_USER/Software/my-program 下。我发现这在 Vista 下可以正常工作。
但是,既然您说您有适用于 HKEY_CURRENT_USER 下不想要的所有用户的设置,那么您可以尝试:
HKEY_USERS/.DEFAULT/Software/your-program
或者
HKEY_CURRENT_CONFIG/软件/你的程序
恐怕我不使用这些位置中的任何一个,所以我无法告诉您它们是否可以在 Vista 上运行,但我确实看到一些软件供应商已经在那里添加了注册表项。
将内容保存在 %APPDATA% 或 %LOCALAPPDATA%
问问自己你的设置是否真的适用于所有用户。真的适合所有用户吗?
仔细想想这个问题:
该软件如何在 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%\Surveillance\settings.ini
文件。让安装程序创建设置文件,并对其进行 ACL 以允许所有用户拥有完全控制权
iii) 将设置存储在上述注册表项或 ini 文件中,并使用
将 UAC Shield 添加到您的保存/确定/应用按钮。当用户按下按钮时,您重新启动提升的应用程序(使用RunAsAdmin),传递命令行参数指示您要更改的内容。
iv) 与 3 相同,但在他们进入用于编辑值的屏幕之前执行此操作。
v) 执行与 4 相同的操作,但初始值为只读,如果他们想要更改它们,则必须提升。
vi) 如果用户作为标准用户运行,并且如果他们想要更改它们,请禁用这些选项:右键单击可执行文件并选择
以管理员身份运行
如果这是一个用户可以随时更改的选项(当您在 Windows XP 上运行并且用户是管理员时),那么用户能够随意编辑该值似乎是可以接受的。
在这种情况下,您可以让用户输入服务器的名称,就像他们之前允许的那样。如果用户有权写入 HKLM,则将选项保存在那里。否则将其保存在 HKCU 中。读取要使用的服务器时,从 HKCU 开始,如果 HKCU 值不存在,则移至 HKLM。
重新使用 ini 文件 - 请注意项目似乎有2048 byte
限制。
由于这个原因,我陷入了困境 - 编码的许可证信息徘徊在(当时未知的)限制附近以及当他们过去时似乎总是“神秘地”打破的东西......
您能否制作一个 .msi 文件,该文件可用于通过组策略将注册表设置推送出去?
总是有老式的 INI 文件。它们比注册表设置更便携。另一种选择是 XML 文件。
但是不要将它们存储在 Program Files 目录中——Vista 不会喜欢这样。
我在这里阅读了所有答案以及其他地方的内容,答案似乎是......不要使用注册表!这真的是微软希望我们对适用于所有用户的程序配置数据做的事情吗!?