Jump to content


Photo

Configurando IP, Gateway, Sub-Mascara, DNS Primario y DNS Alterno desde Delphi


  • Please log in to reply
5 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 11 October 2009 - 10:13 AM

Aquí os dejo dos funciones basados en unas que encontré en la red que no recuerdo donde, adaptados para mejor funcionamiento, las funciones son ConfiguraIP() y AsignarDNS(), sirven para configurar/cambiar/limpiar el IP, Sub-Mascara, Puerta de enlace (gateway) y asignar los DNS primarios y secundarios (alterno), aquí el código:



delphi
  1. uses ComObj, ActiveX, UrlMon;
  2.  
  3. ...
  4.  
  5. // ======================================================================
  6. // ConfiguraIP()
  7. // Asigna IPAddress, Gateway y Subnetmask via WMI
  8. // Argumentos …
  9. // AIpAddress – si el valor es NULL o 'DHCP' entonces DHCP está HABILITADA
  10. // de lo contrario será asignada una IP estática.
  11. // AGateWay – [Opcional] Si no se escribe GATEWAY no se modifica.
  12. // SubnetMask – [Opcional] si lo omitimos por defecto será '255.255.255.0'.
  13. //
  14. // AsignarDNS()
  15. // Asignmos los servidores DNS via WMI
  16. // Argumentos …
  17. // APrimaryDNS – Si lo asignamos NULL entonces se limpiará la lista.
  18. // AAlternateDNS – [Opcional]
  19. //
  20. // Valores de retornos …
  21. // 0 Se completó con éxito, no requiere reinicio.
  22. // 1 Se completón con éxito, requiere reinicio.
  23. // -1 Error OLE desconocido.
  24. // 64 Método no soportado en esta plataforma.
  25. // 65 Fallo desconocido.
  26. // 66 Sub-Mascara Inválido.
  27. // 67 Se produjo un error al procesar una instancia que fue devuelto.
  28. // 68 Parámetros de entrada inválido.
  29. // 69 Se especificó más de 5 GATEWAY.
  30. // 70 Dirección IP inválido.
  31. // 71 Dirección GATEWAY inválido.
  32. // 72 Se produjo un error al acceder al Registro de la información.
  33. // 73 Nombre de Dominio inválido.
  34. // 74 Nombre del HOST inválido.
  35. // 75 No se definió un servidor WIN primario o secundario.
  36. // 76 Archivo inválido.
  37. // 77 Ruta del sistema inválido.
  38. // 78 Falló copiado de archivo.
  39. // 79 Parámetro de seguridad inválido.
  40. // 80 Imposible configurar el servicio TCP/IP.
  41. // 81 Imposible configurar el servicio DHCP.
  42. // 82 No se puede renovar la concesión DHCP.
  43. // 83 No se puede liberar DHCP.
  44. // 84 IP no habilitado en el adaptador.
  45. // 85 IPX no habilitado en el adaptador.
  46. // 86 Error limitación de errores Frame/network.
  47. // 87 Tipo frame inválido.
  48. // 88 Número NETWORK inválido.
  49. // 89 Número NETWORK duplicado.
  50. // 90 Parámetros fuera del límite.
  51. // 91 Acceso denegado.
  52. // 92 Falta de memoria.
  53. // 93 Ya existe.
  54. // 94 Ruta, archivo, o objecto no encontrado.
  55. // 95 Imposible notificar servicio.
  56. // 96 Imposible notificar servicio DNS.
  57. // 97 Interfaz no configurable.
  58. // 98 No todos los servicios DHCP pueden ser liberados o renovar.
  59. // 100 DHCP no habilitado en adaptador.
  60. // ======================================================================
  61.  
  62. // ==================================================================
  63. // IP Address,Gateway y Subnet Mask
  64. // EnableStatic toma un array de cadenas como parámetro
  65. // para las direcciones.
  66. // ==================================================================
  67.  
  68. function ConfiguraIP(const AIpAddress : string;
  69. const AGateWay : string = '';
  70. const ASubnetMask : string = '') : integer;
  71. var Retvar : integer;
  72.     oBindObj : IDispatch;
  73.     oNetAdapters,oNetAdapter,
  74.     oIpAddress,oGateWay,
  75.     oWMIService,oSubnetMask : OleVariant;
  76.     i,iValue : longword;
  77.     oEnum : IEnumvariant;
  78.     oCtx : IBindCtx;
  79.     oMk : IMoniker;
  80.     sFileObj : widestring;
  81. begin
  82.   Retvar := 0;
  83.   sFileObj := 'winmgmts:\\.\root\cimv2';
  84.  
  85.   // Creamos parámetro OLE [IN}
  86.   oIpAddress := VarArrayCreate([1,1],varOleStr);
  87.   oIpAddress[1] := AIpAddress;
  88.   oGateWay := VarArrayCreate([1,1],varOleStr);
  89.   oGateWay[1] := AGateWay;
  90.   oSubnetMask := VarArrayCreate([1,1],varOleStr);
  91.  
  92.   if ASubnetMask = '' then
  93.     oSubnetMask[1] := '255.255.255.0'
  94.   else
  95.     oSubnetMask[1] := ASubnetMask;
  96.  
  97.   // Conectando a WMI – Emulando la API GetObject()
  98.   OleCheck(CreateBindCtx(0,oCtx));
  99.   OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));
  100.   OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));
  101.   oWMIService := oBindObj;
  102.  
  103.   oNetAdapters := oWMIService.ExecQuery('Select * from ' +
  104.   'Win32_NetworkAdapterConfiguration ' +
  105.   'where IPEnabled=TRUE');
  106.   oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;
  107.  
  108.   while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin
  109.     try
  110.     // asignar por DHCP ? (Gateway y Subnet ignorados)
  111.       if (AIpAddress = '') or SameText(AIpAddress,'DHCP') then
  112.       Retvar := oNetAdapter.EnableDHCP
  113.     // asiganr via STATIC ?
  114.       else begin
  115.       Retvar := oNetAdapter.EnableStatic(oIpAddress,oSubnetMask);
  116.     // cambiar Gateway ?
  117.       if (Retvar = 0) and (AGateWay <> '') then
  118.       Retvar := oNetAdapter.SetGateways(oGateway);
  119.  
  120.     // *** Aquí es donde tenemos que acualizar
  121.     // *** algún tipo de red mapeadas de recursos ***
  122.   end;
  123.   except
  124.     Retvar := -1;
  125.   end;
  126.  
  127.   oNetAdapter := Unassigned;
  128. end;
  129.  
  130.   oGateWay := Unassigned;
  131.   oSubnetMask := Unassigned;
  132.   oIpAddress := Unassigned;
  133.   oNetAdapters := Unassigned;
  134.   oWMIService := Unassigned;
  135.   Result := Retvar;
  136. end;
  137.  
  138. // ====================================================
  139. // asignar servidores DNS
  140. // aquí es donde asignamos los DNS primarios y alternos
  141. // se puede colocar una lista de todas las DNS posibles
  142. // pero es recomendable usar 1 dirección tanto para el
  143. // primario como alterno.
  144. // ====================================================
  145.  
  146. function AsignarDNS(const APrimaryDNS : string;
  147. const AAlternateDNS : string = '') : integer;
  148. var Retvar : integer;
  149.   oBindObj : IDispatch;
  150.   oNetAdapters,oNetAdapter,
  151.   oDnsAddr,oWMIService : OleVariant;
  152.   i,iValue,iSize : longword;
  153.   oEnum : IEnumvariant;
  154.   oCtx : IBindCtx;
  155.   oMk : IMoniker;
  156.   sFileObj : widestring;
  157. begin
  158.   Retvar := 0;
  159.   sFileObj := 'winmgmts:\\.\root\cimv2';
  160.   iSize := 0;
  161.  
  162.   if APrimaryDNS <> '' then inc(iSize);
  163.   if AAlternateDNS <> '' then inc(iSize);
  164.  
  165. // creando parámetros OLE [IN}
  166.   if iSize > 0 then begin
  167.     oDnsAddr := VarArrayCreate([1,iSize],varOleStr);
  168.     oDnsAddr[1] := APrimaryDNS;
  169.   if iSize > 1 then oDnsAddr[2] := AAlternateDNS;
  170. end;
  171.  
  172. // Conectar a WMI – Emulando la API GetObject()
  173.   OleCheck(CreateBindCtx(0,oCtx));
  174.   OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));
  175.   OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));
  176.   oWMIService := oBindObj;
  177.  
  178.   oNetAdapters := oWMIService.ExecQuery('Select * from ' +
  179.   'Win32_NetworkAdapterConfiguration ' +
  180.   'where IPEnabled=TRUE');
  181.   oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;
  182.  
  183.   while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin
  184.     try
  185.       if iSize > 0 then
  186.         Retvar := oNetAdapter.SetDNSServerSearchOrder(oDnsAddr)
  187.       else
  188.         Retvar := oNetAdapter.SetDNSServerSearchOrder();
  189.     except
  190.         Retvar := -1;
  191.   end;
  192.  
  193.   oNetAdapter := Unassigned;
  194. end;
  195.  
  196.   oDnsAddr := Unassigned;
  197.   oNetAdapters := Unassigned;
  198.   oWMIService := Unassigned;
  199.   Result := Retvar;
  200. end;



Su forma de uso sería:

Asignando IP y DNSs



delphi
  1. ConfiguraIP({asignamos el IP}, {Asignamos el Gateway}, {asignamos la sub-mascar}):
  2.  
  3. //Ejemplo
  4. ConfiguraIP('143.1.21.100', '143.1.21.101', ''); //dejando la Sub-Mascara como nulo por defecto coloca 255.255.255.0
  5.  
  6. AsignarDNS({DNS primario}, {DNS Alterno})
  7.  
  8. //Ejemplo
  9. AsignarDNS('200.1.100.22', '196.110.8.13'); //Si sólo queremos el DNS primario dejamos el alterno Nulo.



Limpiando IP y DNS



delphi
  1. //Para deshabilitar o limpiar todos los IP y DNS
  2.  
  3. ConfiguraIP('','',''); //dejando nulo todos se deshabilita
  4. AsignarDNS('',''); //dejando nulo todos se deshabilita



Eso esto es todo, sólo resta que algún compañero lo pruebe tanto en 2000/XP/Vista y nos comente los resultados ;). Qué lo disfruten.

Saludos.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 11 October 2009 - 10:19 AM

Muy interesante amigo, gracias por el aporte.

Saludos
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 11 October 2009 - 11:56 AM

Por aquí ya hablamos sobre esto mismo:
http://www.delphiacc...pic=381.msg5735
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 11 October 2009 - 12:05 PM

Por aquí ya hablamos sobre esto mismo:
http://www.delphiacc...pic=381.msg5735


Ah mierda, cómo me falla la memoria :$ :$
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 11 October 2009 - 12:44 PM


Por aquí ya hablamos sobre esto mismo:
http://www.delphiacc...pic=381.msg5735


Ah mierda, cómo me falla la memoria :$ :$


Es mejor pecar  por exceso y no por defecto.
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 11 October 2009 - 06:24 PM

Ah mierda, cómo me falla la memoria :$ :$

No era un reproche :D solo una observación  (y)
  • 0




IP.Board spam blocked by CleanTalk.