IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Récupération ID session sur windows 10 sur machine distante avec Delphi


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut Récupération ID session sur windows 10 sur machine distante avec Delphi
    Bonjour à tous,
    J'ai besoin de récupérer l'ID session d'une machine distante créé par Windows 10 pro à l'ouverture de session d'un utilisateur.
    Pour le moment je passe par un shellexecute avec psexec.exe qui lance la commande QUERY SESSION sur la machine distante.
    Est-il possible de récupérer cet ID session avec Delphi sans passe par un shellexecute et psexec ?
    Cordialement
    Merci

  2. #2
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 590
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par julesclaude Voir le message
    Bonjour à tous,
    J'ai besoin de récupérer l'ID session d'une machine distante créé par Windows 10 pro à l'ouverture de session d'un utilisateur.
    Pour le moment je passe par un shellexecute avec psexec.exe qui lance la commande QUERY SESSION sur la machine distante.
    Est-il possible de récupérer cet ID session avec Delphi sans passe par un shellexecute et psexec ?
    Cordialement
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    program RemoteSessionInfo;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils, ComObj, ActiveX, Variants;
     
    procedure GetRemoteSessionIDs(const RemoteMachine: string);
    var
      Locator, Services, Processes: OleVariant;
      EnumProc: IEnumVariant;
      ProcObj: OleVariant;
      Value: Cardinal;
      UserName, Domain: string;
    begin
      CoInitialize(nil);
      try
        Locator := CreateOleObject('WbemScripting.SWbemLocator');
        Services := Locator.ConnectServer(RemoteMachine, 'root\cimv2', '', '', '', '', 0, nil);
     
        Processes := Services.ExecQuery('SELECT * FROM Win32_Process WHERE Name = "explorer.exe"');
        EnumProc := IEnumVariant(IUnknown(Processes._NewEnum));
     
        while EnumProc.Next(1, ProcObj, Value) = 0 do
        begin
          if VarType(ProcObj) = varDispatch then
          begin
            UserName := '';
            Domain := '';
            ProcObj.GetOwner(UserName, Domain);
     
            Writeln(Format('SessionId: %d - User: %s\%s',
              [Integer(ProcObj.Properties_.Item('SessionId').Value), Domain, UserName]));
          end;
        end;
      finally
        CoUninitialize;
      end;
    end;
     
    begin
      try
        Writeln('--- Récupération des sessions sur la machine distante ---');
        GetRemoteSessionIDs('NOM_DE_LA_MACHINE'); // Remplace par le nom ou IP de la machine distante
      except
        on E: Exception do
          Writeln('Erreur : ', E.Message);
      end;
      Readln;
    end.
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 968
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 968
    Par défaut
    Par les fonctions terminal server.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    uses Winapi.WTSApi32;
     
    function GetRemoteSessionId(const aServer: string) :integer;
    var
      SI: PWTS_SESSION_INFO;
      Count: cardinal;
    begin
      const Server = WTSOpenServer(PChar(aServer));
      try
        if WTSEnumerateSessions(Server, 0, 1, SI, Count) then
        try
          for var i := 0 to Count -1 do
          begin
            if SI.State in [WTSActive, WTSDisconnected] then
              Exit(SI.SessionId);
     
            Inc(SI);
          end;
        finally
          WTSFreeMemory(SI);
        end;
     
      finally
        WTSCloseServer(Server);
      end;
     
      Result := -1;
    end;

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    Je ne le connais que dans le cas d'un MSTSC : WTSQuerySessionInformation

    Voir ce code utilitaire TSliteModuleTool.GetClientComputerOfRemoteSession
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Merci pour vos réponses,
    Je m'en vais tester tout cela et reviens au plus vite pour vous faire un retour.
    Cordialement.

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Bonjour à tous,
    Je n'ai pas réussi à faire fonctionner la procédure de Xgregory que je remercie encore une fois. A la compilation il m'indique une erreur sur le nil de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Services := Locator.ConnectServer(RemoteMachine, 'root\cimv2', '', '', '', '', 0, nil);
    Par contre j'avais déjà envisager la piste WMI sans jamais trouver le Select qui me permettrait de trouver l'ID session. Du coup la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Processes := Services.ExecQuery('SELECT * FROM Win32_Process WHERE Name = "explorer.exe"');
    m'a permis de trouver cette information j'ai légèrement modifier le select qui devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT sessionid FROM Win32_Process WHERE Name = "explorer.exe"'
    pour ne récupérer que l'ID session.
    Pour l'approche WMI j'ai utilisé les composant Mitec qui gère le WMI.
    Dans l'approche de xgregory j'ai essayé de remplacer le nil par null, cela passe à la compilation mais renvoie une erreur de violation.
    Je vais maintenant essayer la solution de Andnotor.
    Corddialement

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par julesclaude Voir le message
    Pour l'approche WMI j'ai utilisé les composant Mitec qui gère le WMI.
    Pourquoi ?
    un simple procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    uses
      SysUtils,
      ActiveX,
      ComObj,
      Variants;
     
     
     
    // La classe Win32_Process représente une séquence d’événements sur un système Win32.
    // Toute séquence qui consiste en une interaction d’un ou plusieurs processeurs ou interpréteurs, du code exécutable et un jeu d’entrées, est un descendant (ou un membre) de cette classe.
     
    // Exemple*: une application client qui s’exécute sur un système Win32 en mode console
     
    procedure  GetWin32_ProcessInfo;
    const
      WbemUser            ='';
      WbemPassword        ='';
      WbemComputer        ='localhost';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Process','WQL',wbemFlagForwardOnly);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        Writeln(Format('ProcessId    %d',[Integer(FWbemObject.ProcessId)]));// Uint32
     
        Writeln('');
        FWbemObject:=Unassigned;
      end;
    end;
    Comme ci-dessus généré par WMI Delphi Code Creator à adapter en fonction devrait suffire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    Citation Envoyé par julesclaude Voir le message
    Bonjour à tous,
    Dans l'approche de xgregory j'ai essayé de remplacer le nil par null, cela passe à la compilation mais renvoie une erreur de violation.
    nil est le pointeur 0 synonyme d'une absence de pointeur, si il y a une erreur, faut nous la communiquer, c'est peut-être selon le Delphi, mais comme c'est du Late Binding, c'est étrange d'avoir une erreur à compilation, probablement un "Type not allowed in OLE Automation call"

    null, plus exactement Null, est une valeur d'un variant pour indiquer la nullité, une valeur vide mais volontaire, ce qui est différent de Unassigned qui est une valeur absente.

    nil en paramètre d'une fonction en Late Binding, c'est un peu étrange, j'aurais tenté Unassigned ou plus simple omettre le paramètre.

    Rappel des paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    objwbemServices = .ConnectServer( _
      [ ByVal strServer ], _
      [ ByVal strNamespace ], _
      [ ByVal strUser ], _
      [ ByVal strPassword ], _
      [ ByVal strLocale ], _
      [ ByVal strAuthority ], _
      [ ByVal iSecurityFlags ], _
      [ ByVal objwbemNamedValueSet ] _
    )
    inutile d'encombrer de paramètres optionnels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Services := Locator.ConnectServer(RemoteMachine, 'root\cimv2');
    ou même avec un paramètre nommé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Services := Locator.ConnectServer(RemoteMachine, 'root\cimv2', iSecurityFlags := 0);
    Tout le reste prendre une valeur par défaut
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Bonjour SergioMaster et merci de répondre à cette discussion.

    Je préférerais me débarrasser de l'armada Mitec mais pour le moment c'est la solution qui fonctionne.

    J'ai créé un traitement qui s'appuie sur un exemple Mitec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i, j, c: Integer;
      wmiLocator: TSWbemLocator;
      wmiServices: ISWbemServices;
      AMachine, ARoot, AUser, APwd: string;
      wmiObjectSet: ISWbemObjectSet;
      wmiObject: ISWbemObject;
      wmiProp: ISWbemProperty;
      propSet: ISWbemPropertySet;
      propEnum, Enum: IEnumVariant;
      v: OleVariant;
      n: LongWord;
      xIDSession: string;
    begin
      AMachine := '192.168.1.55';
      ARoot := 'root\cimv2';
      AUser := 'ADMINISTRATEUR';
      APwd := 'AZERTY';
      xIDSession := '';
      try
        wmiLocator := TSWbemLocator.Create(nil);
        wmiServices := wmiLocator.ConnectServer(AMachine, ARoot, AUser, APwd, '', '', 0, nil);
        wmiObjectSet := wmiServices.ExecQuery('SELECT SessionID FROM Win32_Process WHERE Name = "explorer.exe"', 'WQL', wbemFlagReturnImmediately, nil);
        Enum := (wmiObjectSet._NewEnum) as IEnumVariant;
        c := wmiObjectSet.Count;
        if c > 0 then
              sg.ColCount := c + 1;
        sg.Cells[0, 0] := 'Fetching...';
        sg.Update;
        Enum := (wmiObjectSet._NewEnum) as IEnumVariant;
        i := 1;
        while (Enum.Next(1, v, n) = S_OK) do begin
          wmiObject := IUnknown(v) as SWBemObject;
          if sg.RowCount <> wmiObject.Properties_.Count + 1 then
                sg.RowCount := wmiObject.Properties_.Count + 1;
          propSet := wmiObject.Properties_;
          sg.Cells[i, 0] := IntToStr(i);
          propEnum := (propSet._NewEnum) as IEnumVariant;
          j := 1;
          while (propEnum.Next(1, v, n) = S_OK) do begin
            wmiProp := IUnknown(v) as SWBemProperty;
            sg.Cells[0, j] := wmiProp.Name;
            sg.Cells[i, j] := WmiGetPropStr(wmiProp);
            Inc(j);
          end;
          Inc(i);
        end;
        xIDSession := sg.Cells[1, 2];
        Label1.Caption := xIDSession;
      Except
        on e: Exception do
        begin
          showmessage(e.Message);
        end;
      end;
    end;
    Il me renvoie bien l'ID session.

    J'ai essayé votre procédure :

    Elle m'affiche tout un ensemble de processid mais pas mon sessionid.

    J'ai essayé de la modifier comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure GetWin32_ProcessInfo;
    const
      WbemUser = 'ADMINISTRATEUR';
      WbemPassword = 'AZERTY';
      WbemComputer = '192.168.1.25';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator: OleVariant;
      FWMIService: OleVariant;
      FWbemObjectSet: OleVariant;
      FWbemObject: OleVariant;
      oEnum: IEnumVariant;
      iValue: LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet := FWMIService.ExecQuery('SELECT sessionid FROM Win32_Process WHERE Name = "explorer.exe"', 'WQL', wbemFlagForwardOnly);
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        showmessage(Format('ProcessId    %d', [Integer(FWbemObject.ProcessId)])); // Uint32
        FWbemObject := Unassigned;
      end;
    end;
    Mais cela me renvoie le message d'erreur : Méthode 'ProcessId' non supportée par l'objet Automation.

    Cordialement

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 968
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 968
    Par défaut
    La requête ne spécifie que SessionId, tu ne vas pas pouvoir récupérer ProcessId.

    Il manque aussi une conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while oEnum.Next(1, FWbemObject, iValue) = S_OK do
    begin
      const Prop = IUnknown(FWbemObject) as SWBemProperty;
      showmessage(Format('SessionId = %s', [VarToStr(Prop.Get_Value)]));
    end;

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par julesclaude Voir le message
    Mais cela me renvoie le message d'erreur : Méthode 'ProcessId' non supportée par l'objet Automation.
    J'ai utilisé une des options de WMI DelphiCode Creator pour générer directement le programme console
    Nom : Capture.png
Affichages : 81
Taille : 310,6 Ko
    excepté le fait qu'il faille le lancer en mode administrateur dans un Terminal

    Citation Envoyé par Terminal
    PS C:\Users\serge> C:\Users\serge\AppData\Local\Temp\WMITemp_20251009105130907.exe
    ProcessId 22648

    Press Enter to exit
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Bonjour SergioMaster,

    Je ne pas besoin de processid mais de sessionid.
    J'ai essayé de télécharger WMI Delphi Code Creator mais Windows bloque le téléchargement pour cause de virus !
    Par contre je vois sur votre copy d'écran (en bas à gauche) que l'on peut cocher sessionid. Pourriez-vous faire un essai ?
    Merci d'avance
    Cordialement

  13. #13
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 56
    Par défaut
    FWbemObjectSet := FWMIService.ExecQuery('SELECT sessionid FROM Win32_Process WHERE Name = "explorer.exe"', 'WQL', wbemFlagForwardOnly);
    La requête suivante n'inclut pas ProcessId, sessionid doit être remplacé par * pour inclure tous les champs

  14. #14
    Membre confirmé
    Homme Profil pro
    Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseigant en EPS et responsable informatique d'un établissement scolaire à la retraite.
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Je viens de modifier la procédure en m'appuyant sur votre copie d'écran et cela marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure GetWin32_ProcessInfo;
    const
      WbemUser = 'ADMINISTRATEUR';
      WbemPassword = 'AZERTY';
      WbemComputer = '192.168.1.25';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator: OleVariant;
      FWMIService: OleVariant;
      FWbemObjectSet: OleVariant;
      FWbemObject: OleVariant;
      oEnum: IEnumVariant;
      iValue: LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet := FWMIService.ExecQuery('SELECT sessionid FROM Win32_Process WHERE Name = "explorer.exe"', 'WQL', wbemFlagForwardOnly);
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        showmessage(Format('SessionId    %d', [Integer(FWbemObject.SessionId)])); // Uint32
        FWbemObject := Unassigned;
      end;
    end;
    Comme toujours vous êtes d'une efficacité redoutable.
    Merci encore
    Cordialement.

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par julesclaude Voir le message
    J'ai essayé de télécharger WMI Delphi Code Creator mais Windows bloque le téléchargement pour cause de virus !
    Bien sûr que Microsoft n'aime pas un code qui permet de toucher au WMI il faut passer outre l'avertissement. Mon Norton qui analyse ensuite l'installateur m'indique qu'il n'a aucun virus
    Test fait ce jour avec la version trouvée ici : https://github.com/RRUZ/wmi-delphi-c.../tag/1.9.9.482

    P.S. Désolé si je suis resté sur ProcessId dans mon exemple j'avais perdu le fil.

    @Mist2024 Pourquoi demander toutes les informations (*) alors que seule SessionId est voulue. Même s'il s'agit de WSQL, il s'agit d'une base de SQL. Par principe j'évite le * et demande uniquement la liste des colonnes souhaitées.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 56
    Par défaut
    [/Pourquoi demander toutes les informations (*) alors que seule SessionId est voulue.
    C'était pour la récupération du ProcessId, l'erreur est dans le deuxième code du message #9
    Est-il possible de mettre uniquement ProcessId dans le Select ?

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Mist2024 Voir le message
    Est-il possible de mettre uniquement ProcessId dans le Select ?
    Bien évidemment, c'est du "SQL"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  18. #18
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 56
    Par défaut
    Désolé c'était une erreur de ma part , j'avais un code en VBA (plus pratique que Delphi) que j'ai modifié pour afficher le ProcessId de l'explorer et je ne sais pas pourquoi il n'a pas fonctionné, aujourd’hui j'ai refait un autre test et ça fonctionne du premier coup:

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Dim WMI As Object, ret As Object
        Set WMI = GetObject("winmgmts:root\CIMV2")
        Set ret = WMI.ExecQuery("Select ProcessId from Win32_Process Where Name = ""explorer.exe"" ")
        If ret.Count = 1 Then
           Debug.Print ret.ItemIndex(0).ProcessId
        End If

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer script sur machine distante depuis Linux sur Windows
    Par erwannoo dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 26/10/2023, 15h21
  2. Réponses: 0
    Dernier message: 05/07/2017, 07h51
  3. [Débutant] Executer .bat ou .exe sur machine distante via Windows Form
    Par naruthomas41 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/04/2016, 12h01
  4. Lancement Script sur machine distante Windows
    Par michelS dans le forum Exécution et industrialisation
    Réponses: 3
    Dernier message: 09/01/2014, 18h20
  5. Réponses: 0
    Dernier message: 15/03/2011, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo