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

Web & réseau Delphi Discussion :

API windows DHCP et Delphi


Sujet :

Web & réseau Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut API windows DHCP et Delphi
    Bonjour à tous.tes,
    J'ai besoin de gérer l'activation / désactivation du DHCP via une application Delphi 11.
    Je n'ai rien trouvé d'autre que l'éventuelle possibilité de passer par les API Windows. Mais je ne sais pas comment faire.
    Quelqu'un aurait-il quelques pistes à me proposer.
    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    13 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 202
    Points : 24 205
    Points
    24 205
    Par défaut
    C'est surement via ReleaseDHCPLease, tu as tout ce qu'il faut dans How do I disable a network connection


    Pour faire gagner du temps à tous, un début de code à nous fournir que l'on doit corriger
    Des liens vers vos lectures, que l'on répète pas les mêmes choses
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Merci ShaiLeTroll. Je vais jeter un oeil plus attentif.

    J'ai essayé de trouver la soluce en ligne de commande, mais très bizarrement, ou pas, je ne trouve pas ce qui semblerait être un pgm nommé dhcpconfig dans mon windows 10.
    Avec
    /usr/sbin/dhcpconfig -S -e (pour enabler)
    /usr/sbin/dhcpconfig -S -d (pour disabler)


  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    13 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 202
    Points : 24 205
    Points
    24 205
    Par défaut
    /usr/ ... c'est du sous-system linux dans Windows ?
    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 du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Ah ben c'est pour ça que je ne trouvais pas

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Oui, il semble bien y avoir tout ce qu'il faut dans "How do I disable a network connection".
    Sauf qu'il n'y a rien d'expliqué, que ça me semble très compliqué, et que, donc, je n'arrive pas à maîtriser le truc.
    J'ai bien réussi à désactiver le DHCP sur ma carte réseau à un moment donné, mais je n'arrive plus à reproduire...

    Y aurait-il quelque part des tutos sur la gestion des réseaux avec Delphi ?

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Peut-être intéressant :
    https://theroadtodelphi.com/2015/10/...i-from-delphi/
    Je check

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 628
    Points : 39 799
    Points
    39 799
    Billets dans le blog
    59
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Sauf qu'il n'y a rien d'expliqué, que ça me semble très compliqué, et que, donc, je n'arrive pas à maîtriser le truc.
    Il vous manque certes quelques clauses uses
    SysUtils,
    ActiveX,
    ComObj,
    Variants;
    et une mise en forme dans une fonction mais rien de bien méchant. Je vous conseille de vous renseigner sur les WMI et peut-être d'installer WMI Code Creator pour vous aider à utiliser celles-ci.
    Toute l'astuce du code est d'interroger la bonne classe (Win32_NetworkAdapterConfiguration) au bon endroit (root\CIMV2), la clause where Where IPEnabled = True du WQL (presque du SQL) vous permet de cibler si l'ip est active, bien sûr s'il y a plusieurs réseaux et que vous voulez désactiver seulement une ip il va falloir "améliorer" la clause

    en exemple sur mon poste (avec wmi code creator) je trouve ceci
    Nom : Capture.PNG
Affichages : 139
Taille : 20,0 Ko

    Tel que le code est fourni tous seraient désactivés ce qui n'est peut-être pas le but recherché

    En tout cas, je viens d'apprendre une chose, il est possible d'utiliser des méthodes à partir de WMI, j'étais persuadé que ce n'était que de la lecture seule
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    En cas avec le code de https://theroadtodelphi.com/2011/10/...93-networking/ (ci-dessous)
    ça marche, mais il pète avec le message en PJ : Types non correspondants
    sur SetGateways

    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
    58
    59
     
     
    function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
    var
     i : integer;
    begin
        Result   :=VarArrayCreate([0, High(Arr)], varVariant);
        for i:=Low(Arr) to High(Arr) do
         Result[i]:=Arr[i];
    end;
     
    function ArrayToVarArray(Arr : Array Of Word):OleVariant;overload;
    var
     i : integer;
    begin
        Result   :=VarArrayCreate([0, High(Arr)], varVariant);
        for i:=Low(Arr) to High(Arr) do
         Result[i]:=Arr[i];
    end;
     
    procedure  SetStaticIP;
    const
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
      vIPAddress         : OleVariant;
      vSubnetMask        : OleVariant;
      vDefaultIPGateway  : OleVariant;
      vGatewayCostMetric : OleVariant;
    begin
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        vIPAddress   := ArrayToVarArray(['192.168.1.141']);
        vSubnetMask  := ArrayToVarArray(['255.255.255.0']);
        if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
        begin
          vDefaultIPGateway  := ArrayToVarArray(['192.168.1.100']);
          vGatewayCostMetric := ArrayToVarArray([1]);
     
      ------>    FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
     
        end;
     
        VarClear(vIPAddress);
        VarClear(vSubnetMask);
        VarClear(vDefaultIPGateway);
        VarClear(vGatewayCostMetric);
        FWbemObject:=Unassigned;
      end;
    end;
    Images attachées Images attachées  

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 628
    Points : 39 799
    Points
    39 799
    Billets dans le blog
    59
    Par défaut
    peut-être parce que la valeur du deuxième argument n'est pas la bonne
    enablestatic-method-in-class-win32-networkadapterconfiguration
    pour moi le second argument devrait être vsubnetmask
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    peut-être parce que la valeur du deuxième argument n'est pas la bonne
    enablestatic-method-in-class-win32-networkadapterconfiguration
    pour moi le second argument devrait être vsubnetmask
    Merci, c'était bien ça

    Par contre ça ne fait rien de ce que je voudrais

    Une idée m'est venue en tête :
    Peut-être que mettre le DHCP en automatique et activer le DHCP sont deux choses différentes ?
    Ou alors comment forcer le DHCP à redonner une adresse IP correcte ?

    Je ne comprends tellement rien, que j'ai été obligé de réinitialiser mon réseau, pour retrouver mon internet

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Et si je fais :
    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
     
    begin
      //EnableStatic
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration WHERE DHCPEnabled = True','WQL',wbemFlagForwardOnly);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
     
      while oEnum.Next(1, FWbemObject, iValue) = 0 do     // boucle sur
      begin
        vIPAddress   := ArrayToVarArray([GStack.LocalAddress]);
        vSubnetMask  := ArrayToVarArray(['255.255.255.0']);
     
        if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
        begin
          vDefaultIPGateway  := ArrayToVarArray(['192.168.20.171']);
          vGatewayCostMetric := ArrayToVarArray([1]);
    //      FWbemObject.SetGateways(vDefaultIPGateway, vGatewayCostMetric);
          FWbemObject.SetGateways(vDefaultIPGateway, vsubnetmask);
        end;
      end;
    FWbemObject.EnableStatic(vIPAddress, vSubnetMask) n'est jamais = 0


  13. #13
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Du coup je vais me rabattre sur la ligne de commande :

    netsh int ip set address name = "Ethernet" source = dhcp
    netsh interface ipv4 set dnsservers name = "Ethernet" source = dhcp

    Et, encore du coup, mon problème devient de catcher le "name = "Ethernet""
    En ligne de commande je l'ai par :

    netsh interface ipv4 show interfaces

    Mais (vous me voyez arriver) : Y a t-il une commande Delphi pour récupérer ces infos ?

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Au final, j'ai fait :
    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
     
     
      S := '/C "netsh int ip set address name = "' + ListComboBoxNetworkCard.Items[ListComboBoxNetworkCard.ItemIndex] + '" source = dhcp"';
      GetMem(ExecuteOrder, (Length(S) + 1) * SizeOf(WideChar));
     
      try
        StringToWideChar(S, ExecuteOrder, Length(S) + 1);
        ShellExecute(0, 'open','cmd.exe', ExecuteOrder, 0, SW_HIDE);
      finally
        FreeMem(ExecuteOrder);
      end;
     
      S := '/C "netsh interface ipv4 set dnsservers name = "' +  ListComboBoxNetworkCard.Items[ListComboBoxNetworkCard.ItemIndex] + '" source = dhcp"';
      GetMem(ExecuteOrder, (Length(S) + 1) * SizeOf(WideChar));
     
      try
        StringToWideChar(S, ExecuteOrder, Length(S) + 1);
        ShellExecute(0, 'open','cmd.exe', ExecuteOrder, 0, SW_HIDE);
      finally
        FreeMem(ExecuteOrder);
      end;
    Ca a l'air de marcher...
    What d'you think ?

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Alors, ça fonctionne avec les adresses IP :
    netsh int ip set address name = "' + ListComboBoxNetworkCard.Items[ListComboBoxNetworkCard.ItemIndex] + '" source = dhcp

    mais pas avec les DNS :
    netsh interface ipv4 set dnsservers name = "' + ListComboBoxNetworkCard.Items[ListComboBoxNetworkCard.ItemIndex] + '" source = dhcp

    En plus, la même commande fonctionne bien sur les DNS dans l'invite de commandes

    Peut-être faut il valider quelque chose entre les deux commande ?
    Moi, j'envoie les deux l'une après l'autre.

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    avril 2023
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : avril 2023
    Messages : 165
    Points : 67
    Points
    67
    Par défaut
    Ok, laissez tomber. C'est moi qui débloque grave.
    Donc ça marche très bien avec :

    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
     
     
      S := '/C "netsh int ip set address name = "' + ListComboBoxNetworkCard.Items[ListComboBoxNetworkCard.ItemIndex] + '" source = dhcp"';
      GetMem(ExecuteOrder, (Length(S) + 1) * SizeOf(WideChar));
     
      try
        StringToWideChar(S, ExecuteOrder, Length(S) + 1);
        ShellExecute(0, 'open','cmd.exe', ExecuteOrder, 0, SW_HIDE);
      finally
        FreeMem(ExecuteOrder);
      end;
     
      S := '/C "netsh interface ipv4 set dnsservers name = "' +  ListComboBoxNetworkCard.Items[ListComboBoxNetworkCard.ItemIndex] + '" source = dhcp"';
      GetMem(ExecuteOrder, (Length(S) + 1) * SizeOf(WideChar));
     
      try
        StringToWideChar(S, ExecuteOrder, Length(S) + 1);
        ShellExecute(0, 'open','cmd.exe', ExecuteOrder, 0, SW_HIDE);
      finally
        FreeMem(ExecuteOrder);
      end;
    Merci à tous.tes.

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

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/01/2013, 10h40
  2. tutoriel : La programmation de l'API Windows en C++ par Bob
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 19
    Dernier message: 21/06/2008, 14h34
  3. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  4. [API Windows] Polices de caractères disponibles
    Par bebeours dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/11/2003, 08h28
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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