TerminateProcess что-то у меня проблемы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

TerminateProcess что-то у меня проблемы

Сообщение Konst_One » 30.07.2007 (Пн) 17:52

Получаю инфу о своем запущеном сервисе с помощью WMI:


Код: Выделить всё
    'connect to WMI
    Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\CIMV2")
    Me.OUT "========="
    Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service WHERE Name = 'Mygate'", "WQL", _
            wbemFlagReturnImmediately + wbemFlagForwardOnly)
    For Each objService In colListOfServices
        Me.OUT objService.Name
       
        For Each prp In objService.Properties_
            'собственно PID моего процесса
            ProcessId = objService.ProcessId
            Me.OUT vbTab & prp.Name & "=" & CStr("" & prp.Value)
        Next prp
    Next


пытаюсь убить процесс запущенного сервиса:

Код: Выделить всё
Dim ExitCode As Long
Dim ret As Long
Dim hProcess As Long
'kill
If ProcessId > 0 Then
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessId)
    If hProcess > 0 Then
        CloseHandle hProcess
        ret = TerminateProcess(hProcess, ExitCode)
    End If
End If


в итоге ничего. ret=0, ExitCode=0
чтобы это значило? я где-то ошибаюсь, но никак не пойму где.

ЗЫ
все это делается для убийства зависшего сервиса (StopService недоступен/не отвечает)

PROCESS_ALL_ACCESS и PROCESS_TERMINATE пробовал, но тогда не возвращает hProcess

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2007 (Пн) 19:24

Konst_One писал(а):If ProcessId > 0

Мож таки "<>"?

Konst_One писал(а):PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ

Мож таки PROCESS_TERMINATE?

Konst_One писал(а):PROCESS_TERMINATE пробовал, но тогда не возвращает hProcess

А посмотри после OpenProcess, чему равно err.lastdllerror. Оно равно 5. Да?

Konst_One писал(а):
Код: Выделить всё
  If hProcess > 0 Then
        CloseHandle hProcess
        ret = TerminateProcess(hProcess, ExitCode)
    End If

А это пять! Использование хэндла после специального его закрытия это пять, да.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.07.2007 (Пн) 19:48

да, с последней строкой, я копи-паст делал и промахнулся, конечно она в конце :D

и lastdllerror после OpenProcess с ключем PROCESS_TERMINATE как раз 5

я так понимаю, что привилегий не хватает?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2007 (Пн) 19:53

Ага.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.07.2007 (Пн) 19:56

так, теперь вот как их добавить. это что-то из области AdjustTokenPrivileges ?

что-то у меня два раза запостилось.
вот нашел в апигайде кое-что, но пока не понял что нужно в моем случае:

Код: Выделить всё
    Dim hProc As Long
    Dim hToken As Long
    Dim mLUID As LUID
    Dim mPriv As TOKEN_PRIVILEGES
    Dim mNewPriv As TOKEN_PRIVILEGES
    hProc = GetCurrentProcess()
    OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
    mPriv.PrivilegeCount = 1
    mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    mPriv.Privileges(0).pLuid = mLUID
    ' enable shutdown privilege for the current application
    AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)


т.е. мне надо текущему процессу добавить привилегий на терминейт другого процесса. что за
Код: Выделить всё
4 + (12 * mPriv.PrivilegeCount)
не понятно.

и вот здесь: "SeShutdownPrivilege" что за привилегия должна быть?
похоже ,что тут надо выставлять SeDebugName
Последний раз редактировалось Konst_One 30.07.2007 (Пн) 20:06, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2007 (Пн) 20:04

Вопрос.
Ты админ?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.07.2007 (Пн) 20:06

да

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.07.2007 (Пн) 21:21

Привилегии не при чём.
Нужно право завершения на конкретный процесс.
SetSecurityInfo
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.07.2007 (Вт) 6:45

спс, буду смотреть в эту сторону. а то уже всю голову сломал 8)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.07.2007 (Вт) 10:11

Вот , что получилось:

Код: Выделить всё
Option Explicit

Private Const SYNCHRONIZE As Long = &H100000
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
Private Const PROCESS_TERMINATE As Long = (&H1)

Private Const WRITE_DAC As Long = &H40000
Private Const SID_REVISION As Long = 1
Private Const NO_INHERITANCE As Long = 0
Private Const DACL_SECURITY_INFORMATION As Long = &H4&

Private Enum SE_OBJECT_TYPE
       SE_UNKNOWN_OBJECT_TYPE = 0
       SE_FILE_OBJECT = 1
       SE_SERVICE = 2
       SE_PRINTER = 3
       SE_REGISTRY_KEY = 4
       SE_LMSHARE = 5
       SE_KERNEL_OBJECT = 6
       SE_WINDOW_OBJECT = 7
       SE_DS_OBJECT = 8
       SE_DS_OBJECT_ALL = 9
       SE_PROVIDER_DEFINED_OBJECT = 10
       SE_WMIGUID_OBJECT = 11
End Enum

Private Enum ACCESS_MODE
    NOT_USED_ACCESS = 0
    GRANT_ACCESS = 1
    SET_ACCESS = 2
    DENY_ACCESS = 3
    REVOKE_ACCESS = 4
    SET_AUDIT_SUCCESS = 5
    SET_AUDIT_FAILURE = 6
End Enum

Private Enum TRUSTEE_FORM
    TRUSTEE_IS_SID
    TRUSTEE_IS_NAME
End Enum

Private Enum TRUSTEE_TYPE
    TRUSTEE_IS_UNKNOWN
    TRUSTEE_IS_USER
    TRUSTEE_IS_GROUP
End Enum

Private Enum MULTIPLE_TRUSTEE_OPERATION
    NO_MULTIPLE_TRUSTEE
    TRUSTEE_IS_IMPERSONATE
End Enum

Private Type SID
   Revision As Byte
   SubAuthorityCount As Byte
   IdentifierAuthority(5) As Byte
   SubAuthority As Long
End Type

Private Type TRUSTEE
    pMultipleTrustee As Long
    MultipleTrusteeOperation As MULTIPLE_TRUSTEE_OPERATION
    TrusteeForm As TRUSTEE_FORM
    TrusteeType As TRUSTEE_TYPE
    ptstrName As Long
End Type

Private Type EXPLICIT_ACCESS
    grfAccessPermissions As Long
    grfAccessMode As Long
    grfInheritance As Long
    myTrustee As TRUSTEE
End Type

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetLastError Lib "kernel32.dll" () As Long
Private Declare Function SetEntriesInAcl Lib "ADVAPI32.dll" Alias "SetEntriesInAclW" (ByVal cCountOfExplicitEntries As Long, ByRef pListOfExplicitEntries As EXPLICIT_ACCESS, ByVal OldAcl As Long, ByRef NewAcl As Long) As Long
Private Declare Function SetSecurityInfo Lib "ADVAPI32.dll" (ByVal handle As Long, ByVal ObjectType As Long, ByVal SecurityInfo As Long, ByVal psidOwner As Long, ByVal psidGroup As Long, ByVal pDacl As Long, ByVal pSacl As Long) As Long
Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal handle As Long) As Long
'

Public Function SetPermissions(ByVal PID As Long) As Long
Dim dwErr As Long
Dim hpWriteDAC As Long
Dim pDacl As Long

     If PID = 0 Then
        hpWriteDAC = -1
     Else
        hpWriteDAC = OpenProcess(WRITE_DAC, 0, PID)
     End If
     dwErr = GetLastError()

     Dim world As SID
     With world
        .Revision = SID_REVISION
        .SubAuthorityCount = 1
        'SECURITY_WORLD_SID_AUTHORITY
        .IdentifierAuthority(5) = 1
        .SubAuthority = 0
     End With

     Dim ea As EXPLICIT_ACCESS
     'ставим права на возможностт удаления процесса
     With ea
         .grfAccessPermissions = PROCESS_TERMINATE Or WRITE_DAC 'PROCESS_ALL_ACCESS
         .grfAccessMode = GRANT_ACCESS ' DENY_ACCESS
         .grfInheritance = NO_INHERITANCE
         With .myTrustee
             .pMultipleTrustee = 0
             .MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE
             .TrusteeForm = TRUSTEE_IS_SID
             .TrusteeType = TRUSTEE_IS_USER
             .ptstrName = VarPtr(world.Revision)
         End With
     End With
     dwErr = SetEntriesInAcl(1, ea, 0, pDacl)
     dwErr = SetSecurityInfo(hpWriteDAC, SE_KERNEL_OBJECT, _
                            DACL_SECURITY_INFORMATION, _
                            0, 0, pDacl, 0)

     LocalFree (pDacl)
     SetPermissions = dwErr
     
End Function

Public Function KillProcess(ByVal PID As Long) As Long
Dim ExitCode As Long
Dim ret As Long
Dim hProcess As Long

    ret = SetPermissions(PID)
    If ret <> 0 Then
        GoTo lb_out
    End If
    hProcess = OpenProcess(PROCESS_TERMINATE, 0&, PID)
    ret = Err.LastDllError
    If hProcess <> 0 Then
        ret = TerminateProcess(hProcess, ExitCode)
        CloseHandle hProcess
    End If
lb_out:
    KillProcess = ret
   
End Function


Работает.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.07.2007 (Вт) 10:40

Хэндл hpWriteDAC не закрыт.
AllocateAndInitializeSid и AddAccessAllowedAce зачем-то вручную реализованы.
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.07.2007 (Вт) 11:25

хэндл точно не закрыт, подправлю, спс
на счет ручной реализации немного не понял, а как можно по-другому сделать?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 87

    TopList