
Te voy a mostrar como se hace para abrir puertos usando una Script VBS en una Aplicación HTA.
Esto nos permite abrir y cerrar puestos con una aplicación simple y fácil de usar, sin necesidad de entrar a la pagina de nuestro modem o router.
INTRO
Si te interesan las script y la programación podes ver estos posts:
Una Miradita a la APP Fucnionando
Cuando la aplicación se inicia se abre una ventana y queda así:

Luego de que se detectan los dispositivos que tienen habilitado el uPNP se ve algo así:

Luego se selecciona el dispositivo al cual le queremos abrir los puertos y se ve esto:
El código de la aplicación
Si quieres tener esta aplicacion en tu pc solo debes abrir un notepad, o block de notas o cualquier editor de textos copiar y pegar el codigo y grabarlo como upnp.hta, luego lo ejecutas y sin cambiar nada funciona para cualquier modem con uPnp activo.
Si utilizas esta script en otro sitio te pido que hagas una referencia a esta página.
Para quienes les interesa el código la script está auto documentada, lo básico así que te será fácil modificarla.
<Script language="VBScript">
Dim deviceFinder
Dim devices(10)
Dim CurrentID
Dim CurrentDevice
Dim GateWayService
Dim findData
Dim ds
dim DeviceCount
Set deviceFinder = CreateObject( "UPnP.UPnPDeviceFinder" )
sub window_onLoad
ds=""
window.resizeto 800,400
DeviceCount=0
StartFind()
end sub
'Esta funcion comienza la busqueda asincronica de dispositivos uPnp
'lo hace dependiendo de tipo de dispositivo a buscar
'en este caso se usa urn:schemas-upnp-org:service:Layer3Forwarding
' pero se puede usar tambien
'
Sub StartFind()
findData = devicefinder.CreateAsyncFind( "urn:schemas-upnp-org:service:Layer3Forwarding:1",0,GetRef("DeviceFinderCallback";))
devicefinder.StartAsyncFind(findData)
End Sub
' esta funcion es llamada por el s.o. cada vez que se encuentra un dispositivo uPnp
' dependiendo del critero de busque utilizado
' tambien se llama cuando se termina la busqueda
'
Sub DeviceFinderCallback (device, UDN, calltype)
Select case calltype
Case 0
DeviceCount=DeviceCount+1
ds=ds+"<option value=" & DeviceCount & ">" & Device.FriendlyName & "</option>"
Set Devices(DeviceCount)=Device
Case 1
MsgBox "device removed: " & UDN
Case 2
UpdateList()
end select
End Sub
'esta funcion se encarga de redibujar la pagina una vez que estan los dispositivos encontrados
'
Sub UpdateList()
Document.body.innerHtml=_
"<form name=""SelectDevice"">"+_
" <select id=""Devices"" Name=""Devices"" onchange=SelectDevice()>"+_
" <option value=0> Seleccione un Dispositivo </option> "+_
ds+_
" </select>"+_
" </form>"+_
" <form name=""puertos"">"+_
" Seleccione"+_
" </form>"
End Sub
' esta funcion se ejecuta cada vez que se selecciona un dispositivo de la lista desplegable
'
Sub SelectDevice()
CurrentId=cint(document.SelectDevice.Devices.value)
if CurrentId=0 then
document.Forms("Puertos";).innerHTML=""
Else
set CurrentDevice = Devices(CurrentId)
ShowData CurrentDevice
End If
End Sub
' esta funcion llama a otra que muestra los puertos abiertos en el modem
'
Sub ShowData(dv)
dim dvc
if dv.HasChildren then
for each dvc in dv.children
if dv.HasChildren then
for each dvc1 in dvc.children
Showports dvc1
Next
End If
Next
end if
End Sub
' esta funcion muestra elemento por elemento los puertos abiertos
'
Function GetWanConn(inService)
Dim retVal, emptyArgs(0), outArgs(20)
dim Args(1),oargs(8)
dim indice
dim entries
s=""
on error resume next
s=s+"<table border= 1><tr><td>Puerto Externo</td><td>protocolo</td><td>Puerto Interno</td><td>Ip Local</td><td>Descripcion</td><td></td></tr>"
s=s+"<tr>"
s=s+"<td><INPUT TYPE=text NAME=p01></td>"
s=s+"<td><SELECT NAME=p02><OPTION VALUE=TCP>TCP<OPTION VALUE=UDP>UDP</SELECT></td>"
s=s+"<td><INPUT TYPE=text NAME=p03></td>"
s=s+"<td><INPUT TYPE=text NAME=p04></td>"
s=s+"<td><INPUT TYPE=text NAME=p06></td>"
s=s+"<td><INPUT TYPE=Button NAME=Botonagregar VALUE=Add onClick=agregar()></td></tr>"
retval = 0
indice = 0
Args(0) = "1"
while ( retval = 0 )
Args(0) = indice
retVal = inService.InvokeAction("GetGenericPortMappingEntry", Args,oArgs)
if err <> 0 then
retval = 1
else
s=s+CSTR(RETVAL)
if ( retVal = 0 ) then
s=s+"<tr><td>" & cstr(oargs(1)) & "</td><td>"& oargs(2) & "</td><td>"& cstr(oargs(3)) & "</td><td>"& oargs(4) & "</td><td>"& oargs(6) & "</td>"
s=s+"<td><INPUT TYPE=Button NAME=Boton"& indice &" VALUE=Delete onClick=Borrar(" & indice & ")></td>"
s=s+"</tr>"
indice = indice + 1
end if
end if
wend
s=s+"</table>"
on error goto 0
GetWanConn=s
Set GateWayService=inService
End Function
'esta funcion verifica los servicios del dispositivo
' y llama a la funcion que muestra los datos del servicio
' se filtran solo los servicios de forwarding de puertos
'
Sub ShowPorts(inDevice)
dim service
s=""
For each service in inDevice.Services
If (service.ServiceTypeIdentifier = "urn:schemas-upnp-org:service:WANIPConnection:1") Then
s=s+GetWanConn(service)
End If
Next
document.Forms("Puertos").innerHTML=s
End Sub
' Esta funcion se ejecuta cada vez que se agrega un nuevo puerto
' es cuando pulsmos el boton add
'
sub agregar()
dim Args(8),oargs(1)
args(0) = "0.0.0.0"
args(1) = document.forms("Puertos").elements("p01").value
args(2) = document.forms("Puertos").elements("p02").value
args(3) = document.forms("Puertos").elements("p03").value
args(4) = document.forms("Puertos").elements("p04").value
args(5) = true
args(6) = document.forms("Puertos").elements("p06").value
args(7) = 0
retVal = GateWayService.InvokeAction("AddPortMapping", Args,oArgs)
ShowData(CurrentDevice)
end sub
<html>
<head>
<title>Port Forwarding App by @NeCroS</title>
<HTA:APPLICATION
APPLICATIONNAME="
[email protected]
"
ID="ModemStatus"
VERSION="1.0"
SCROLL="yes"
SINGLEINSTANCE="yes"
'CAPTION="no"
INNERBORDER="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SELECTABLE = "no"
BORDER="Dialog"
/>
</head>
<body>
Espera un cacho...<br>
si querés quí ponele un gif animado...
</body>
</html>
En mi caso probé la APP con un router WiFi Tp-Link TL-WR743ND


- Compartir el post estaría muy bueno.
- Me costó un huevo hacer ásta script.
- No sean forros y dejen un comentario.
- Si se les caen algunos puntos no estaría de más
- No comenten "mejor uso ...." porque la idea es aprender como se hace.
- Si, si, es una porong@ el vbscript, pero con esto pueden probar sin instalar nada.
- No comenten "el protocolo uPnp es inseguro ... bla bla bla ", Windows es inseguro y lo mismo se usa
- Si usan la scrip o la comparten en otras paginas, mencionen el link a esta página
- Si no les funciona y me mandan un mp mencionen el modelo y marca del router o modem
- Buenisimo si se les cae una idea y aportan algo bueno para el post
- Despues de un tiempo me quitan la edicion y no puedo incluir nada en el post
