[VB.NET] Gebruikersnaam uit proces halen

Pagina: 1
Acties:

  • BlueAce
  • Registratie: November 2002
  • Laatst online: 09-01-2021
Ik ben net met VB.NET begonnen, dus wees geduldig met me ;) Het gaat om het volgende:

code:
1
2
3
4
5
6
7
8
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcesses() As Process
    Dim myProcess As Process
    myProcesses = Process.GetProcesses()
    For Each myProcess In myProcesses
        TextBox1.Text = TextBox1.Text & myProcess.ProcessName & vbCrLf
    Next
End Sub

In andere woorden: ik laat dus een lijst met alle draaiende programma's printen. Het enige wat ik niet uit de "myProcess" kan halen is de gebruiker die het proces draait: de "username" dus. Dit is schijnbaar een element wat niet bestaat als je via GetProcesses alles ophaalt.

Mijn vraag is dus: hoe haal ik de gebruikersnaam van een lopend proces op? Ik heb al flink wat rondgekeken, maar ik heb niks gevonden wat begrijpelijk overkomt.

Mocht iemand hier iets over weten: mijn eeuwige dank :)

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 13-05 08:20

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:21
code:
1
System.Threading.Thread.CurrentPrincipal.Identity.Name
:?

https://fgheysels.github.io/


  • BlueAce
  • Registratie: November 2002
  • Laatst online: 09-01-2021
@Remco: dit heeft hierop geen betrekking denk ik. Ik had hem ook al bekeken, maar ik zie niet hoe ik dit zou moeten implementeren in een project dat niks te maken heeft met een remote server. Ik moet ook allerlei extra componenten gaan installeren voordat het werkt, lijkt me niet de bedoeling.

@whaomi: ik zoek niet de huidige username, dat is namelijk dit:
code:
1
2
Dim UserName As String
UserName = System.Environment.UserName.ToString

Ik zoek de username van een bepaald process. Dat kan ook "system" of "network" zijn bijvoorbeeld.

Echt lomp dat username niet gewoon een element is via GetProcesses() 8)7

[ Voor 40% gewijzigd door BlueAce op 26-02-2005 15:20 ]


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 13-05 08:20
Ik heb even verder voor je gezocht op google.
Er staat trouwens genoeg over in.
Maar hier heb je denk ik wel wat:
Hi Darren,

It's easy to enumerate the processes and get PID and process name by using
.NET Process class.
You may get the process collection of local computer by
Process.GetProcesses method.
However, it would be much harder to get the owner name of each processes,
you need first call the Windows API OpenProcessToken to get the
corresponding token for this process object, then you can get the SID of
the owner by GetTokenInformation with TokenInformationClass set to
TokenOwner, use LookupAccountName to get the user name coresponding SID.
To get the owner name needs a lot of platform invokes, the chapter
"Interoperating with Unmanaged Code" in .NET Framework guide will give you
a good start.
<Interoperating with Unmanaged Code>
http://msdn.microsoft.com...library/en-us/cpguide/htm
l/cpconInteroperatingWithUnmanagedCode.asp

If you have any problem on this issue, please be free to reply this thread.
Thanks!

Best regards,

Ying-Shen Yu [MSFT]
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security

The best thing about UDP jokes is that I don't care if you get them or not.


  • BlueAce
  • Registratie: November 2002
  • Laatst online: 09-01-2021
De bedoeling is dus dat ik met Windows API OpenProcessToken ga werken? Het komt allemaal nogal vaag over.

Volgens mij zoeken we ook niet met dezelfde trefwoorden op Google, ik kom dit allemaal niet tegen in ieder geval :)

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 13-05 08:20
google: vb.net get processes owner ;)

[ Voor 12% gewijzigd door Remco op 26-02-2005 19:30 ]

The best thing about UDP jokes is that I don't care if you get them or not.


  • BlueAce
  • Registratie: November 2002
  • Laatst online: 09-01-2021
Ik kom er tot mijn frustratie nog niet uit. Mijn code is nu als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
    Function GetUser()
        Dim RetVal As Integer
        Dim UserName As String
        Dim Buffer As String
        Buffer = New String(CChar(" "), 25)
        RetVal = GetUserName(Buffer, 25)
        UserName = Strings.Left(Buffer, InStr(Buffer, Chr(0)) - 1)
        MsgBox(UserName)
    End Function


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim myProcesses() As Process
        Dim myProcess As Process
        myProcesses = Process.GetProcesses
        For Each myProcess In myProcesses
            If DeUsernameVanHetProces = System.Environment.UserName.ToString Then
            TextBox1.Text = TextBox1.Text & myProcess.Id & vbCrLf
            End If
        Next

    End Sub


Die functie GetUser heb ik uit de manual. Wat ik dus moet doen is schijnbaar die functie koppelen aan de For Each loop met al mijn processes. Hoe doe ik dit dus? Ik probeer nu al een tijdje meerdere combinaties, maar geen enkele werkt...

[ Voor 7% gewijzigd door BlueAce op 26-02-2005 22:24 ]


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Oplossing gevonden, en veel simpeler dan werd aangegeven. Je hoeft maar 1 API functie te gebruiken, namelijk OpenProcessToken. Originele code was C#, handmatig omgezet, dus kunnen syntaxfouten in zitten.


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal processHandle As IntPtr, ByVal desiredAccess As UInt32, ByRef tokenHandle As IntPtr) As Integer

Private Sub Form1_Load(ByVal sender As System.Object, Byval e As System.EventArgs)
    Dim tokenHandle As IntPtr = IntPtr.Zero;
    Dim item As ListViewItem
    Dim process As Process

    For Each process In Proces.GetProcesses()
        item = ListView1.Items.Add(process.Id) ' PID
        item.SubItems.Add(process.ProcessName)

        Try
            OpenProcessToken(process.Handle, &H20008, tokenHandle)
            item.SubItems.Add(new WindowsIdentity(tokenHandle).Name);
        Catch ex As Win32Exception
            item.SubItems.Add("(access denied)")
        End Try
    Next

End Sub
NB:
• WindowsIdentity komt uit de System.Security.Principal namespace.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • BlueAce
  • Registratie: November 2002
  • Laatst online: 09-01-2021
Met de onderstaande code is het me gelukt. Wanneer er dus op Button1 geklikt wordt zie je de processen die je ook daadwerkelijk zelf hebt opgestart:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal processHandle As IntPtr, ByVal desiredAccess As Int32, ByRef tokenHandle As IntPtr) As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim tokenHandle As IntPtr = IntPtr.Zero
        Dim item As ListViewItem
        Dim process As Process

        For Each process In process.GetProcesses()
            Try
                OpenProcessToken(process.Handle, &H20008, tokenHandle)
                item = ListView1.Items.Add(process.Id)
                item.SubItems.Add(process.ProcessName)
                item.SubItems.Add(New System.Security.Principal.WindowsIdentity(tokenHandle).Name)
            Catch ex As System.ComponentModel.Win32Exception
            End Try
        Next
    End Sub


Super bedankt! Ik kan weer verder :)
Pagina: 1