删除用户注销时的HKEY_CURRENT_USER值

时间:2013-05-08 08:20:53

标签: c++ windows winapi

Windows服务为每个登录用户在HKEY_CURRENT_USER注册表项下创建一个注册表值(对于Excel加载项)(通过调用ImpersonateLoggedOnUser()RegSetValueEx())。 我需要在用户注销时删除此注册表值,包括系统关闭。 如果在注销时未删除它,并且某个用户卸载了该软件,那么注册表中的条目将保留在服务生命周期内登录的任何其他用户,这会导致每次Excel开始时都会显示消息框错误因为它正在尝试加载不再存在的加载项。

考虑但拒绝了以下内容:

  • SetConsoleCtrlHandler()因为没有迹象表明用户正在注销。
  • REG_OPTION_VOLATILE因为它仅在创建密钥时有效且我只创建了一个值(即使我正在创建密钥,也没有彻底调查,所以可能没有解决方案)。

是否有其他机制可以为此提供解决方案? Windows版本是XP,Vista和7。

2 个答案:

答案 0 :(得分:3)

由于您已经在服务,您的生活(应该) 很容易。 事实上,您可以注册自己接收SERVICE_CONTROL_SESSIONCHANGE事件。特别是,您需要查找WTS_SESSION_LOGOFF原因。

您必须在启动时在服务控制例程中注册这些事件,并添加SERVICE_ACCEPT_SESSIONCHANGE。当事件为SERVICE_CONTROL_SESSIONCHANGE时,lpEventData参数是指向WTSSESSION_NOTIFICATION结构的指针,其中包含有关当前正在终止的会话的信息(因此,关于用户注销)。

查看有关MSDN1MSDN2MSDN3 - the data structure that contains the dwSessionId of the interesting session

的详细信息

查看此相关(但不重复)question

那就是说,我发现JoãoAugusto溶液清洁剂;我会用它来解决类似的问题;但是,我想添加这个解决方案,以便回答更广泛的问题(对于未来的参考读者)

编辑:另一种方法是使用SENS,检查此MSDN article

答案 1 :(得分:0)

更简单的方法是将命令移除到用户的RunOnce密钥中,例如,

 reg.exe delete HKCU\Software\xyzzy /v myvalue /f

以便在用户下次登录时删除不需要的值。但是,请注意,这可能会影响值的创建,具体取决于您处理该值的方式。

相关问题