阻止进程从任务pipe理器中取消反转

我使用下面的代码,以防止用户从任务pipe理器(我发现它的地方)杀死我的程序:

function PreventProcessKill: Integer; var hProcess:Thandle; EmptyDacl: TACL ; pEmptyDacl: PACL ; dwErr : DWORD ; begin hProcess := GetCurrentProcess(); ZeroMemory(@EmptyDacl, SizeOF(tacl)); pEmptyDacl := @EmptyDacl; if (not InitializeAcl(EmptyDacl, sizeof(tACL), 2)) then dwErr := GetLastError() else dwErr := SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @EmptyDacl, nil); Result:= dwErr; end; 

它工作得很好,但在我的程序中的某个点,我需要恢复的效果,并允许从任务pipe理器closures。 有任何想法吗?

当您调用SetSecurityInfo时,您正在修改DACL。 所以,就在你调用GetSecurityInfo之前,记下原始进程DACL。 到时候,再次调用SetSecurityInfo来恢复它。

请注意,一个确定的用户也可以这样做,所以你不能阻止他们杀死进程。 你只是使它有点尴尬。

我终于找到了。 我可以调用SetSecurityInfo,传递nil而不是空的DACL。 看起来,一个空DACL的意思是“没有权限”,一个空DACL的意思是“所有权限”。