2013-06-04 4 views
2

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

Так что, если я зарегистрируюсь как User1 и убиваю IE, он будет убит для User2, User3 и т. Д. Мне нужно только убить 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 

Есть ли способ только убить процесс для User1?

ответ

3

Вы можете использовать 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... 
+0

Спасибо за ответ. Является ли ManagementObject ссылкой .NET или COM? Я пытаюсь найти его – Alex

+0

@Alex .NET - System.Management.dll: http://msdn.microsoft.com/en-us/library/system.management.managementobject.aspx –

+0

Спасибо, что я сейчас ссылаюсь. Я получаю сообщение об ошибке: «Ошибка перегрузки не удалась, потому что невозможно получить доступ к« Где »с этими аргументами». Я использовал следующую строку кода: 'Dim myProcesses = Process.GetProcessesByName (ProcessName) .Where (Sub (p) GetProcessOwner (p.Id) = System.Environment.UserName)' – Alex

Смежные вопросы