2012-09-25 13 views
5

¿Cómo puedo establecer mi dirección de IP programáticamente?¿Cómo establecer mi dirección de IP programáticamente?

Mi aplicación está comprobando que, utilizando el código de DelphiTricks (aunque no estoy seguro de si el código de About.com no podría ser mejor)

Quiero ser capaz de establecer la dirección de programación para realizar pruebas. Y (no sé si esto es importante), quiero poder hacerlo aunque no esté conectado a ninguna red (en una computadora portátil, en un tren).

+1

Respuesta corta: A menos que esté haciendo un trabajo de nivel de sistema en un entorno conocido, normalmente ** no puede **. La gran mayoría de los sistemas reciben una dirección a través de un servidor [DHCP] (http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol) y la eliminación aleatoria de la dirección IP puede ocasionar la pérdida de la conexión. Si conoce el entorno en el que se encuentra y que * puede * hacer esto con seguridad, tendrá que darnos algo para trabajar con ella, ya saben, los detalles menores como qué sistema operativo y qué versión de él. ¿Tiene acceso de administrador/raíz? Lo básico –

+1

¿Quiere decir cambiar el que ve su aplicación? Una simple compilación condicional debería hacer eso. simplemente cambie el código que obtiene la ip para obtener un conjunto. –

Respuesta

9

Para cambiar la dirección IP de su adaptador de red, puede utilizar el método EnableStatic de la clase WMI Win32_NetworkAdapterConfiguration o el método AddIPAddress WinApi.

Pruebe esta muestra que utiliza el WMI.

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, 
    ActiveX, 
    Variants, 
    ComObj; 

procedure SetStaticIpAddress(const NetworkCard, IPAddress, Mask :string); 
const 
    WbemUser =''; 
    WbemPassword=''; 
    WbemComputer='localhost'; 
    wbemFlagForwardOnly = $00000020; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService  : OLEVariant; 
    FWbemObjectSet : OLEVariant; 
    FWbemObject  : OLEVariant; 
    FOutParams  : OLEVariant; 
    vIpAddress  : OLEVariant; 
    vMask   : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue   : LongWord; 
begin 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); 

    FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT * FROM Win32_NetworkAdapterConfiguration Where Description="%s"',[NetworkCard]),'WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    if oEnum.Next(1, FWbemObject, iValue) = 0 then 
    begin 
    vIpAddress := VarArrayCreate([0, 0], varVariant); 
    vIpAddress[0]:= IPAddress; 
    vMask := VarArrayCreate([0, 0], varVariant); 
    vMask[0]:= Mask; 
    FOutParams:=FWbemObject.EnableStatic(vIpAddress, vMask); 
    // 0 - Successful completion, no reboot required 
    // 1 - Successful completion, reboot required 
    Writeln(Format('ReturnValue %s',[FOutParams])); 
    end 
    else 
    Writeln('Network card not found'); 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0'); 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+3

+1, qué pasa con ['ShellExecute'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153 (v = vs.85) .aspx) algo así como [' this' ] (http://serverfault.com/a/39670/98231)? – TLama

+1

Sí, esa es una tercera opción válida :) – RRUZ

+0

+1 a ambos. @Rudy, estoy intentando el código ahora. Una pregunta estúpida, sin embargo, ¿cómo sé qué valor dar a NetworkCard? – Mawg