【问题标题】:Vb.net get username that is running processvb.net 获取正在运行的进程的用户名
【发布时间】:2014-04-24 20:53:29
【问题描述】:

我正在制作一个程序来查找进程并查看哪个用户正在使用它们。我有扫描代码,但没有用户名代码。用户名必须是字符串。例如:我有 2 个人运行一些进程,这些进程将显示在列表视图中。第一列用于进程,第二列用于用户名。我希望它是这样的:

(此处为进程)(此处为用户名)

(此处为进程)(此处为用户名)....

您明白我的意思,并且有比计算机上运行的进程多得多的进程。问题是:如何获取使用该流程的人的用户名?

编辑:代码。这是我的代码。

For Each pr As Process In Process.GetProcesses
Dim lvi As ListViewItem = ListView1.Items.Add(CStr(pr.ProcessName))
'Now I need something to put for the username
Next

这是另一个最常见的。

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

【问题讨论】:

    标签: vb.net process


    【解决方案1】:

    此代码取自here,如果需要,您可以在其中找到更多信息。基本上,在控制台应用程序上,这会将进程名称和用户打印到屏幕上:

    Public Shared Sub Main()
        Dim selectQuery As SelectQuery = New SelectQuery("Win32_Process")
        Dim searcher As ManagementObjectSearcher = New
        ManagementObjectSearcher(selectQuery)
        For Each proc As ManagementObject In searcher.Get
            Console.WriteLine(proc("Name").ToString)
            Dim s(1) As String
            proc.InvokeMethod("GetOwner", CType(s, Object()))
            Console.WriteLine(("User: " & (s(1) + ("\\" + s(0)))))
        Next
        Console.ReadLine()
    End Sub
    

    这可以实现为一个函数,例如:

    Public Function GetUserName(ByVal ProcessName As String)
        Dim selectQuery As SelectQuery = New SelectQuery("Win32_Process")
        Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher(selectQuery)
        Dim y As System.Management.ManagementObjectCollection
        y = searcher.Get
        For Each proc As ManagementObject In y
            Dim s(1) As String
            proc.InvokeMethod("GetOwner", CType(s, Object()))
            Dim n As String = proc("Name").ToString()
            If n = ProcessName & ".exe" Then
                Return ("User: " & s(1) & "\\" & s(0))
            End If
        Next
    End Function
    

    仅供参考,proc.InvokeMethod("GetOwner", CType(s, Object())) 会返回这样的数组:

    • 索引0:所有者/用户名
    • 索引1:域

    在我们的例子中,会将其存储在s(1)

    希望这会有所帮助:)

    注意事项:

    如果函数返回类似User: \\ 的内容,那么该进程可能是一个特殊的 Windows 进程。要查看哪些进程会像这样(对于 Windows 用户):

    1. 右键单击任务栏
    2. 选择启动任务管理器
    3. 进程选项卡的用户名列中,某些进程将有一个空白单元格而不是用户名。


    编辑:

    VB.NET 函数已经过编辑,现在应该可以工作了,虽然我不知道为什么控制台程序仍然可以工作。无论如何我都不管它,如果它仍然有效,为什么要改变它?

    【讨论】:

    • 控制台可以以某种方式将进程的用户放在控制台上,但功能不能。我已经尝试过了,但我一直一无所获。获得字符串形式的唯一进程是系统进程。我也给出了进程名称。如果我删除 "If proc("Name").ToString()" 和 if 的其余部分,我会得到类似:"User : \\" 这就是大多数。 “lvi.SubItems.Add(GetUserName(pr.ProcessName.ToString))”代码错了吗?
    • 好的,我刚刚看到你的评论,但我已经解决了。经过十分钟的硬调试,我可以看到问题是当pr.ProcessName.ToString 传递给函数时,它传递了进程名称没有“.exe”结束。出于某种原因,proc.InvokeMethod("GetOwner", CType(s, Object())) 确实 需要这个,所以我的新代码添加了这个。请看我之前的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多