如何防止用户篡改、停止或崩溃正在后台工作且可能需要一段时间才能完成的 Windows 服务?
收到停止请求后,服务应等到工作完成后再停止。
有CanStop
服务标志,但我不确定如何响应 OnStop 消息。如果用户确实试图使服务崩溃,我该如何防止进一步的篡改?
编辑:从家长控制到任何后台进程的广义问题。
如何防止用户篡改、停止或崩溃正在后台工作且可能需要一段时间才能完成的 Windows 服务?
收到停止请求后,服务应等到工作完成后再停止。
有CanStop
服务标志,但我不确定如何响应 OnStop 消息。如果用户确实试图使服务崩溃,我该如何防止进一步的篡改?
编辑:从家长控制到任何后台进程的广义问题。
用户必须拥有管理员权限才能停止服务。我不认为有一种万无一失的方法可以保护程序免受具有管理员权限的人的侵害。如果您不希望“不受信任的用户”停止服务,请不要给“不受信任的用户”管理员权限。
在这一点上似乎有些绊脚石,所以让我澄清一下。假设管理员决定要卸载您的程序。这通常只需点击几下鼠标。你会采取措施防止这种情况发生吗?
在这里仔细考虑你的答案。任何故意阻止管理员卸载的程序都是恶意软件。
我知道自从 NT 推出以来,它已成为标准,为所有家庭 PC 用户提供管理员权限,以便他们可以随心所欲地安装和玩游戏。但是,对于 Vista 和 Win7,这已经不再是真正需要的了,人们应该改掉这种习惯。这是非常糟糕的安全实践,即使对于“受信任的”用户也是如此。
告诉您的用户他们必须真正遵循一些安全实践并不是一件坏事。他们会发现他们也必须以这种方式从他们的机器上清除更少的恶意软件和病毒。
你的威胁模型是什么?如果没有威胁模型,就不可能找出正确的方式来花费你的精力。
目前,让我们只考虑防止服务被停止,而不是防止或篡改或崩溃。
TED 正确地说,如果任何管理员想要停止服务,您通常不应该试图阻止这种情况。否则管理员怎么做故障隔离、以准系统模式启动Windows等等?
正如您所说,ServiceBase.CanStop属性用于防止服务停止。此属性通常仅由必须运行的操作系统关键服务使用。
在主服务线程中,您可以忽略OnStop事件并永远循环。所以 SCM 会认为服务已停止,即使它仍在运行。这是相当讨厌的,但应该工作。SCM 只是发出停止请求,而不是实际强制停止。