我要通过程序关闭一服务级的进程,如PCANYWHERE,我试着用了TerminateProcess对其他进程有用,但是此服务级的进程关不掉!!!pcanywhere进程名为:awhost32.exe 请高手指教!!!!环境:2000/xp

解决方案 »

  1.   

    想办法进入Ring0,然后调用TerminateProcess试试,参考:
    http://vip.6to23.com/nowcan1/tech/win2kIO.htm
      

  2.   

    使用CloseServiceHandle停止服务吧
      

  3.   

    //使用CloseServiceHandle停止服务吧CloseServiceHandle的作用是关闭服务,想要关闭服务必须先停止服务,用ControlService可以停止服务(第2个参数传入,SERVICE _CONTROL_STOP),不过楼主现在知道的是进程名,而不是服务名,所以我估计这个方法很难奏效,下面是一个模块,你参考一下:Public Const MachineName = "s1" 
    Public Const ServiceName = "Schedule" 
    Public Const SERVICES_ACTIVE_DATABASE = "ServicesActive" 
    ' Controls 
    Public Const SERVICE_CONTROL_STOP = &H1 
    Public Const SERVICE_CONTROL_PAUSE = &H2 ' Service State -- for CurrentState 
    Public Const SERVICE_STOPPED = &H1 
    Public Const SERVICE_START_PENDING = &H2 
    Public Const SERVICE_STOP_PENDING = &H3 
    Public Const SERVICE_RUNNING = &H4 
    Public Const SERVICE_CONTINUE_PENDING = &H5 
    Public Const SERVICE_PAUSE_PENDING = &H6 
    Public Const SERVICE_PAUSED = &H7 ' Service Control Manager object specific access types 
    Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 
    Public Const SC_MANAGER_CONNECT = &H1 
    Public Const SC_MANAGER_CREATE_SERVICE = &H2 
    Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4 
    Public Const SC_MANAGER_LOCK = &H8 
    Public Const SC_MANAGER_QUERY_LOCK_STATUS = &H10 
    Public Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20 Public Const SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SC_MANAGER_CONNECT Or SC_MANAGER_CREATE_SERVICE Or SC_MANAGER_ENUMERATE_SERVICE Or SC_MANAGER_LOCK Or SC_MANAGER_QUERY_LOCK_STATUS Or SC_MANAGER_MODIFY_BOOT_CONFIG) 
    'Service object specific access types 
    Public Const SERVICE_QUERY_CONFIG = &H1 
    Public Const SERVICE_CHANGE_CONFIG = &H2 
    Public Const SERVICE_QUERY_STATUS = &H4 
    Public Const SERVICE_ENUMERATE_DEPENDENTS = &H8 
    Public Const SERVICE_START = &H10 
    Public Const SERVICE_STOP = &H20 
    Public Const SERVICE_PAUSE_CONTINUE = &H40 
    Public Const SERVICE_INTERROGATE = &H80 
    Public Const SERVICE_USER_DEFINED_CONTROL = &H100 Public Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SERVICE_QUERY_CONFIG Or SERVICE_CHANGE_CONFIG Or SERVICE_QUERY_STATUS Or SERVICE_ENUMERATE_DEPENDENTS Or SERVICE_START Or SERVICE_STOP Or SERVICE_PAUSE_CONTINUE Or SERVICE_INTERROGATE Or SERVICE_USER_DEFINED_CONTROL) Type SERVICE_STATUS 
            dwServiceType As Long 
            dwCurrentState As Long 
            dwControlsAccepted As Long 
            dwWin32ExitCode As Long 
            dwServiceSpecificExitCode As Long 
            dwCheckPoint As Long 
            dwWaitHint As Long 
    End Type Declare Function CloseServiceHandle Lib "advapi32.dll" (ByVal hSCObject As Long) As Long 
    Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long 
    Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long 
    Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long 
    Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, lpServiceStatus As SERVICE_STATUS) As Long 
    Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As Long Public Sub ServiceStatus(Computer As String, Service As String) 
        Dim ServiceStatus As SERVICE_STATUS 
        Dim lhSCManager As Long 
        Dim lhService As Long 
        Dim lhServiceStatus As Long     lhSCManager = OpenSCManager(Computer, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS) 
              
        If lhSCManager <> 0 Then 
                 
            lhService = OpenService(lhSCManager, Service, SERVICE_ALL_ACCESS) 
              
            If lhService <> 0 Then 
                     
                lhServiceStatus = QueryServiceStatus(lhService, ServiceStatus) 
                      
                If lhServiceStatus <> 0 Then 
                    Select Case ServiceStatus.dwCurrentState 
                        Case SERVICE_STOPPED 
                            MsgBox "Stopped" 
                        Case SERVICE_START_PENDING 
                            MsgBox " Start Pending" 
                        Case SERVICE_STOP_PENDING 
                            MsgBox "Stop Pending" 
                        Case SERVICE_RUNNING 
                            MsgBox "Running" 
                        Case SERVICE_CONTINUE_PENDING 
                            MsgBox "Coninue Pending" 
                        Case SERVICE_PAUSE_PENDING 
                            MsgBox "Pause Pending" 
                        Case SERVICE_PAUSED 
                            MsgBox "Paused" 
                    End Select 
                End If 
                CloseServiceHandle lhService 
            End If 
            CloseServiceHandle lhSCManager 
        End If End Sub 
    Public Sub vbPauseService(Computer As String, Service As String) 
        Dim ServiceStatus As SERVICE_STATUS 
        Dim lhSCManager As Long 
        Dim lhService As Long 
        Dim lresult As Long 
          
        lhSCManager = OpenSCManager(Computer, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS) 
        If lhSCManager <> 0 Then 
            lhService = OpenService(lhSCManager, Service, SERVICE_ALL_ACCESS) 
              
            If lhService <> 0 Then 
                lresult = ControlService(lhService, SERVICE_CONTROL_PAUSE, ServiceStatus) 
                CloseServiceHandle lhService 
            End If 
            CloseServiceHandle lhSCManager 
        End If 
              
    End Sub 
    Public Sub vbStartService(Computer As String, Service As String) 
        Dim ServiceStatus As SERVICE_STATUS 
        Dim lhSCManager As Long 
        Dim lhService As Long 
        Dim lresult As Long 
          
        lhSCManager = OpenSCManager(Computer, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS) 
          
        If lhSCManager <> 0 Then 
            lhService = OpenService(lhSCManager, Service, SERVICE_ALL_ACCESS) 
              
            If lhService <> 0 Then 
                lresult = StartService(lhService, 0, 0) 
                CloseServiceHandle lhService 
            End If 
            CloseServiceHandle lhSCManager 
        End If 
              
    End Sub 
    Public Sub vbStopService(Computer As String, Service As String) 
        Dim ServiceStatus As SERVICE_STATUS 
        Dim lhSCManager As Long 
        Dim lhService As Long 
        Dim lresult As Long 
          
        lhSCManager = OpenSCManager(Computer, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS) 
          
        If lhSCManager <> 0 Then 
            lhService = OpenService(lhSCManager, Service, SERVICE_ALL_ACCESS) 
              
            If lhService <> 0 Then 
                lresult = ControlService(lhService, SERVICE_CONTROL_STOP, ServiceStatus) 
                CloseServiceHandle lhService 
            End If 
            CloseServiceHandle lhSCManager 
        End If 
    End Sub
      

  4.   

    上面的看不太懂哦,如果使用closeservicehandle 关闭已知服务名称 pcAnywhere Host Service 那需要怎么做?
      

  5.   

    关闭服务
    http://blog.csdn.net/online/archive/2004/08/09/68870.aspx
      

  6.   

    //上面的看不太懂哦,如果使用closeservicehandle 关闭已知服务名称 pcAnywhere Host Service 那需要怎么做?呵呵,把
    Public Const ServiceName = "Schedule" 
    这一句做相应修改
      

  7.   

    2000只要有debug权限就可以关闭除idle process以外的进程了,不知道对pcanywhere行不行。
    xp下自己试试。