【问题标题】:Delete HKEY_CURRENT_USER value on user log off在用户注销时删除 HKEY_CURRENT_USER 值
【发布时间】:2013-05-02 09:32:57
【问题描述】:

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

考虑但拒绝了以下内容:

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

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

【问题讨论】:

  • WM_QUERYENDSESSION 怎么样?
  • @chris,如何识别用户注销?
  • 您是否控制服务程序和/或软件的安装?如果是这样,您可以在软件终止时取消设置该值(如果您确实使用 C++,请使用 RAII)。如果您控制安装/卸载程序,则可以选择在卸载时从注册表中删除任何此类值。
  • @ArneMertz,我控制为任何登录用户设置注册表值的服务。问题是当软件卸载时,它只能删除当前登录用户的值,并且无法访问已注销用户的HKEY_CURRENT_USER 键,因此无法删除注册表值。
  • 您可以在卸载时枚举机器上的所有用户配置文件,在 SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList 获取“ProfileImagePath”值,然后动态加载“配置文件”和删除你想要的密钥。

标签: c++ windows winapi


【解决方案1】:

既然你已经在服务了,你的生活(应该)轻松的。 事实上,您可以注册自己以接收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ão Augusto 解决方案更清洁;我会用它来解决类似的问题;但是,我想添加此解决方案以回答更广泛的问题(供将来参考的读者)

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

【讨论】:

  • 如果有多个用户登录,我如何确定哪个用户正在注销?
  • 通过使用 dwSessionId 参数。然后,您可以使用它(我认为通过 WTSQuerySessionInformation 作为 chris 在 cmets 中建议的),以获取有关用户的任何类型的信息
  • 既然我想你正在使用 ImpersonateLoggedOnUser 对注册表进行操作,请参阅this good answer on how to get the user token from a session id stackoverflow.com/a/4534100/863564
  • 感谢您所做的一切(仅凭努力+1)。我会试一试,然后告诉你进展如何。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 2021-03-07
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多