Класс swbemobjectex: призрачные / скрытые методы (например, .Terminate) - PullRequest
1 голос
/ 22 февраля 2020
Dim objList As WbemScripting.SWbemObjectSet
Set objList = GetObject("winmgmts:").ExecQuery("select * from win32_process where name='iexplore.exe'")

Этот код возвращает коллекцию SWbemObjectEx объектов
, относящихся ко всем запущенным процессам "iexplore.exe" (как видно в диспетчере задач).

Я прочитал в Интернете я могу запустить метод .Terminate этих объектов, чтобы убить их.
Однако ни в окне Locals в режиме останова, ни в обозревателе объектов для класса "SWbemObjectEx", ни в официальном сделайте c в https://docs.microsoft.com/it-ch/windows/win32/wmisdk/swbemobjectex, покажите этот метод .Terminate .

И что меня удивляет, так это то, что это работает, хотя и не для всех объектов ...

Почему? и как я мог увидеть все эти скрытые (?) методы для этого класса?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

попробуйте этот код:

Option Explicit

Sub funTaskTerminate()

   Dim objTask                As Object
   Dim objProcesses           As Object
   Dim objProcess             As Object

   ' Set the object for Task Manager
   Set objTask = GetObject("winmgmts:")

   ' Set the object for all the processes in query
   Set objProcesses = objTask.ExecQuery("select * from win32_process where name='iexplore.exe'")


   ' Loop for all processes in query
   For Each objProcess In objProcesses

      ' In my test, there were 3 processes, but the first Terminate () killed all the others, therefore,
      ' in the second Terminate () the process no longer existed,
      ' which caused an error, so the use of "Resume Next".
      '------------------------------------------
      On Error Resume Next
      Call objProcess.Terminate              ' Terminate the process
      On Error GoTo 0

   Next

   Set objTask = Nothing
   Set objProcesses = Nothing
   Set objproces = Nothing

End Sub
0 голосов
/ 22 февраля 2020

Метод .Terminate является частью класса Win32_Process . Установите точку останова на Call objProcess.Terminate и добавьте часы на objProcess. Это покажет вам коллекцию .Methods_, где второй элемент - .Terminate.

Также обратите внимание на коллекцию .Properties_, чтобы получить информацию об этом процессе (например, дескриптор).

Этот суб печатает коллекции в ближайшее окно, просто вызовите его внутри l oop до objProcesses, например,

...
For Each objProcess In objProcesses
     PrintPropertiesAndMethods objProcess
...
Private Sub PrintPropertiesAndMethods(Process As WbemScripting.SWbemObjectEx)
    With Process
        Debug.Print vbCrLf & "Properties_ collection:"
        Dim Prop As WbemScripting.SWbemProperty
        For Each Prop In .Properties_
            With Prop
                Debug.Print .Name & " " & .Value
            End With
        Next
        Debug.Print vbCrLf & "Methods_ collection:"
        Dim Method As WbemScripting.SWbemMethod
        For Each Method In .Methods_
            With Prop
                Debug.Print Method.Name
            End With
        Next
    End With
End Sub

Вы должны быть осторожны, когда завершите iexploror.exe, так как он имеет главный процесс (x64 - C: \ Program Files \ Inte rnet Explorer), который создает дочерний процесс (x86 - C: \ Program Files (x86) \ Inte rnet Explorer) для каждой вкладки (установите флажок диспетчер задач). Если вы прервете основной процесс, все дочерние элементы также прекратят работу. Чтобы получить второй основной процесс для тестирования, используйте Run as Admin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...