Процесс убийства пользователем


Я использую приложение, которое убивает процесс iexplore (Internet Explorer) на сервере терминалов. Проблема, с которой я сталкиваюсь, заключается в том, что я убиваю все процессы Internet Explorer на сервере терминалов, а не только одного текущего пользователя.

Поэтому, если я войду в систему как пользователь 1 и убью IE, он будет убит для пользователя 2, пользователя 3 и так далее ... Я только хочу, чтобы Internet Explorer User1 был убит. Я использую следующий код, чтобы убить мой процесс:

Private Sub ClearProcesses(ByVal ProcessName As String)
    Dim myProcesses = Process.GetProcessesByName(ProcessName)
    For Each Proc As Process In myProcesses
        Try
            Proc.Kill()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "ClearProcess")
        End Try
    Next
End Sub

Есть ли способ только убить процесс для пользователя 1?

1 2

1 ответ:

С помощью WMI можно получить владельца процесса и убедиться, что он принадлежит текущему пользователю.

Используя такую функцию:

Public Function GetProcessOwner(processId As Integer) As String
    Dim query As String = "Select * From Win32_Process Where ProcessID = " + processId
    Dim searcher As New ManagementObjectSearcher(query)
    Dim processList As ManagementObjectCollection = searcher.[Get]()

    For Each obj As ManagementObject In processList
        Dim argList As String() = New String() {String.Empty, String.Empty}
        Dim returnVal As Integer = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList))
        If returnVal = 0 Then
            ' argList(0) == User
            ' argList(1) == DOMAIN
            Return argList(0)
        End If
    Next

    Return "NO OWNER"
End Function

Вы должны уметь делать что-то вроде:

Private Sub ClearProcesses(ByVal ProcessName As String)
    Dim myProcesses = Process.GetProcessesByName(ProcessName).Where(Function(p) GetProcessOwner(p.Id) = currentUser)

    ' Your current code...