服务程序部署后TimerBackup_Tick触发空引用异常问题排查
问题原因及解决方案
核心原因
服务程序默认运行在Local System账户下,这个账户没有交互式登录会话,对应的Registry.CurrentUser注册表 hive 并未加载,直接调用OpenSubKey就会触发NullReferenceException——因为Registry.CurrentUser本身就是null,而非子项不存在。
调试时你用的是当前登录用户的身份,CurrentUser hive 正常加载,所以能正常读取注册表。
可行解决方案
- 改用
Registry.LocalMachine存储配置:如果你的注册表项可以迁移到HKEY_LOCAL_MACHINE下,直接替换代码为Registry.LocalMachine.OpenSubKey(mainsubkey),这样服务账户(Local System)默认有访问权限。 - 修改服务登录账户:在服务管理器中找到你的HimayaService,右键属性→登录,选择一个有交互式登录权限的用户账户(比如你调试用的用户),这样服务运行时会加载该用户的
CurrentUserhive,就能正常读取原注册表项。 - 加载指定用户的注册表 hive:如果必须用
CurrentUser,可以通过P/Invoke调用RegLoadKey加载目标用户的HKEY_USERS下的对应SID hive,但这种方式需要更高权限,且实现复杂,不推荐作为首选。
内容的提问来源于stack exchange,提问作者Zayd
相关产品推荐
相关产品推荐

