PDA

View Full Version : [ Vb.Net 2008 Framework 3.5 ] Nome Utente Processi - Genymus


Genymus
18-12-2009, 19:58
Salve, ho bisogno di trovare il nome utente dei processi attivi (tipo task manager)...

Fino a poco tempo fa usavo il seguente pezzo di codice:
Dim qs As New System.Management.ObjectQuery("SELECT * FROM Win32_Process WHERE ProcessID = '" & Id & "'")
Dim os As New System.Management.ManagementObjectSearcher(qs)
Dim mo As System.Management.ManagementObject
Dim ar(1) As String
If (os.Get.Count = 0) Then
Return ("Non Disponibile")
Else
For Each mo In os.Get
mo.InvokeMethod("GetOwner", DirectCast(ar, Object()))
Next
Return Trim(ar(0))
End If
Subito abbandonato perchč su un timer, eseguito quindi in modo ripetitivo, rallentava le funzionalitą dell'applicazione annullandone gli effetti.

č possibile che sul namespace "System.Diagnostic" non sia presente la funzione "getUsername" o una simile???
Sperando ringrazio anticipatamente.

Genymus

Ps: a chi il codice sopra possa andare bene e non avesse troppe pretese, ricordo che bisogna aggiungere il riferimento a "System.management" (Progetto > Aggiungi riferimento > .NET > System.management).

MarcoGG
19-12-2009, 09:24
Vero, System Diagnostics Process ha una moltitudine di metodi e proprietą ma non c'č semplicemente un .UserName o simile. Per questo serve ancora un accesso vecchia maniera ad un paio di API, ma non aspettarti di avere comunque una lista completa di tutti gli Owners di processo. Vedrai che riceverai parecchi "Accesso negato", in ogni caso prova questo :

Public Declare Function OpenProcessToken Lib "advapi32.dll" Alias "OpenProcessToken" (ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As UInt32, ByRef TokenHandle As IntPtr) As Boolean
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As IntPtr) As Boolean
Public Const TOKEN_QUERY As UInteger = &H8

Dim ph As IntPtr = IntPtr.Zero
For Each P As Process In Process.GetProcesses
Try
OpenProcessToken(P.Handle, TOKEN_QUERY, ph)
Dim WI As New Security.Principal.WindowsIdentity(ph)
ListBox1.Items.Add(P.ProcessName & " - " & WI.Name)
Catch ex As Exception
ListBox1.Items.Add(P.ProcessName & " - " & ex.Message)
Finally
If ph <> IntPtr.Zero Then CloseHandle(ph)
End Try
Next
;)

Genymus
20-12-2009, 18:43
Direi che il codice mi basta per quello che mi serve, vedo che apparte i processi di systema, i processi aperti dagli utenti vengono visti...
Grazie.

Genymus