我想在目标机器上跟踪系统范围内的设置——它是一个运行时间计数器,用于跟踪我的客户端运行我的软件的次数。我决定把这个值放在注册表中,但我真的想跟踪它为整个系统运行了多少次,而不仅仅是当前用户帐户。
我希望使用 HKLM 在机器级别进行跟踪,但 UAC 现在不喜欢这个。
是否有正确的方法来读取和写入机器范围的设置?
HKLM
不适合这种用途(至少从 Windows XP 开始)。
请改用%PROGRAMDATA%
文件夹(您也可以通过 WinAPI 函数SHGetKnownFolderPath
使用FOLDERID_ProgramData
(SHGetFolderPath
在CSIDL_APPDATA
Vista 之前的 Windows 版本上使用)。它专为机器的所有用户全局的应用程序数据而设计。(在 Windows 7 上,这是C:\ProgramData
文件夹默认情况下。)您的应用程序应该在下面创建一个目录,并将计数器信息存储在该位置的文件中。
(这也意味着您不必通过允许在不适当的位置对注册表进行公共写访问来破坏 UAC 的目的。)
从Environment.SpecialFolder 枚举:
CommonApplicationData 该目录用作所有用户使用的特定于应用程序的数据的公共存储库。
在您的安装程序中创建一个“CommonApplicationData\Your Company Name\Your Product Name”文件夹,并更改该文件夹的 ACL 以允许有限的用户完全控制权限(继承的权限对于有限的用户是只读的)。您可以通过 LockPermissions MSI 表执行此操作,或者如果您的安装程序不支持 LockPermissions,请创建自定义操作来更改 ACL。
您还需要处理由快速用户切换造成的潜在编辑冲突。