begin process at 2012 05 28 15:53:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

Changer son adresse IP (sans redémarrer et sous XP/Seven)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Changer son adresse IP (sans redémarrer et sous XP/Seven)

jeudi 4 février 2010 à 10:21:54 | Changer son adresse IP (sans redémarrer et sous XP/Seven)

ledaziarn

Bonjour a tous,


Mon problème parait simple mais je n’aie pas trouvé de réponse, en tout cas pas qui répondent a ma problématique


Pour simplifier les choses, je souhaite avoir une fonction, que j’appelle avec comme paramètres l’interface réseaux(ou l’ancienne IP) et une nouvelle IP Masque de sous réseaux et Gateway. Cette fonction doit m’affecter immédiatement cette IP a cette carte réseaux. Je veux être bloqué durant cette affectation.
Et les points qui me posent problème :
- Je veux changer d’IP et non pas en affecter une supplémentaire
- Je ne veux pas redémarrer
- Cela doit marcher sous XP, Vista et Seven


Pour le langage j’ai posté en C, mais si c’est du C++ je m’arrangerais sans problème .


Je possède sous XP une solution qui me convient :


Code C/C++ :
APP_DWORD ChangeIpAddress(APP_DWORD dwOldIpAddr,APP_DWORD dwNewdIpAddr,APP_DWORD dwSubnetMask,APP_DWORD dwGatway)
{
   APP_DWORD            Error;
   HINSTANCE            HndLib;
   PSETADAPTERIPADDRESS SetAdapterIpAddress;
   APP_CHAR             AdapterGUID[50];


   /*First : find IP AdapterGUID*/
   OS_MEMSET(AdapterGUID,0 , 50);
   GetGuuiInterfaceName(AdapterGUID, dwOldIpAddr);

   Error = ERROR_NOT_SUPPORTED;

   /* Chargement de la DLL */
   HndLib = (HINSTANCE)LoadLibrary(TEXT("iphlpapi.dll"));
   if(HndLib != NULL)
   {
      /* Récupération de l'adresse de la procédure */
      SetAdapterIpAddress = (PSETADAPTERIPADDRESS)GetProcAddress(HndLib,"SetAdapterIpAddress");
      if(SetAdapterIpAddress != NULL)
      {
            /* Appel de la procédure */
            Error = SetAdapterIpAddress(AdapterGUID,0,dwNewdIpAddr,dwSubnetMask,dwGatway);
      }
   }

   return Error;
}




Cette solution a deux problème : elle utilise une fonction non documentée de Windows (ce qui n’est pas beau !) et sous Seven (je n’ai pas essayé sous Vista) elle ajoute une IP au lieu de me la changer, de plus elle n’est pas bloquante .

Les solutions que j’ai commencé à trouver sur le Net :
- La registry : problème cela demande un reboot à priori
- WMI mais ca a l’air un peux compliquer a mettre en place juste pour cela. De plus je voudrais éviter d’avoir à installer un SDK supplémentaire. Et je n'ai trouver aucun exemple simple (tuto tres basique du style: tu click la )
- Appeler netsh : crée un process est attendre qu’il ait finit. Le problème c’est que la je dois devenir administrateur. Or sous Seven cela signifie une boite de dialogue se que je ne veux pas ! (ou alors elle doit n’apparaitre qu’une seul foi pour toute l’application, même âpres des reboot PC).


Juste pour rassurer : non ce n’est pas un virus si je souhaite empêcher la fenêtre de dialogue a chaque démarrage de mon application c’est que celle-ci peut être placée dans le menu démarrer et se trouver sur des pc sans écran.

Désolé ce message st un peut long mais je voulais faire gagner du temps en montrant les piste déjà abordées .


Merci d’avance

lundi 8 février 2010 à 22:39:04 | Re : Changer son adresse IP (sans redémarrer et sous XP/Seven)

Zestyr

Salut, comme toi je recherche aussi le moyen de pouvoir changer son ip aisément. J'ai regardé ton code et je voudrais savoir à quoi correspondent les types APP_DWORD, APP_CHAR et PSETADAPTERIPADDRESS. Tu pourrais évoquer les include et expliquer à quoi correspondent les arguments ?

Merci et bonne chance

mardi 9 février 2010 à 09:46:51 | Re : Changer son adresse IP (sans redémarrer et sous XP/Seven)

ledaziarn

Salut, avant la solution ci dessus ne marche comme je souhaite que sous xp !

APP_DWORD est un unsigned long
APP_CHAR est un char
PSETADAPTERIPADDRESS est un type windows

popur que cela marche il faut ajouter l'include
#include <iphlpapi.h>


SetAdapterIpAddress:

DWORD SetAdapterIpAddress( char *pszAdapGUID,
DWORD dwDHCP,
DWORD dwIP,
DWORD dwMask,
DWORD dwGateway );

A noté que le parametre pszAdapGUID correspond a l'interface de ta carte reseaux


La fonction GetGuuiInterfaceName est une fonction a moi pour retrouver cette interface en focntion d'une IP. (j'utilse GetAdaptersInfo)


Sinon la reponse que j'ai trouvé pour xp et seven est netsh, je ne suis pas super content mais j'ai rien trouvait d'autre


Code C/C++ :
APP_DWORD ChangeIpAddress(APP_LPCHAR lpsInterfaceName,APP_DWORD dwNewdIpAddr,APP_DWORD dwSubnetMask,APP_DWORD dwGatway)
{

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    APP_CHAR szCmdline[2048] = {0};
    APP_CHAR szWindowsCardName[2048] = {0};

    APP_DWORD dwResult = 0;

    struct in_addr ip;
    struct in_addr mask;
    struct in_addr gateway;
    int nbWrite = 0;
    ip.S_un.S_addr = dwNewdIpAddr;
    mask.S_un.S_addr = dwSubnetMask;
    gateway.S_un.S_addr = dwGatway;


    /* 
    Find the adapter name: the one from windows (eg "LOCAL NETOWRK 1") 
    this one can be find from the registry, on XP, VISTA and SEVEN : 
    SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\
    */

    if(1 != getWindowsAdapterName(lpsInterfaceName, szWindowsCardName)){
    
      return OS_NOT_OK;      
    }

    
    nbWrite  = sprintf(szCmdline, "netsh interface ip set address name=\"%s\" static ", szWindowsCardName);
    nbWrite  += sprintf(szCmdline + nbWrite, " %s", inet_ntoa( ip));
    nbWrite  += sprintf(szCmdline + nbWrite, " %s", inet_ntoa( mask));

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW ;
    si.wShowWindow = SW_HIDE;

    ZeroMemory( &pi, sizeof(pi) );

    
    CreateProcess( NULL, 
                  szCmdline, 
                  NULL, 
                  NULL,
                  FALSE, 
                  REALTIME_PRIORITY_CLASS , 
                  NULL, 
                  NULL, 
                  &si, 
                  &pi);


   dwWaitIpChange = (APP_DWORD)(pi.hProcess);

   if(dwWaitIpChange != 0){

     WaitForSingleObject( (HANDLE)dwWaitIpChange, INFINITE );
     GetExitCodeProcess((HANDLE)dwWaitIpChange, &dwResult);

     CloseHandle( (HANDLE)dwWaitIpChange );
     CloseHandle( pi.hThread );

     dwWaitIpChange= 0;

     if(dwResult != 0){

       return OS_NOT_OK;
     }else{
       return OS_OK;
     }
  }
   return OS_NOT_OK;
}



Voila j'espere t'avoir aidé
mardi 9 février 2010 à 12:17:36 | Re : Changer son adresse IP (sans redémarrer et sous XP/Seven)

Zestyr

Tu compile avec quoi ? J'ai tester sous code::blocks en incluant windows.h et les types restent non-déclarés. Merci encore


La conerie est humaine
mardi 9 février 2010 à 13:31:34 | Re : Changer son adresse IP (sans redémarrer et sous XP/Seven)

ledaziarn

Je compile sous visual c++ 6

tu a ajouter :

#include <iphlpapi.h>

APP_DWORD et APP_CHAR son des types interne a mon projet, remplace les par "unsigned long" et "char"
mardi 9 février 2010 à 13:55:24 | Re : Changer son adresse IP (sans redémarrer et sous XP/Seven)

Zestyr

J'en été sur
Merci, je vais tester ça

La conerie est humaine


Cette discussion est classée dans : problème, app, ip, dword, seven


Répondre à ce message

Sujets en rapport avec ce message

Problème de résolution d'adresse http en IP [ par SLicTa ] Bonjour, Je suis sur un projet C++, dans lequel je dois résoudre une adresse http et en obtenir l'IP, pour ensuite m'y connecter grâce au socket.Mon p Aidez-moi... Problème d'IP (CPP) [ par WindPowa ] (C++) Comment récupérer, et stocker dans une chaine de caractères (CString) l'adresse IP d'un serveur Web quand on va sur une page ? Voici les raisons Problème avec ios::app [ par kattig ] Bonjour tout le monde,J'ai un petit soucis avec ios::app ou avec la fonction scanf.Voici une partie de mon code:#include... fstream f; f.open("fichier Problème de cast [ par ksandy ] Bonjour, J'ai une interface graphique de communication série. Pour cela j'ai besoin de renseigner la vitesse de communication (Baud Rate). Mon port s' Problème avec WriteProcessMemory() .... [ par MorbhAck ] Hello World !J'ai un ptit problème avec la fonction WriteProcessMemory().mon code est le suivant :    HWND Wnd;                          // Hwnd de no Problème de Thread [ par F0ra ] bonjourje réalise une application en openGl, et j'ai besoin d'un Threadpourquoi mon Thread ne s'exécute pas ?merci beaucoup@+ #include "main.h"DWORD W Adresse ip [ par thegame88 ] Bonjour à tous,Débutant dans la programmation réseau en C, je voudrais faire un petit programme qui permet de faire un ping.Mon problème c'est que je Incrémentation d'une adresse IP [ par eleonoraa ] Bonsoir tout le monde :),Alors j'ai un script shell (bash) sous unix à faire est enfaite j'ai un petit problème je cherche dans une boucle for a incré problème avec un socket bloquant [ par Space_Monkey ] Bonjour,Après une journée de recherches, je ne suis pas parvenu à identifier clairement mon problème, j'ai donc décider de poster.J'utilise depuis lon Hook problème ne voit pas toutes les dll chargé ! [ par Booster ] Bonsoir à tous, J'ai un petit problème l'eau, l'homme, qu'elle</b&


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,763 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales