2

以下のコードを使用して、ユーザーがタスク マネージャーからプログラムを強制終了できないようにします (どこかで見つけました)。

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;

それはうまく機能しますが、私のプログラムのある時点で、効果を元に戻し、タスクマネージャーから閉じることができるようにする必要があります. 何か案は?

4

2 に答える 2

6

SetSecurityInfo を呼び出すときに、DACL を変更しています。そのため、その直前に GetSecurityInfo を呼び出して、元のプロセス DACL を書き留めます。その時が来たら、もう一度 SetSecurityInfo を呼び出して元に戻します。

決心したユーザーもこれを行うことができるため、プロセスの強制終了を実際に停止することはできないことに注意してください。あなたはそれを少しぎこちなくしているだけです。

于 2013-06-23T08:18:34.067 に答える
-1

やっと見つけました。空の DACL の代わりに nil を渡して、SetSecurityInfo を呼び出すことができます。空の DACL は「アクセス許可なし」を意味し、null DACL は「すべてのアクセス許可」を意味するようです。

于 2013-06-29T06:14:52.183 に答える