IP Manager

Signaler
Messages postés
8
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
24 octobre 2010
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour a tous,

Alors voila: en fait je suis en train de faire un "IP Manager"... fenetre qui permet d'afficher son Adresse IP en un clic... ca c'est ok, je me suis fait une belle fenetre.
On clic, ca marche.

Par contre, j'aimerais en faite acceder directement au meme possibilité que la fenetre parametre TCP/IP pour modifier soit meme sont adresse avec le masque ou cliquer pour obtenir "automatiquement" une adresse IP.

Quelqu'un pourrait m'aider a inserer ca dans mon projet.




Merciiiiiiii

11 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

Regarde par du côté de IPHelper (Windows 2000 mini) sur la msdn, tu as par exemple IpRenewAddress.

Ou tu peux utiliser WMI et la classe Win32_NetworkAdapterConfiguration.
Messages postés
8
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
24 octobre 2010

Hello,

Merci pour ta réponse (ainsi que pour le MP de Glarys)

Après beaucoup de recherche j'ai trouvé quelques code sources (rt15 ton IpHelper semblerai exactement ce que je cherche)

Par contre il m'es impossible d'intégrer aucun des codes sources trouvé, même le faire en exe seul. Quand je l'insere il me trouve des tonnes d'erreur et impossible de les compiler. J'suis débutant en la matière (mes cours remontent a trop loin) alors je vous explique même pas la galère. Je nage en eau trouble

Est ce que une âme charitable serait capable de m'insérer ça dans mon projet existant??
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Je vais jeter un coup d'oeil. Mais en attendant, peux tu poster ici le contenu du MP de Glarys s'il te plait ?
Messages postés
8
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
24 octobre 2010

Ca dans ma fenetre actuelle faite sous Visual C++ serait l'ideal:

http://www.csharpfr.com/codes/MODIFIER-CONFIGURATION-RESEAU-LOCAL_45374.aspx
Messages postés
8
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
24 octobre 2010

me renvoi sur des Newsgroup, je sais pas si j'ose les mettres ici??
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
En fait Glarys est un des nombreux comptes d'un sombre personnage qui a une forte tendance a poster des liens vers des newsgroups et a rabacher "Ca existe depuis XX années" sans aider les gens le moins du monde. Son but semble être au moins de faire partir tout le monde de CodeS-SourceS.

Les admins suppriment pas mal de ses messages sur le forum, mais on peut pas deviner ce qu'il envoie par MP...

Donc si tu pouvais copier coller ici son message, ça m'aiderait à cerner l'étendu des dégâts...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Le lien que tu as donné -> L'interface est "sympa", mais le code derrière est particulièrement moche : appel à netsh, une commande DOS... Je vais faire un premier exemple en console. Je vais voir si je fais une interface graphique par la suite.
Messages postés
8
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
24 octobre 2010

J'veux pas semer la zizanie... mais bon voici son message:

Message :
Si c'est sous Windows, ça se fait facilement avec les apis Win32.
Dans ce cas, tu peux demander sur le newsgroup professionnel des apis Win32 :
news://nntp.aioe.org/fr.comp.os.ms-windows.programmation
ou
http://tinyurl.com/cvd7wv par Google
(C et C++, Microsoft)

===============================================

Pour le netsh, j'ai vu ca, je pensais que c'était obligatoire.

En fait j'viens de tomber sur le GetmyIP, code ressemblant au miens sous VC++... j'aurais aimer combiner celui ci avec le lien au dessus et par la suite encore ajouter des fonction que j'ai dans un bouquin.. donc une interface graphique aurait été sympa... merci de ton aide.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Merci.

Bon il nous enlève les gens, mais au moins il reste poli. Au moins.

GetMyIp, si c'est celui là, c'est du winsock. Donc tu peux lire l'IP mais pas la changer ou la renouveler.

J'ai fait quelques essais avec IPHelper. Mais bon le problème avec le renew c'est que le dhcp a tendance à refiler la même adresse... Donc je suis pas sûr à 100% que ça fonctionne !

D'autre part, mon code ne fonctionne a coup sûr que s'il n'y a une carte réseau sur le PC, et qu'une IP sur cette carte.

Application console. Pour compiler sous gcc, ajouter -nostartfiles -nodefaultlibs -nostdlib -ffreestanding dans les options du lieur.
Pour compiler sous VC, s'arranger pour que le lieur ignore toutes les librairies par défaut (/nodefaultlib).
Sous VC, en cas d'erreur LNK2001 : __chkesp symbole externe non résolu -> Enlever /GZ des options de compilation
#ifdef UNICODE
#define _UNICODE
#endif /* UNICODE */

#include <windows.h>
#include 
#include <tchar.h>

/**
 * Alloue une zone mémoire en utilisant VirtualAlloc
 *
 * @param nSize Taille de la zone à allouer
 * @return Pointeur sur la zone allouée
 */
void* __stdcall Mem_Alloc(const DWORD nSize)
{
  return VirtualAlloc(NULL, nSize,
                      MEM_RESERVE | MEM_COMMIT,
                      PAGE_READWRITE);
}

/**
 * Libère une zone mémoire allouée avec Mem_Alloc
 *
 * @param Pointeur sur la zone allouée
 */
void __stdcall Mem_Free(void *lpAddress)
{
  VirtualFree(lpAddress, 0, MEM_RELEASE);
}

/**
 * Affiche le texte indiqué dans la console
 *
 * @param lpText Texte à écrire dans la console
 * @return FALSE en cas de problème
 */
BOOL __stdcall Con_WriteLn(const TCHAR *lpText)
{
  DWORD nWritten;   /* Réception du nombre de caractère écris                 */
  char *lpOemText;  /* Texte traduit en OEM                                   */
  DWORD nSize;      /* Taille du texte à écrire                               */
  BOOL bResult;

  /* Traduction des caractère àùéè... */
  nSize = lstrlen(lpText);

  /* On aura un \n en plus */
  nSize++;

  lpOemText = (char*)Mem_Alloc(nSize);
  CharToOem(lpText, lpOemText);
  lstrcatA(lpOemText, "\n");

  bResult = WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), lpOemText,
                      nSize, &nWritten, NULL);

  Mem_Free(lpOemText);
  return bResult;
}

/**
 * Affiche un message d'erreur correspondant à la dernière erreur Win32
 */
DWORD __stdcall Sys_ShowLastError()
{
  DWORD nLastError;           /* Numéro de l'erreur                           */
  LPTSTR lpMessageBuffer;     /* Récupération du message                      */

  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  /* Affichage du message */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

/**
 * Convertit un char en TCHAR
 */
void __stdcall Str_AnsiToTChar(TCHAR* lpBuffer, int nBufferCharCount,
                               char* lpStringToConvert)
{
#ifdef UNICODE
  MultiByteToWideChar(CP_ACP, 0,
                      lpStringToConvert, -1,
                      (WCHAR*)lpBuffer, nBufferCharCount);
#else
  lstrcpy(lpBuffer, lpStringToConvert);
#endif
}

/**
 * Renvoie les infos sur les adapters
 *
 * Après utilisation, il faut libérer les infos retournées avec Mem_Free.
 * Renvoie NULL en cas d'erreur.
 */
IP_ADAPTER_INFO* __stdcall RetrieveAdaptersInfo()
{
  DWORD nOutBufLen;             /* Taille de la zone à allouer pour les infos */
  PIP_ADAPTER_INFO lpResult;

  /* Récupération de la taille à allouer et allocation */
  nOutBufLen = 0;
  GetAdaptersInfo(NULL, &nOutBufLen);
  lpResult = (PIP_ADAPTER_INFO)Mem_Alloc(nOutBufLen);

  /* Récupération des infos */
  if (GetAdaptersInfo(lpResult, &nOutBufLen) != NO_ERROR)
  {
    Mem_Free(lpResult);
    lpResult = NULL;
  }

  return lpResult;
}

/**
 * Renvoie les infos sur l'interface
 *
 * Après utilisation, il faut libérer les infos retournées avec Mem_Free.
 * Renvoie NULL en cas d'erreur.
 */
IP_INTERFACE_INFO* __stdcall RetrieveInterfaceInfo()
{
  DWORD nOutBufLen;             /* Taille de la zone à allouer pour les infos */
  PIP_INTERFACE_INFO lpResult;

  /* Récupération de la taille à allouer et allocation */
  nOutBufLen = 0;
  GetAdaptersInfo(NULL, &nOutBufLen);
  lpResult = (PIP_INTERFACE_INFO)Mem_Alloc(nOutBufLen);

  /* Récupération des infos */
  if (GetInterfaceInfo(lpResult, &nOutBufLen) != NO_ERROR)
  {
    Mem_Free(lpResult);
    lpResult = NULL;
  }

  return lpResult;
}

/**
 * Affiche la première adresse IP de l'adapter
 *
 * Attention, un adapter peut avoir plusieurs adresses.
 */
void __stdcall DisplayAdapterIp(IP_ADAPTER_INFO* lpAdaptersInfo)
{
  TCHAR lpBuffer[64];

  Str_AnsiToTChar(lpBuffer, 64, lpAdaptersInfo->IpAddressList.IpAddress.String);
  /* lstrcat(lpBuffer, _T("\n")); */
  Con_WriteLn(lpBuffer);
}

/**
 * Main
 */
int __cdecl mainCRTStartup()
{
  PIP_ADAPTER_INFO lpAdaptersInfo1;   /* Infos les adapters avant changement  */
  PIP_ADAPTER_INFO lpAdaptersInfo2;   /* Infos les adapters après changement  */
  PIP_INTERFACE_INFO lpInterfaceInfo; /* Infos sur l'interface                */
  DWORD nReturnValue;                 /* Vérification des appels              */
  int nResult;

  nResult = 1;

  /* Récupération des infos sur les adapters */
  lpAdaptersInfo1 = RetrieveAdaptersInfo();
  if (! lpAdaptersInfo1)
  {
    Con_WriteLn(_T("Echec de la récupération des infos sur les adapters"));
    goto the_end;
  }

  /* Affichage de la première IP du premier adapter */
  DisplayAdapterIp(lpAdaptersInfo1);

  /* Récupération des infos sur l'interface */
  lpInterfaceInfo = RetrieveInterfaceInfo();
  if (! lpInterfaceInfo)
  {
    Con_WriteLn(_T("Echec de la récupération des infos sur l'interface"));
    goto free_adapter_info1;
  }

  /* Renouvellement de l'IP */
  nReturnValue = IpRenewAddress(&lpInterfaceInfo->Adapter[0]);
  if (nReturnValue != NO_ERROR)
  {
    Con_WriteLn(_T("Erreur du renew"));
    SetLastError(nReturnValue);
    Sys_ShowLastError();
    goto free_adapter_info2;
  }

  /* Récupération des infos sur les adapters */
  lpAdaptersInfo2 = RetrieveAdaptersInfo();
  if (! lpAdaptersInfo2)
  {
    Con_WriteLn(_T("Echec de la récupération des infos sur les adapters"));
    goto free_interface_info;
  }

  /* Nouvel affichage de l'IP */
  DisplayAdapterIp(lpAdaptersInfo2);

  nResult = 0;

free_adapter_info2:
  Mem_Free(lpAdaptersInfo2);
free_interface_info:
  Mem_Free(lpInterfaceInfo);
free_adapter_info1:
  Mem_Free(lpAdaptersInfo1);
the_end:
  /* ExitProcess nécessaire car sinon c'est un ExitThread */
  ExitProcess(nResult);

  /* Pour esquiver le warning */
  return 0;
}
Messages postés
8
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
24 octobre 2010

Wow, rapidité, efficacité!

Par contre j'ai 2 erreurs, je fait quelques chose de faux

main.cpp: In function `DWORD Sys_ShowLastError()':
main.cpp:149: error: invalid conversion from `void*' to `CHAR*'
main.cpp:149: error: initializing argument 5 of `DWORD FormatMessageA(DWORD, const void*, DWORD, DWORD, CHAR*, DWORD, char**)'

make.exe: *** [main.o] Error 1
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMessageBuffer, 0, NULL);