我正在使用Delphi,RAD Studio 10构建Windows服务应用程序
根据我的调查,我遇到了一个Eset Windows服务,奇妙地保护自己不会被停止或终止。
使用(Windows服务管理器)或(结束进程按钮)停止服务 或(结束任务按钮)发生以下错误消息:
无法完成操作。
访问被拒绝。
其注册表项也是如此。错误消息是:
无法删除信息:删除密钥时出错
我测试了管理员访问权限和系统访问权限。在这两种情况下我都没有成功。
我想为我自己的应用程序构建这样的自我防御机制来保护我的服务和注册表项。
任何想法都会有所帮助。
感谢您的时间。
更新:
我想知道我如何在Delphi中做到这一点...这就是为什么它被标记为Delphi
并且如果有人想停止服务或卸载它....
他或她可以使用我自己的应用程序UI来完成它。
编辑2:
正如Remko所说,我认为DACL和ACL是处理它的更好方法,我找不到任何好的参考资料。对Delphi语言有什么好的参考吗?
答案 0 :(得分:2)
保护SCM停止非常容易。假设您使用的是TService
,则可以处理TService.OnStop
事件并将其Stopped
参数设置为False。并为TService.ErrCode
或TService.Win32ErrCode
属性分配错误代码。
除非您正在编写安全软件,否则您实际上不应该阻止TaskManager终止。应该允许管理员杀死行为不当的进程。话虽这么说,您可以使用SetSecurityInfo()
为您的服务流程分配一个DACL,根据需要授予/拒绝对特定用户和/或组的访问权。
如果服务意外终止,您还可以使用ChangeServiceConfig2()
配置服务的“失败操作”以重新启动服务。
要保护您的注册表项,您可以使用RegCreateKeyEx()
的lpSecurityAttributes
参数,或使用RegSetKeySecurity()
功能为您的密钥分配SECURITY_DESCRIPTOR
DACL根据需要授予/拒绝对特定用户和/或组的访问权。