卸载自定义操作不删除注册表项
在我的程序中,我在当前用户下创建了一个注册表项。 该程序由具有最高权限的任务计划程序运行(S-1-5-32-545)。
在我的卸载自定义操作中,我有代码删除此密钥。
当我以管理员身份运行时,删除密钥的代码有效。
从卸载自定义操作运行时,代码不起作用。
我猜测它在后一种情况下不起作用的原因是因为当卸载程序执行时当前用户与本地管理员执行代码时不同。
从卸载自定义操作运行时,如何删除此注册表项? 如何将卸载自定义操作指向正确的当前用户?
我基本上不熟悉Windows 10中任务调度程序的使用。我在Windows 2000中使用了很多,然后它非常原始 – 严重缺乏我需要的function。
我会尝试为你添加一些观察结果,如果它不是一个答案,请耐心等待。 如果是这种情况,请更新您的问题并提供更多详细信息 – 因此我们可以准确了解您的需求。
添加/删除计划任务
我想知道你是如何创建计划任务的? 你是直接攻击注册表吗? 您应该使用schtasks.exe通过WiX软件包的命令行创建和删除它。 以下是他们处理同一问题的一个问题/答案: WIX创建计划任务 。
你已经知道了这一点,但这也适用于其他人:
- 使用计划任务控制台手动创建计划任务。
- 按住Windows键 ,轻按R.
- 输入 :
taskschd.msc
并按Enter键
- 现在,在计划任务GUI中手动创建任务并对其进行测试。
- 使用schtasks.exe通过WiX包中的安静执行自定义操作创建/删除计划任务。
- 您可以使用任务设置导出XML,并将其与schtasks.exe一起使用。 我没有对此进行过测试,但这里有一个示例: 在WiX包中使用带有Schtasks.exe的XML任务文件 。
- 您还可以使用MSI属性推送命令行,如下所示: WIX创建计划任务 。
存储计划任务
计划任务似乎不存储在注册表(HKCU)的用户部分中,而是存储在磁盘上和注册表(HKLM)的每个计算机部分中: Windows在哪里存储Scheduled Tasks控制台的设置? 这应该意味着只需在卸载时删除它们就可以删除机器上的所有用户。 您的HKCU注册表密钥如何进入图片? 这是Schtasks.exe上的MSDN页面 。
计划任务的替代方案
仅作为记录,有一些替代方案可以将您的应用程序作为计划任务运行,这可能比计划任务更好或更容易:
- 您可以将应用程序作为Windows服务运行 。
- 这是开发人员需要更改代码的重要“解决方案”,但可能是最可靠的 – 特别是对于关键业务的东西。
- 请参阅此摘要: 何时应使用计划任务而不是Windows服务?
- Windows服务对于24/7任务更可靠。
- 针对“不时”发生的事情的计划任务(甚至在登录时一次)。
- “ 总之,对于不需要复杂控制的定期维护类型杂务,计划任务通常更好 ”。
- 服务通常应该作为LocalService,LocalSystem,Network Service运行 – 没有GUI – 但它也可以使用用户凭据运行。
- Windows服务常见问题(FAQ) 。 仅供参考和“保管”链接。
- 查看您可以在此处使用的有关不同服务帐户的一些信息: “本地系统”帐户与“网络服务”帐户之间的区别?
- 您的应用程序是否向用户提供了实际的GUI? 似乎这已经不可能了(因为Vista):
互动服务。 我问过这是否准确,或者“历史是否再次发生变化”。 菲尔威尔逊 (MSI专家)可能会告诉我们 – 我在当天读了一篇关于他服务的文章。
- 您可以按照此处的建议将启动文件夹用于allusers 。
- 这里有几种选择。 请检查链接。 链接文章中还有其他链接值得快速阅读。
-
在注册表中注册以在启动/登录时启动 。
- 好工具 : autoruns64.exe 。 如果你真的想弄清楚多种方法在启动时运行 (通过在注册表中注册),你可以使用Sysinternals工具autoruns64.exe (这是来自live sysinternals工具共享的直接下载链接, 这里是微软页面 )。
- 这个工具实际上向您展示了在系统启动时可以通过注册“ 在注册表中的某个位置 ”来安排运行的方式。
Drivers
,services
,scheduled tasks
,IE
,WinLogon
等等。 也许取消选中"Hide" entries
Options menu
的"Hide" entries
,使其真正被相关密钥(恶意软件向量堆)的数量所困扰。 -
警告 :此工具不适用于普通用户。 如果你不知道自己在禁用什么,它就拥有你需要用脚射击自己所需的所有绳索。 请开发人员/系统管理员 。 奇怪的是,它看起来并不像工具中列出了用户配置文件中的启动文件夹 – 我想它只是一个与基于注册表的启动器有关的工具。 我找到的截图:
-