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
Était-ce utile?

La 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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top