Delphi(程序人生)

Delphi Programer DoubleCat

导航

如何暴力关闭一个服务程序?

uses Tlhelp32;
function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE 
= $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result :
= 0;
  FSnapshotHandle :
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize :
= SizeOf(FProcessEntry32);
  ContinueLoop :
= Process32First(FSnapshotHandle, FProcessEntry32);

  
while Integer(ContinueLoop) <> 0 do
  
begin
    
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) 
or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) 
then
    Result :
= Integer(TerminateProcess(
    OpenProcess(PROCESS_TERMINATE,
    BOOL(
0),
    FProcessEntry32.th32ProcessID), 
0));
    ContinueLoop :
= Process32Next(FSnapshotHandle, FProcessEntry32);
  
end;
  
  CloseHandle(FSnapshotHandle);
end;



但是对于服务程序,它会提示"拒绝访问".其实只要程序拥有Debug权限即可:

function EnableDebugPrivilege: Boolean;
  
  
function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
  
var
    TP: TOKEN_PRIVILEGES;
    Dummy: Cardinal;
  
begin
    TP.PrivilegeCount :
= 1;
    LookupPrivilegeValue(
nil, pchar(PrivName), TP.Privileges[0].Luid);
    
    
if bEnable then
      TP.Privileges[
0].Attributes := SE_PRIVILEGE_ENABLED
    
else 
      TP.Privileges[
0].Attributes := 0;
      
    AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), 
nil, Dummy);
    Result :
= GetLastError = ERROR_SUCCESS;
  
end;

var
  hToken: Cardinal;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  result :
= EnablePrivilege(hToken, 'SeDebugPrivilege', True);
  CloseHandle(hToken);
end;

使用方法:
EnableDebugPrivilege;//提升权限
KillTask('xxxx.exe');//关闭该服务程序.

posted on 2008-06-14 17:37  DoubleCat  阅读(413)  评论(0编辑  收藏  举报