我编写了个进程管理程序,但在XP下无法结束进程。设计了3个按钮和一个listview ,具体代码如下
Option Explicit
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongConst MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
   dwSize As Long
   cntUsage As Long
   th32ProcessID As Long
   th32DefaultHeapID As Long
   th32ModuleID As Long
   cntThreads As Long
   th32ParentProcessID As Long
   pcPriClassBase As Long
   dwFlags As Long
   szExeFile As String * MAX_PATH
End Type'进程参数
Const TH32CS_SNAPheaplist = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPthread = &H4
Const TH32CS_SNAPmodule = &H8
Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule'系统提权参数
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal processhandle As Long, ByVal DesiredAccess As Long, tokenhandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal tokenhandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As LongPrivate Type LUID
    UserdPart As Long
    IgnoredForNowHigh32BitPart As Long
End TypePrivate Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    TheLuid As LUID
    Attributes As Long
End TypePrivate Sub Command1_Click()
Call AdjustTokenPrivilegesxp
Dim IDhandle, TMback As Long
If ListView1.SelectedItem.Text <> "" Then
   IDhandle = OpenProcess(1&, True, Val("&H" & ListView1.SelectedItem.Text))
   TMback = TerminateProcess(IDhandle, 0&)
   If TMback <> 0 Then
    MsgBox ListView1.SelectedItem.Text & "进程已结束"
   Else
    MsgBox ListView1.SelectedItem.Text & "不能被终止"
   End If
CloseHandle IDhandle
Command2_Click
End If
End SubPrivate Sub Command2_Click()
Dim i As Long
Dim ID As Long
Dim pro As PROCESSENTRY32
Dim hsonp As LongListView1.ListItems.Clear
hsonp = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
pro.dwSize = Len(pro)
ID = ProcessFirst(hsonp, pro)
i = 0
Do While ID <> 0
    ListView1.ListItems.Add , "first" & i, pro.szExeFile
    ListView1.ListItems("first" & i).SubItems(1) = pro.th32ParentProcessID
    i = i + 1
    ID = ProcessNext(hsonp, pro)
Loop
CloseHandle hsonp
End SubPrivate Sub Command3_Click()
End
End SubPrivate Sub Form_Load()
Call AdjustTokenPrivilegesxp
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , "first", "进程名称", 4000
ListView1.ColumnHeaders.Add , "second", "进程ID", 1550
ListView1.View = lvwReport
Command2_Click
End SubPublic Sub AdjustTokenPrivilegesxp()
    Const TOKEN_ADJUST_PRIVILEGES = &H20
    Const TOKEN_QUERY = &H8
    Const SE_PRIVILEGE_ENABLED = &H2    Dim processhandle As Long
    Dim tokenhandle As Long
    Dim tmpLUID As LUID
    Dim tmpTOKEN As TOKEN_PRIVILEGES
    Dim tmp As TOKEN_PRIVILEGES
    Dim buffer As Long
    
    processhandle = GetCurrentProcess()
    OpenProcessToken processhandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), tokenhandle
    LookupPrivilegeValue "windows xp", "SeDebugPrivilege", tmpLUID
    
    tmpTOKEN.Attributes = SE_PRIVILEGE_ENABLED
    tmpTOKEN.TheLuid = tmpLUID
    tmpTOKEN.PrivilegeCount = 1
    
    AdjustTokenPrivileges tokenhandle, False, tmpTOKEN, Len(tmp), tmp, bufferEnd Sub

解决方案 »

  1.   

    IDhandle = OpenProcess(PROCESS_ALL_ACCESS, True, Val("&H" & ListView1.SelectedItem.Text))
    权限问题
      

  2.   

    看漏了,OpenProcess第三个参数是进程的PID,并不是进程名字
      

  3.   

    正确的为
    IDhandle = OpenProcess(PROCESS_ALL_ACCESS, True, ListView1.SelectedItem.SubItems(1))XP sp3 测试通过
      

  4.   

    还是不行,显示 进程不能被终止, 如: explorer.exe不能被终止
      

  5.   

    shell("pskill.exe explorer",vbHide)
    pskill.exe请从这里下载:
    http://technet.microsoft.com/en-us/sysinternals/bb545027.aspx
      

  6.   

    我修改了下,程序可以显示 XX进程已结束。
    但我在listview中还是能看到那个进程,并且我在点结束进程也不能再结束他,显示进程不能终止。
    现在的代码:
    Option Explicit
    Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
    Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongConst MAX_PATH As Integer = 260
    Private Type PROCESSENTRY32
       dwSize As Long
       cntUsage As Long
       th32ProcessID As Long
       th32DefaultHeapID As Long
       th32ModuleID As Long
       cntThreads As Long
       th32ParentProcessID As Long
       pcPriClassBase As Long
       dwFlags As Long
       szExeFile As String * MAX_PATH
    End Type'进程参数
    Const TH32CS_SNAPheaplist = &H1
    Const TH32CS_SNAPPROCESS = &H2
    Const TH32CS_SNAPthread = &H4
    Const TH32CS_SNAPmodule = &H8
    Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule'系统提权参数
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function OpenProcessToken Lib "advapi32" (ByVal processhandle As Long, ByVal DesiredAccess As Long, tokenhandle As Long) As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal tokenhandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As LongPrivate Type LUID
        UserdPart As Long
        IgnoredForNowHigh32BitPart As Long
    End TypePrivate Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        TheLuid As LUID
        Attributes As Long
    End TypePrivate Sub Command1_Click(Index As Integer)Dim IDhandle, TMback As Long
    If ListView1.SelectedItem.Text <> "" Then
       IDhandle = OpenProcess(1&, True, ListView1.SelectedItem.SubItems(1))
       TMback = TerminateProcess(IDhandle, 0&)
       If TMback <> 0 Then
        MsgBox ListView1.SelectedItem.Text & "进程已结束"
       Else
        MsgBox ListView1.SelectedItem.Text & "不能被终止"
       End If
    CloseHandle IDhandle
    End If
    End SubPrivate Sub Command2_Click(Index As Integer)Dim i As Long
    Dim ID As Long
    Dim pro As PROCESSENTRY32
    Dim hsonp As LongListView1.ListItems.Clear
    hsonp = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
    pro.dwSize = Len(pro)
    ID = ProcessFirst(hsonp, pro)
    i = 0
    Do While ID <> 0
        ListView1.ListItems.Add , "first" & i, pro.szExeFile
        ListView1.ListItems("first" & i).SubItems(1) = pro.th32ParentProcessID
        i = i + 1
        ID = ProcessNext(hsonp, pro)
    Loop
    CloseHandle hsonp
    End SubPrivate Sub Command3_Click(Index As Integer)
    End
    End SubPrivate Sub Form_Load()Call AdjustTokenPrivilegesxpListView1.ColumnHeaders.Clear
    ListView1.ColumnHeaders.Add , "first", "进程名称", 4000
    ListView1.ColumnHeaders.Add , "second", "进程ID", 1550
    ListView1.View = lvwReport
    Command2_Click (1)
    End Sub
    Public Sub AdjustTokenPrivilegesxp()Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Const TOKEN_ASSIGN_PRIMARY = &H1
    Const TOKEN_DUPLICATE = (&H2)
    Const TOKEN_IMPERSONATE = (&H4)
    Const TOKEN_QUERY = (&H8)
    Const TOKEN_QUERY_SOURCE = (&H10)
    Const TOKEN_ADJUST_PRIVILEGES = (&H20)
    Const TOKEN_ADJUST_GROUPS = (&H40)
    Const TOKEN_ADJUST_DEFAULT = (&H80)
    Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or _
                             TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or TOKEN_QUERY_SOURCE Or _
                             TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
    Const SE_PRIVILEGE_ENABLED = &H2    Dim processhandle As Long
        Dim tokenhandle As Long
        Dim tmpLUID As LUID
        Dim tmpTOKEN As TOKEN_PRIVILEGES
        Dim tmp As TOKEN_PRIVILEGES
        Dim buffer As Long
        
        processhandle = GetCurrentProcess()
        OpenProcessToken processhandle, TOKEN_ALL_ACCESS, tokenhandle
        LookupPrivilegeValue "", "SeDebugPrivilege", tmpLUID
        
        tmpTOKEN.Attributes = SE_PRIVILEGE_ENABLED
        tmpTOKEN.TheLuid = tmpLUID
        tmpTOKEN.PrivilegeCount = 1
        
        AdjustTokenPrivileges tokenhandle, False, tmpTOKEN, Len(tmp), tmp, bufferEnd Sub还可以怎么改