Question

I'm making a program that looks for processes and can see which user is using them. I've got the scanning code, but not the username code. The username has to be a string. For example: I have 2 people running some processes and the processes will show in the listview. The first column is for processes and the second is for the username. I want it to be like:

(process here) (username here)

(process here) (username here)....

You get the point I think and there's much more processes than that running on the computer. The question is: How do you get the username for someone using the process?

Edit: The code. This is my code.

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

This is the other one that is most common.

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
Was it helpful?

Solution

This code is taken from here, where you can find more information if you need it. Basically, on a console app this will print the process name and the user to the screen:

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

This could be implemented as a function, like:

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

Just for reference, proc.InvokeMethod("GetOwner", CType(s, Object())) will return an array like this:

  • Index 0: Owner/user name
  • Index 1: Domain

And in our case, will store it in s(1).

Hope this helps :)

Notes:

If the function returns something like User: \\ then the process is probably a special windows process. To see which processes will act like this (for windows users):

  1. Right click on the task bar
  2. Select Start Task Manager
  3. In the Processes tab, in the User Name column, some processes will have a blank cell instead of a user name.


Edit:

The VB.NET function has been edited and should now work, although I have no idea why the console program still worked. At any rate I've left it alone, if it still works why change it?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top