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

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');//关闭该服务程序.

你可能感兴趣的:(程序)