3

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

考虑但拒绝了以下内容:

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

有没有其他机制可以解决这个问题?Windows 版本为 XP、Vista 和 7。

4

2 回答 2

4

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

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

查看有关MSDN1MSDN2MSDN3 的详细信息 - 包含感兴趣会话的 dwSessionId 的数据结构

也查看这个相关(但不重复)的问题

也就是说,我发现 João Augusto 解决方案更清洁;我会用它来解决类似的问题;但是,我想添加此解决方案以回答更广泛的问题(供将来参考的读者)

编辑:另一种方法是使用 SENS,请查看此MSDN 文章

于 2013-05-08T15:05:30.663 回答
0

一种更简单的方法是将删除相关值的命令放入用户的 RunOnce 键中,例如,

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

以便在用户下次登录时删除不需要的值。但是请注意,这可能会干扰值的创建,具体取决于您如何处理它。

于 2013-05-08T23:36:24.350 回答