Connaître l'utilisateur qui a instancié le process ??

alex.fplc Messages postés 7 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 21 février 2009 - 16 févr. 2009 à 19:28
nainbleu2 Messages postés 41 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 14 juillet 2010 - 25 juin 2010 à 07:06
Bonjour,

Je cherche à savoir si les classes Process, Module ou Diagnostics permettent à elle seules de trouver le user qui a démarré un process.....Après exploration des méthodes et des propriétés (et des sources proposées ici), je ne vois pas....

PS la méthode StartInfo ne me ramène rien...bien qu'elle soit indiquée pour du Set ET du Get !

Avez vous une idée ?
A votre dispo pour + d'explications....

Amicalement

alex

9 réponses

alex.fplc Messages postés 7 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 21 février 2009
16 févr. 2009 à 19:35
J'ajoute qu'il s'agit de .NET !
Merci encore
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
11 mars 2009 à 22:53
Bonjour,

Je recherche exactement a faire la même chose
et j'ai peut être une piste coter WMI Win32_Process (antecedant)
va voir dans visual Studio explorateur Serveur dedans tu peux voir les processes tournant et les developper un max pour voir les informations je pense que si je fais la meme chose avec la class WMI Win32_Process et lier l'ID a l'utilisateur je pourrais recuperer l'information :) a suivre ...

Cordialement,
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
11 mars 2009 à 23:42
Bonjour,

Apres une recherche sur le MSDN
http://msdn.microsoft.com/en-us/library/aa390460(VS.85).aspx
Qui dit :
___________________________
uint32 GetOwner(
 [out] string User,
 [out] string Domain
);
___________________________

Return code |Description |----
* 0 :
, Successful Completion, ----
* 2 :
, Access Denied, ----
* 3 :
, Insufficient Privilege, ----
* 8 :
, Unknown Failure, ----
* 9 :
, Path Not Found, ----
* 21 :
, Invalid Parameter
____________________________________________

Le code est :

____________________________________________
    Public Enum LoggedInUserReturn
        Successful = 0
        AccessDenied = 2
        InsufficientPrivilege = 3
        UnknownFailure = 8
        PathNotFound = 9
        InvalidParameter = 21
    End Enum
____________

    Public Shared Function GetLoggedInUser() As ArrayList
        Dim allUserProcess As New ArrayList
        Dim mc As New ManagementClass("Win32_Process")
        Dim moc As ManagementObjectCollection = mc.GetInstances

        For Each mo As ManagementObject In moc

            Dim argList As String() = {String.Empty}
            Dim objReturn As Object = mo.InvokeMethod("GetOwner", argList)
            Dim returnValue As LoggedInUserReturn = Convert.ToInt32(objReturn)

            If returnValue = LoggedInUserReturn.Successful Then
                allUserProcess.Add(mo.GetPropertyValue("Name").ToString & " - " & argList(0).ToString)
            End If
        Next
        Return allUserProcess
    End Function
_____________________________________________________

Utilisation
____________________________________________________
   Dim userName As ArrayList = GetLoggedInUser()
____________________________________________________

Et voila

Cordialement,
0
nainbleu2 Messages postés 41 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 14 juillet 2010
22 juin 2010 à 07:23
Bonjour,

Je relance le débat sur une question qui m'est chère et dont je n'ai toujours pas trouvé la solution (puisque je suis un débutant). J'espère trouve ici la solution, car j'ai vraiment besoin de ce code...

J'ai déjà un code qui me permet de contrôler la présence d'un proccess ou nom et de faire un action si tel proccess n'est pas présent, mais je dois contrôler aussi l'utilisateur lié à ce proccess. Et là je suis vraiment coincé...

J'utilise Visual Basic Express 2008.

Voilà mon code initial dans le quel je dois intégrer la fonction proposée par TroXsa ci-dessus.

Public Class fenetreControle

Dim sec As Integer
Dim sec2 As Integer
Dim min As Integer

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub fenetreControle_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Cette ligne permet de cacher le form. Mettez la en commentaire pour que le form soit visible
Me.Visible = False

VerifNotePad()

'Démarage du timer
Timer.Start()

End Sub

Sub VerifNotePad()
'Vérifie la présence de Falcon, si le process n'est pas présent on kill l'EibusDrv et on le relance.
Dim p As New Process
Try
'Vérification de l'existence du process (on le trouve dans le gestionnaire des taches ^^)
If UBound(Diagnostics.Process.GetProcessesByName("Falcon")) < 0 Then
'Chemin de l'application
p.StartInfo.FileName = "C:\SevenLine\Kill_EibusDrv.bat"
'Définition du style de la fenêtre (maximisé, minimisé, normal, caché)
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
'Démarrage du process
p.Start()
Sleep(10000)
'Chemin de l'application
p.StartInfo.FileName = "C:\SevenLine\Client\EibusDrv.exe"
'Définition du style de la fenêtre (maximisé, minimisé, normal, caché)
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
'Démarrage du process
p.Start()
End If
Catch err As Exception
MsgBox(err.ToString(), MsgBoxStyle.Critical, "Erreur !")
End Try
End Sub

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
'Le timer est une fonction qui va se lancer à une période régulière choisie par l'utilisateur. Je l'ai réglé à 1000ms, c'est à dire que toutes les secondes, cette fonction va se répeter.
'Cette ligne permet l'incrémentation de la variable sec qui, comme son nom l'indique, représente les secondes.
sec = sec + 1

'Cette condition permet d'incrémenter les minutes toutes les 60s et de remettre à zéro la variable des secondes.
If sec = 60 Then
sec = 0
min = min + 1
End If

'Cette condition permet de lancer la vérification toutes les 15min (vous pouvez modifier le temps bien sûr)
If min = 1 Then
VerifNotePad()
min = 0
End If

'Si le form est en mode visible cette ligne permet de visualiser le temps écoulé
temps.Text = "Timer: " & min & " m " & sec & " s"
End Sub
End Class

Merci d'avance pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nainbleu2 Messages postés 41 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 14 juillet 2010
23 juin 2010 à 06:55
Mais où sont donc passé les crack du Visual Basic???

Un p'tit coup de pouce s'il vous plait
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
23 juin 2010 à 11:44
Bonjour,

Pourquoi avoir attendu si longuement ! :)
Imports System.Management

Public Class Form1
    Public Enum LoggedInUserReturn
        Successful = 0
        AccessDenied = 2
        InsufficientPrivilege = 3
        UnknownFailure = 8
        PathNotFound = 9
        InvalidParameter = 21
    End Enum
    Public Shared Function GetLoggedInUser(ByVal Application As String) As ArrayList
        Dim allUserProcess As New ArrayList
        Dim mc As New ManagementClass("Win32_Process")
        Dim moc As ManagementObjectCollection = mc.GetInstances

        For Each mo As ManagementObject In moc

            Dim argList As String() = {String.Empty}
            Dim objReturn As Object = mo.InvokeMethod("GetOwner", argList)
            Dim returnValue As LoggedInUserReturn = Convert.ToInt32(objReturn)

            If returnValue = LoggedInUserReturn.Successful Then
                If Application.ToLower = mo.GetPropertyValue("Name").ToString.ToLower Then
                    allUserProcess.Add(argList(0).ToString)
                End If
            End If
        Next
        Return allUserProcess
    End Function
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each n As String In GetLoggedInUser("notepad.exe")
            Console.WriteLine(n)
        Next
    End Sub
End Class


Pour que ce code fonctionne il faut aller dans le menu projet et ajouté une reference puis trouvé "System.Management"

J'ai ajouté un argument a la fonction qui est le nom du process rechercher, quand il le trouve il retourne tout les occurrence mais uniquement le nom (pas très utile)

Si vous voulez nous pouvons nous entretenir via msn ou le mail affin de vous donnez le code avec exactitude.


Cordialement,
0
nainbleu2 Messages postés 41 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 14 juillet 2010
23 juin 2010 à 14:16
Jamais trop tard pour bien faire :-)

Merci TroXsA, je vous donne volontiers mon mail (je n'ai pas de msn) cssm.007@bluewin.ch

Comme je l'ai dit plus haut, je suis débutant, donc autant dire que c'est un peu du chinois tout ces termes System.Managment, ajouter un argument... J'ai fait ajouter une référence puis System.Managment, mais rien ne semble s'être passé de visible à l'écran, donc je suis déjà bloqué.

Mais avez-vous bien compris mon besoin? Je peux tout vous détailler par mail si vous me le donnez. En tout cas je vous serai très reconnaissant si vous me trouvez la solution, c'est vraiment important pour moi...

Merci
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
24 juin 2010 à 10:53
Bonjour,


Je vais prendre contact avec vous tres prochainement par mail
il ce va de soit quand vous aurez la solution de repassé par la pour que tout le monde puisse en bénéficié
A tres bientot



Cordialement,
0
nainbleu2 Messages postés 41 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 14 juillet 2010
25 juin 2010 à 07:06
Bien entendu :-)

Merci et à tout bientôt
0