【问题标题】:How to kill Process by User?如何按用户杀死进程?
【发布时间】:2013-06-04 16:49:53
【问题描述】:

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

所以如果我以User1 登录并杀死IE,它将被杀死User2User3 等等……我只想杀死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的进程?

【问题讨论】:

    标签: vb.net process kill


    【解决方案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...
    

    【讨论】:

    • 感谢您的回复。 ManagementObject 是 .NET 还是 COM 引用?我正在寻找它
    • @Alex .NET - System.Management.dll: msdn.microsoft.com/en-us/library/…
    • 谢谢我现在引用它。我收到一个错误:Overload resolution failed because no accessible 'Where' can be called with these arguements。我使用了以下代码行:Dim myProcesses = Process.GetProcessesByName(ProcessName).Where(Sub(p) GetProcessOwner(p.Id) = System.Environment.UserName)
    • 优秀。它有效,谢谢! GetProcessOwner 函数中还有另一个错字。在声明查询时,我的程序崩溃了,因为我必须添加...Where ProcessID = " + processId.ToString
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2011-02-25
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2019-01-07
    相关资源
    最近更新 更多