请问各位大虾,如何杀死注册为服务的进程。
包括系统进程也可以?
不要说不能实现哦,杀毒软件就可以做到的哦~~~求大家帮帮忙拉~~~~

解决方案 »

  1.   

    使用API函数:
    ControlService uses WinSvc;—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   

    Delphi Tips 
     
    How to control Windows services
    unit cwinsrvc;interface function ServiceGetStrCode(nID : integer) : string;function ServiceGetStatus(sMachine,
                              sService : string) : DWord;function ServiceRunning(sMachine,
                            sService : string) : boolean;function ServiceStopped(sMachine,
                            sService : string) : boolean;function ServiceStart(sMachine,
                          sService : string) : boolean;function ServiceStop(sMachine,
                         sService : string) : boolean;
    implementation uses Windows, SysUtils, WinSvc;// convert status codes returned by
    // ServiceGetStatus() to string values
     
    function ServiceGetStrCode(nID : integer) : string;
    var
      s : string;
    begin
      case nID of
       SERVICE_STOPPED          : s := 'STOPPED';
       SERVICE_RUNNING          : s := 'RUNNING';
       SERVICE_PAUSED           : s := 'PAUSED';
       SERVICE_START_PENDING    : s := 'START/PENDING';
       SERVICE_STOP_PENDING     : s := 'STOP/PENDING';
       SERVICE_CONTINUE_PENDING : s := 'CONTINUE/PENDING';
       SERVICE_PAUSE_PENDING    : s := 'PAUSE/PENDING';
      else
       s := 'UNKNOWN';  
      end;
      Result := s;
    end;
    // return status code if successful, -1 if not
    // return codes:
    //   SERVICE_STOPPED
    //   SERVICE_RUNNING
    //   SERVICE_PAUSED
     
    // following return codes are used to indicate that the // service is in the middle of getting to one
    // of the above states:
    //   SERVICE_START_PENDING
    //   SERVICE_STOP_PENDING
    //   SERVICE_CONTINUE_PENDING
    //   SERVICE_PAUSE_PENDING
     
    // sMachine:
    //   machine name, ie: \\SERVER
    //   empty = local machine
     
    // sService
    //   service name, ie: Alerter
     
    function ServiceGetStatus(sMachine,
                              sService : string) : DWord;
    var
     schm   : SC_Handle; //service control manager handle
     schs   : SC_Handle;      // service handle
     ss     : TServiceStatus; // service status
     dwStat : DWord;          // current service status
    begin
      dwStat := -1;
      // connect to the service control manager 
      schm := OpenSCManager( PChar(sMachine), Nil,
                             SC_MANAGER_CONNECT);
      // if successful...
      if(schm > 0)then
      begin
        // open a handle to the specified service
        // we want to query service status
        schs := OpenService( schm, PChar(sService),
                             SERVICE_QUERY_STATUS);
        // if successful...
        if(schs > 0)then
        begin
          // retrieve the current status 
          //of the specified service    
          if (QueryServiceStatus( schs, ss)) then
          begin
            dwStat := ss.dwCurrentState;
          end;
          // close service handle
          CloseServiceHandle(schs);
        end;
        // close service control manager handle
        CloseServiceHandle(schm);
      end;
      Result := dwStat;
    end;
    // Return TRUE if the specified service is running,
    // defined by the status code SERVICE_RUNNING. Return
    // FALSE if the service is in any other state,
    // including any pending states
     
    function ServiceRunning(sMachine,
                            sService : string) : boolean;
    begin
      Result := SERVICE_RUNNING =
                ServiceGetStatus(sMachine, sService);
    end;
    // Return TRUE if the specified service was stopped,
    // defined by the status code SERVICE_STOPPED.
     
    function ServiceStopped(sMachine,
                            sService : string) : boolean;
    begin
      Result := SERVICE_STOPPED =
                ServiceGetStatus(sMachine, sService);
    end;
    // Return TRUE if successful
    function ServiceStart(sMachine,
                          sService : string) : boolean;
    var
      schm,
      schs   : SC_Handle;
      ss     : TServiceStatus;
      psTemp : PChar;
      dwChkP : DWord; // check point
    begin
      ss.dwCurrentState := -1;
      // connect to the service control manager
      schm := OpenSCManager(PChar(sMachine), nil,
                            SC_MANAGER_CONNECT);
      // if successful...
      if(schm > 0)then
      begin
        // open a handle to the specified service
        // we want to start the service and query service
        // status
        schs := OpenService(schm, PChar(sService),
                SERVICE_START or SERVICE_QUERY_STATUS);
        // if successful...
        if(schs > 0)then
        begin
          psTemp := Nil;
          if(StartService( schs, 0,psTemp))then
          begin
            // check status
            if(QueryServiceStatus(schs, ss))then
            begin
              while(SERVICE_RUNNING <> ss.dwCurrentState)do
              begin
                // dwCheckPoint contains a value that the
                // service increments periodically to
                // report its progress during a
                // lengthy operation. Save current value
                dwChkP := ss.dwCheckPoint;
                // wait a bit before checking status again
                // dwWaitHint is the estimated amount of
                // time the calling program should wait
                // before calling QueryServiceStatus()
                // again. Idle events should be
                // handled here...
                Sleep(ss.dwWaitHint);
                if not QueryServiceStatus(schs, ss) then
                begin
                  // couldn't check status break from the
                  // loop
                  break;
                end;
      

  3.   

    if ss.dwCheckPoint < dwChkP then
                begin
                  // QueryServiceStatus didn't increment
                  // dwCheckPoint as it should have.
                  // Avoid an infinite loop by breaking
                  break;
                end;
              end;
            end;
          end;
          // close service handle
          CloseServiceHandle(schs);
        end;
        // close service control manager handle
        CloseServiceHandle(schm);
      end;
      // Return TRUE if the service status is running
      Result := SERVICE_RUNNING = ss.dwCurrentState;
    end;
    // Return TRUE if successful
    function ServiceStop(sMachine,
                         sService : string) : boolean;
    var
      schm,
      schs   : SC_Handle;
      ss     : TServiceStatus;
      dwChkP : DWord;
    begin
      // connect to the service control manager
      schm := OpenSCManager(PChar(sMachine), nil,
                            SC_MANAGER_CONNECT);
      // if successful...
      if schm > 0 then
      begin
        // open a handle to the specified service
        // we want to stop the service and
        // query service status
        schs := OpenService( schm, PChar(sService),
                SERVICE_STOP or SERVICE_QUERY_STATUS);
        // if successful...
        if schs > 0 then
        begin
          if ControlService(schs, SERVICE_CONTROL_STOP,
                            ss) then
          begin
            // check status
            if(QueryServiceStatus(schs, ss))then
            begin
              while(SERVICE_STOPPED <> ss.dwCurrentState)do
              begin
                // dwCheckPoint contains a value that the
                // service increments periodically to
                // report its progress during a lengthy
                // operation. Save current value
                dwChkP := ss.dwCheckPoint;
                // Wait a bit before checking status again.
                // dwWaitHint is the estimated amount of
                // time the calling program should wait
                // before calling QueryServiceStatus()
                // again. Idle events should be
                // handled here...
                Sleep(ss.dwWaitHint);            if(not QueryServiceStatus(schs,ss))then
                begin
                  // couldn't check status
                  // break from the loop
                  break;
                end;            if(ss.dwCheckPoint <
                  dwChkP)then
                begin
                  // QueryServiceStatus didn't increment
                  // dwCheckPoint as it should have.
                  // Avoid an infinite loop by breaking
                  break;
                end;
              end;
            end;
          end;      // close service handle
          CloseServiceHandle(schs);
        end;    // close service control manager handle
        CloseServiceHandle(schm);
      end;  // return TRUE if the service status is stopped
      Result := SERVICE_STOPPED = ss.dwCurrentState;
    end;end.
      

  4.   

    普通的方法都可以
    只要注意你必须有Debug权限就OK了,然后TerminateProcess就可以了SE_DEBUG_NAME               : PChar = 'SeDebugPrivilege';function SetDebugPrivilege(CanDebug: boolean): 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, SE_DEBUG_NAME, CanDebug);
      CloseHandle(hToken);
    end;