2013-06-04 47 views
2

我正在使用终端服务器上杀死进程iexplore(Internet Explorer)的应用程序。我遇到的问题是我杀死了终端服务器上的所有Internet Explorer进程,而不仅仅是当前用户。用户终止进程

因此,如果我以User1身份登录并终止IE,它将被终止User2,User3等...我只希望User1的Internet Explorer被终止。我使用下面的代码来杀死我的进程:

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

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

+0

谢谢我现在引用它。我收到一个错误:'重载解析失败,因为没有可访问的'Where'可以用这些争论调用。我使用了以下代码行: 'Dim myProcesses = Process.GetProcessesByName(ProcessName).Where(Sub(p)GetProcessOwner(p.Id)= System.Environment.UserName)' – Alex