El único requisito es que nuestro router tenga UPnP (lo mayoría de los modernos lo tienen) y que este habilitado (suele estar por defecto).
El código:
delphi
program Openport; {$APPTYPE CONSOLE} uses Windows, SysUtils, Variants, ComObj, ActiveX; var NATUPnP: OleVariant; Ports: Variant; Table: IUnknown; Enum : IEnumVARIANT; Item: OleVariant; Fetched: Cardinal; begin Writeln('Openport 0.1'); Writeln; CoInitialize(nil); try try NATUPnP:= CreateOleObject('HNetCfg.NATUPnP'); Ports:= NATUPnP.StaticPortMappingCollection; if not ((ParamCount = 1) and (Uppercase(ParamStr(1)) = '-L')) then if (ParamCount <> 5) then begin Writeln('Openport [-l] [TCP/UDP Remoto IP Local Descripcion]'); Writeln; Writeln; Exit; end else begin Ports.Add(StrToInt(ParamStr(2)),Uppercase(ParamStr(1)), StrToInt(ParamStr(4)),ParamStr(3),TRUE,ParamStr(5)); end; Writeln('=== Portmap Table ==='); Writeln('Count: ' + VarToStr(Ports.Count)); Writeln; Table:= Ports._NewEnum; Enum:= Table as IEnumVariant; Enum.Reset; Enum.Next(1, Item, Fetched); Writeln(Format('%-6.6s%-7.7s%-16.16s%-7.7s%s',[ 'Prot.','Ext.','IP','Int.','Desc.'])); while Fetched = 1 do begin try if Item.Enabled then begin Writeln(Format('%-6.6s%-7.7s%-16.16s%-7.7s%s',[ VarToStr(Item.Protocol), VarToStr(Item.ExternalPort), VarToStr(Item.InternalClient), VarToStr(Item.InternalPort), VarToStr(Item.Description)])); end; finally Enum.Next(1, Item, Fetched); end; end; except On E: Exception do begin Writeln; Writeln; Writeln('Error: ' + E.Message); end; end; finally CoUninitialize; end; Writeln; Writeln; end.
Por ejemplo:
delphi
E:\Openport>openport tcp 11111 192.168.0.2 22222 Prueba Openport 0.1 === Portmap Table === Count: 79 Prot. Ext. IP Int. Desc. TCP 12345 192.168.0.2 3389 Remote Desktop [MICROSOFT] TCP 1234 192.168.0.100 1234 Test [MICROSOFT] UDP 45678 192.168.0.2 45678 UDP Test [MICROSOFT] TCP 54321 192.168.0.3 22 ServidorNX [MICROSOFT] TCP 11111 192.168.0.2 22222 Prueba
Saludos