【发布时间】: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”值,然后动态加载“配置文件”和删除你想要的密钥。