我正在编写一个包含Windows服务和GUI程序的程序,因为Windows服务无法直接与windows通信。
这是一个程序,它与服务器守护程序相互作用,阻止学生登录多个工作站的一个帐户。 (防止密码共享)
使用Windows自动启动启动GUI进程并使用用户权限运行。因此,用户可以轻松地杀死GUI进程。这不好,因为GUI进程导致注销(和用户消息)。
如何阻止用户杀死该进程?
答案 0 :(得分:9)
由于您无法使用操作系统安全性来防止这种情况,因此技术上的答案是无法完成。这只留下了解决方法或替代方法。
一种解决方法是未得到官方支持,依赖于未记录的功能,而您没有收到我的回复是:
public static class Unkillable
{
[DllImport("ntdll.dll", SetLastError = true)]
private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3);
public static void MakeProcessUnkillable()
{
Process.EnterDebugMode();
RtlSetProcessIsCritical(1, 0, 0);
}
public static void MakeProcessKillable()
{
RtlSetProcessIsCritical(0, 0, 0);
}
}
致电Unkillable.MakeProcessUnkillable
后,终止该流程将立即导致BSOD。这是一个非常难看的解决方案,但很难反驳“可以在2分钟内实施”。
另一种解决方法是创建一组进程,通过在每个人死亡时重新启动来进行协作。
答案 1 :(得分:3)
使用Windows自动启动启动GUI进程并使用用户权限运行。因此,用户可以轻松地杀死GUI进程。
这个怎么样:你运行GUI过程向他们展示消息,但你use the service to actually log off。然后,他们可以随心所欲地杀死GUI进程,而不会影响软件的主要功能。
答案 2 :(得分:1)
也许您应该更好地配置网络。如果您的域设置正确,您可以设置一个logon script来检查域控制器是否已登录,如果用户已登录其他位置,则将其注销。
我假设每台PC都设置了适当的帐户设置(即不是管理员)。
登录脚本还可以执行其他操作,例如设置网络共享。
答案 3 :(得分:0)
您可以查看从任务管理器隐藏进程的rootkit样式方法。这不是一个特别优雅的解决方案。
答案 4 :(得分:0)
你可以使用this code使一个进程难以杀死(普通的C,对不起,但是移植到C#应该不会太难)。
从技术上讲,这并不会阻止用户终止进程,因为他们可以更改权限,但他们需要编写代码或使用专门设计的工具来执行此操作。除非用户具有管理员权限,否则任务管理器和pskill都不会工作。
通过让服务使用备份/恢复权限来获取进程的所有权,可以防止非管理员用户更改权限。
答案 5 :(得分:0)
我最终使用另一个RunAs程序CPAU,以登录时以管理员身份启动该过程。这样做,学生至少可以使用Taskmanager或类似工具轻松杀死它。
我可能稍后会实现Jon建议的方法。这样,即使学生以某种方式设法杀死这个过程,他们也不会成功。
答案 6 :(得分:-1)
您不应该禁止用户终止您的应用程序。如果GUI断开后服务失败,那么您应该修复服务而不是GUI。
但如果你真的想停止申请,请查看here