unction KillTask(const ExeName: string): Boolean;
{
  强制终止ExeName对应的应用程序
}
var
  lppe: TProcessEntry32;
  SH, PID: THandle;
  Found: boolean;
begin
  Result := False;
  //EnablePrivilege('SeDebugPrivilege', True);
  lppe.dwSize := SizeOf(lppe);
  SH := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  found := Process32First(SH, lppe);
  while found do
  begin
    if SameText(ExeName, ExtractFileName(lppe.szExeFile)) then
    begin
      PID := OpenProcess(PROCESS_ALL_ACCESS, true, lppe.th32ProcessID);
      Result := TerminateProcess(PID, DWORD(-1));
      CloseHandle(PID);
    end;
    found := Process32Next(SH, lppe);
  end;
  //EnablePrivilege('SeDebugPrivilege', False);
end;
用如上函数可以结束普通运行的exe文件进程,但是如果是以system运行的,结束不了,求解,改怎么办?

解决方案 »

  1.   

    这个涉及到windows权限问题,system账户运行的程序是默认是无法结束的,即使是administrator(权限低于system)也不行,除非当前操作者通过特殊手段取得system账户权限,才能结束那些系统进程。
      

  2.   

    OpenProcess(PROCESS_ALL_ACCESS, true, lppe.th32ProcessID)
    我觉得这里的PROCESS_ALL_ACCESS取得了当前用户对于该程序的权限,而不具有system权限
      

  3.   

    以下是我用来结束程序的一个方法,不知是否有用。要结束system的程序,估计有点困难,没有测试过。function close_exe(exe_name:string):Boolean;//关闭正在运行的程序,exe_name程序名,例如×××.exe
    var
      hWndClose    :HWnd; //存储指定的外部应用程序窗口句柄
      str          :string; //存储指定的外部应用程序
    begin
      str :=exe_name ; //获取要关闭的应用程序
      if str <> '' then
        begin
          //根据窗口名查找要关闭的窗口句柄
          hWndClose := FindWindow(nil, PChar(str));
          if hWndClose <> 0 then //如果查找成功,则发送消息,关闭指定的窗口
            begin
              SendMessage(hWndClose, WM_CLOSE, 0, 0);
            end;
        end;
    end;