使应用程序成为系统关键流程

发布于 2024-10-01 08:42:27 字数 43 浏览 2 评论 0原文

我怎样才能创建一个关键系统进程,以便它不能从 C# 中的任务管理器结束?

how can i make a Critical System Process so that it can't be ended from task manager in C#?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独守阴晴ぅ圆缺 2024-10-08 08:42:27

一般来说,这是不可能的,因为这会剥夺用户的控制权。 Windows 甚至允许您杀死高度关键的进程,例如 csrss.exe(请不要尝试杀死它,保证立即出现 BSOD)。

Raymond Chen 对此进行了很好的解释:

程序和用户之间的军备竞赛

如果您不希望用户终止您的进程,请将其作为服务并剥夺用户的管理员权限。

In general, it is not possible to do so because it would take away control from the user. Windows even allows you to kill highly critical processes such as csrss.exe (don't try killing it, please, instant BSOD is guaranteed).

The very good reasons why this is so have been very well explained by Raymond Chen:

The arms race between programs and users

If you don't want users to kill your process make it a service and take away administrator privileges from your users.

浸婚纱 2024-10-08 08:42:27

可能有点晚了,但这是我

    [DllImport("ntdll.dll", SetLastError = true)]
    private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3);
    [DllImport("advapi32.dll", SetLastError = true)]

    private static extern bool SetKernelObjectSecurity(
         IntPtr handle,
         int securityInformation,
         [In] byte[] securityDescriptor
     );

在 C# 上调用该函数的

RtlSetProcessIsCritical(1, 0, 0);

代码,请注意,

  • 您需要管理员,因为
  • 每当您关闭进程

以恢复正常状态时,这都会导致 BSOD

RtlSetProcessIsCritical(0, 0, 0);

may be a little late but this is the code I use

    [DllImport("ntdll.dll", SetLastError = true)]
    private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3);
    [DllImport("advapi32.dll", SetLastError = true)]

    private static extern bool SetKernelObjectSecurity(
         IntPtr handle,
         int securityInformation,
         [In] byte[] securityDescriptor
     );

calling the function on C#

RtlSetProcessIsCritical(1, 0, 0);

just note that

  • you need administrator for this
  • causes BSOD whenever you close the process

to go back to normal just do

RtlSetProcessIsCritical(0, 0, 0);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文