Ahhhhh vous imaginez pas la galère pour trouver ce petit code de rien du tout.
Mais au bout de nombreuses heures, j'y suis finalement arrivé, donc voilà je le partage car je peux vous le garantir qu'il n'exite pas déjà sur vbfrance (oui oui j'ai cherché, pas trouvé, donc codé moi meme).
Je sais que je n'ai pas été le seul à chercher un code de ce genre, j'espère que ça en aidera plus d'un.
Je vous met en source les fonctions principales, et dans le zip un exemple d'utilisation (j'ai repris un exemple de la msdn pour pas me faire plus chier).
Chez moi ça marche nickel (wouhou quelle joie), prévenez moi si vous voyez des bugs.
Ahh si des fois il y a un problème avec les noms de process, mais comme c'est pas le but de la source on s'en fout un peu, il y a des méthodes bien mieux pour récupérer les noms des process, donc je ne m'y attarde pas. Demandez moi si vous avez besoin.
A ceux qui se demanderont quelle utilité peut avoir cette source, patientez un peu vous verrez bientot ;)
Source / Exemple :
' Pour copier une zone de mémoire
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
' Pour récupérer le nom d'utilisateur en connaissant son ID
Public Declare Function LookupAccountSid Lib "advapi32.dll" Alias "LookupAccountSidA" (ByVal lpSystemName As String, ByVal Sid As Long, ByVal name As String, cbName As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, peUse As Long) As Long
Public Const ERROR_INSUFFICIENT_BUFFER = 122&
' Pour faire la liste des processus
Public Type WTS_PROCESS_INFO
SessionID As Long ' Identificateur de la session
ProcessID As Long ' Identificateur du processus
pProcessName As Long ' Pointeur vers le nom du processus
pUserSid As Long ' Pointeur vers l'ID de l'utilisateur associé au processus
End Type
' Fait la liste des processus en mémoire à l'endroit désigné par le pointeur : pProcessInfo
' Count est le nombre de processus
Public Declare Function WTSEnumerateProcesses Lib "wtsapi32.dll" Alias "WTSEnumerateProcessesA" (ByVal hServer As Long, ByVal Reserved As Long, ByVal Version As Long, ByRef pProcessInfo As Long, ByRef Count As Long) As Long
' Libère la mémoire utilisée par la liste des processus crée avec la fonction d'au dessus
Public Declare Sub WTSFreeMemory Lib "wtsapi32.dll" (ByVal pMemory As Long)
Public Const WTS_CURRENT_SERVER_HANDLE = 0&
' Permet de récupérer la liste des processus avec leurs infos
' tabProcessInfo() : de 0 à Count-1
Public Function mpListProcessInfo(tabProcessInfo() As WTS_PROCESS_INFO, Count As Long) As Long
Dim RetVal As Long
Dim i As Integer
Dim pBuffer As Long, Pointeur As Long
ReDim tabProcessInfo(0) As WTS_PROCESS_INFO
' Fait la liste des processus en mémoire dans un buffer à l'endroit désigné par le pointeur : pBuffer
RetVal = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0&, 1, pBuffer, Count)
Pointeur = pBuffer
' Si ça a fonctionné
If RetVal Then
For i = 0 To Count - 1
' Sauvegarde dans le tableau
ReDim Preserve tabProcessInfo(i) As WTS_PROCESS_INFO
' La liste des processus est en mémoire : on la copie de la mémoire dans notre variable
CopyMemory tabProcessInfo(i), ByVal Pointeur, LenB(tabProcessInfo(i))
' On calcule la position de la prochaine structure d'info sur les process en mémoire
Pointeur = Pointeur + LenB(tabProcessInfo(i))
Next i
' Libère le buffer de la mémoire
WTSFreeMemory pBuffer
' La fonction a réussi
mpListProcessInfo = 1
Else
' Il y a eu une erreur dans WTSEnumerateProcesses
mpListProcessInfo = Err.LastDllError
End If
End Function
' Permet de récupérer le nom d'utilisateur associé à un processus
Public Function mpGetUserNameFromProcess(ProcessID As Long) As String
Dim RetVal As Long
Dim Count As Long, i As Long
Dim pBuffer As Long, Pointeur As Long
Dim ProcessInfo As WTS_PROCESS_INFO
mpGetUserNameFromProcess = ""
' Fait la liste des processus en mémoire dans un buffer à l'endroit désigné par le pointeur : pBuffer
RetVal = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0&, 1, pBuffer, Count)
Pointeur = pBuffer
' Si ça a fonctionné
If RetVal Then
' On les parcours tous
For i = 0 To Count - 1
' La liste des processus est en mémoire : on la copie de la mémoire dans notre variable
CopyMemory ProcessInfo, ByVal Pointeur, LenB(ProcessInfo)
' Si c'est le notre, on récupère le nom d'utilisateur
If ProcessInfo.ProcessID = ProcessID Then
mpGetUserNameFromProcess = mpGetUserNameFromUserID(ProcessInfo.pUserSid)
' On sort de la boucle
Exit For
End If
' On calcule la position de la prochaine structure d'info sur les process en mémoire
Pointeur = Pointeur + LenB(ProcessInfo)
Next i
' Libère le buffer de la mémoire
WTSFreeMemory pBuffer
End If
End Function
' Renvoie le nom d'utilisateur correspondant à son identificateur
Public Function mpGetUserNameFromUserID(ByVal UserID As Long) As String
Dim bSuccess As Long ' La variable de retour des fonctions
Dim name As String ' Nom de l'utilisateur
Dim domain_name As String ' Nom du domaine pour l'utilisateur
Dim name_len As Long ' Longueur de la chaine "name" (à initialiser)
Dim domain_len As Long ' Longueur de la chaine "domain_name" (à initialiser)
Dim deUse As Long ' Pointeur vers un type SID_NAME_USE qui indique le type du compte
name = ""
domain_name = ""
name_len = 0
domain_len = 0
' On appelle une première fois pour récupérer la taille des variables name et domain_name
bSuccess = LookupAccountSid(vbNullString, UserID, name, name_len, domain_name, domain_len, deUse)
If (bSuccess = 0) And (Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER) Then
mpGetUserNameFromUserID = ""
Exit Function
End If
' Dimensionne
name = Space(name_len - 1)
domain_name = Space(domain_len - 1)
' Récupère le nom d'utilisateur
bSuccess = LookupAccountSid(vbNullString, UserID, name, name_len, domain_name, domain_len, deUse)
mpGetUserNameFromUserID = name
End Function
Conclusion :
Merci à la msdn et à ShareVB grace à qui j'ai pu connaitre le nom des fonctions à utiliser.
En esperant que ça vous serve, comme d'ab ;)
Fonctions présentes (pour le moteur de recherche) :
Récupérer le nom d'utilisateur associé à un processus
Récupérer la liste des processus et des infos dessus
Récupérer le nom d'utilisateur à partir de son identificateur (userid)
Utilisation de WTSEnumerateProcesses, LookupAccountSid, WTS_PROCESS_INFO
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.