** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Lanzar comandos DOS, Shell, Wscript.Shell
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoLanzar comandos DOS, Shell, Wscript.Shell

 Responder Responder Página  12>
Autor
Mensaje
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Tema: Lanzar comandos DOS, Shell, Wscript.Shell
    Enviado: 26/Abril/2020 a las 20:39
Tengo un problema bastante curioso con Shell, creo que se cuál es el problema pero no encuentro el camino para solucionarlo.

El propósito es controlar los usuarios que se conectan en remoto a un servidor y poder 'cerrarles' la sesión desde un programa en Access cuando en vez de cerrar la sesión se desconectan quedando la sesión abierta y el programa de Access que están ejecutando también, con lo que impiden el mantenimiento de las BD y aplicaciones.

Soy capaz de averiguar mediante el comando QUERY SESSION que usuarios figuran en el servidor y no están conectados:

C:\Users\JESUS>query session
 NOMBRE DE SESIÓN  NOMBRE DE USUARIO        ID  ESTADO    TIPO   DISPOSITIVO
 services                                    0  Desc
>console           JESUS                     1  Activo
 rdp-tcp                                 65536  Escuchar

Y despues puedo cerrarlos con:

C:\Users\JESUS\Logoff 1

Hasta ahí todo bien, en el caso del comando QUERY puedo guardar los datos en un txt y explotarlo después desde Access.

C:\Users\JESUS>query session >C:\Temp\Datos.txt

Nota: estos comandos funcionan perfectamente tanto con el CMD como con el POWERSHELL

El problema viene cuando quiero hacerlo desde Access:

- El primer camino es lanzarlo mediante un Shell:
Shell "query session >c:\temp\Datos.txt"
dice que archivo no encontrado 

- probando con Wscript.Shell:
    Dim oWsCript As Object
    Set oWsCript = CreateObject("WScript.Shell")
    oWsCript.Run "query session  >c:\temp\datos.txt"
    Set oWsCript = Nothing
dice que error en método Run


- El segundo camino es crearme un bat con lo que necesito y lanzar el bat:

El fichero .bat contiene una única línea:  query session >C:\temp\datos.txt
  si lo ejecuto desde windows hace lo que debe y obtiene el fichero con los datos que busco
  si lo lanzo desde Access:
    Shell "c:\temp\1.bat"

o bien

    Dim oWsCript As Object
    Set oWsCript = CreateObject("WScript.Shell")
    oWsCript.Run "c:\temp\1.bat"
    Set oWsCript = Nothing
aparentemente funciona (tanto con Shell como con Wscript.Shell, obtiene el fichero de salida, pero en blanco


- Intento lanzarlo con cmd.exe (con el modificador /k para que se quede abierto)
Shell "cmd.exe /k query session >c:\temp\Datos.txt"
la respuesta es:  "query" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
lo mismo ocurre si lanzo el .bat
el resultado es el mismo si en vez de cmd.exe utilizo el powershell


De todas formas aquí salta la pista importante (o eso creo), en la ventana cmd abierta ejecuto el comando QUERY SESSION manualmente y me da el mismo error (comando que en una ventana CMD abierta desde windows funciona perfectamente).

Buscando por la nube encuentro que DIR que es un comando que funciona perfectamente con los métodos anteriormente descritos es un comando de DOS, en cambio QUERY SESSION es un comando de windows, por lo que entiendo que el problema radica en que la ventana que se abre desde windows con CMD es capaz de ejecutar comandos de los dos entornos, en cambio la ventana abierta desde programa -ya sea Shell, Wscript.Shell o Powershell- sólo es capaz de ejecutar comandos DOS.

El punto dónde me he quedado es cómo lanzar un comando windows desde Access, no encuentro ninguna referencia, todo lo que encuentro me dirige a Shell y Wscript.Shell.

¿Ideas?.

Gracias por leer el tocho que he soltado.



Editado por Mihura - 26/Abril/2020 a las 20:42
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4856
Enlace directo a este mensaje Enviado: 26/Abril/2020 a las 23:00
Jesus , en la WEB de Buho encontraras ejemplos de como controlar los usuarios , como desconectarlos , controlar tiempos de inactividad etc etc.... ,....... quizás sea lo mas rápido para salir del atasco ,...... pero si prefieres seguir mediante Shell , Dos , Bat etc... eso ya es otra historia ........
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4856
Enlace directo a este mensaje Enviado: 26/Abril/2020 a las 23:11
[Topico:39] ¿Es posible conocer los usuarios que se encuentran conectados a una MDB concreta?
Usuarios conectados
Las palabras claves de búsqueda son: usuarios conectados mdb access numero ejemplos

[Topico:219] Unas buenas funciones donde se explica detalladamente como conectar con una MDb dese Sql Server, Ado, Dao, crear recordset's con Ado, Dao...no te pierdas este fichero
Ver Funciones
Las palabras claves de búsqueda son: conectar sql server dao ado access funciones

[Topico:523] Una API para conectarse a una undiad de RED
Ver codigo
Las palabras claves de búsqueda son: access api conectar disco unidad red lan

[Topico:598] Conexión a una base de datos de Vsual Fox
Jairo Hernandez
Las palabras claves de búsqueda son: access conectar base datos fox visual ado

[Topico:792] Ejemplo del Búho para Access 2000, desde el cual, podrás desconectar a usuarios que en un momentos dado estén utilizando el módulo de datos de servicio de una determinada aplicación. Dentro del ejemplo hay un fichero de texto, que es conveniente que leas para que todo funcione bien. Es un ejemplo hecho muy rápido, así que no descarto que tenga algún error. De ser así, por favor, comunícamelo. He utilizado en una de las MDB que acompañan a este ejemplo, parte de un código extraído de una aplicación que muestra los usuarios activos en un momento dado
Bajarse Ejemplo
Las palabras claves de búsqueda son: access usuarios red desconectar seguridad proteger proteccion ejemplos

[Topico:969] Para saber si estamos conectados a Internet
Ver Código
Las palabras claves de búsqueda son: access api internet conectados conexión

[Topico:1035] Una forma de saber si estamos conectados a internet
Ver Código
Las palabras claves de búsqueda son: access internet conexion conectados

[Topico:1131] Exposicion de Ricarado Hernandez sobre recordset desconectados y de cómo agilizar el resultado de mostrar registros
Ver Código
Las palabras claves de búsqueda son: access ado dao recordsets desconectados lentitud agilidad

[Topico:1275] Ejemplo Búho: Conexión Internet-> Un sencillo ejemplo para decirnos en el PC que corre el código, qué tipo de conexión a Internet tenemos (MODEM, Adls etc) además de decirnos si en esos momentos estamos On-Line. Sencillo pero práctico. Este ejemplo «solo» funciona para Access 2000 o superior.(Octubre de 2004).
Ver Código
Las palabras claves de búsqueda son: access internet modem conexion api adsl conectados ejemplos

[Topico:1305] Usuarios conectados (De nuevo al ataque) -> D. Emilio, en el foro de nuestra web, ha preparado un ejemplo en el cual dice: «Este ejemplo, pretende mostrar como forzar el cierre de las aplicaciones "cliente" o "Front-end" desde el "Back-end".El Back-End cuenta con una tabla "Config", que a su vez, entre otros, tiene un campo "Cerrar" tipo Si/No y que será únicamente controlado por el Administrador. El Front-End chequea periódicamente el estado de ese campo y en caso de que esté a "Sí", avisa al usuario de que debe cerrar; al cabo de un nuevo ciclo del temporizador, si el usuario no ha cerrado todavía la aplicación, cierra todos los formularios y la aplicación. Así mismo también permite realizar un cierre programado de la aplicación a una hora predeterminada, para por ejemplo realizar un compactado de la misma.» Bueno, pues el ejemplo de Emilio te le puedes bajar de aquí:
Ver Código
Las palabras claves de búsqueda son: access usuarios conectados desconectar mantenimiento ejemplos

[Topico:1306] D. Emilio, en el foro de nuestra web, ha preparado un ejemplo en el cual dice: «Este ejemplo, pretende mostrar como forzar el cierre de las aplicaciones "cliente" o "Front-end" desde el "Back-end".El Back-End cuenta con una tabla "Config", que a su vez, entre otros, tiene un campo "Cerrar" tipo Si/No y que será únicamente controlado por el Administrador. El Front-End chequea periódicamente el estado de ese campo y en caso de que esté a "Sí", avisa al usuario de que debe cerrar; al cabo de un nuevo ciclo del temporizador, si el usuario no ha cerrado todavía la aplicación, cierra todos los formularios y la aplicación. Así mismo también permite realizar un cierre programado de la aplicación a una hora predeterminada, para por ejemplo realizar un compactado de la misma.»
Así mismo, el rata del Búho tenía otro parecido, que hice hace tiempo, pero que le faltaba una mano de pintura bien dada y un lavado de cara. Y Emilio me animó a re hacerle de nuevo, por que no sé si te habías enterado todavía, pero el Búho es un envidioso de mucho cuidado :-P Pues aquí también te puedes bajar el ejemplo de Búho rejuvenecido (El ejemplo, no el Búho). EJEMPLO BUHO Estos ejemplos «solo» funcionan para Access 2000 o superior (El del Búho, además, algunas de sus rutinas necesitan tener Windows XP o Windows 2000 instalado (! Se siente !) (Enero de 2005, en plena cuesta del Ídem).
Ver Código
Las palabras claves de búsqueda son: access usuarios conectados desconectar mantenimiento ejemplos

[Topico:1351] Bueno aquí tenemos un ejemplo de como saber los usuarios conectados a una MDB. Utiliza una DLL. Tanto Emilio como Buho, creo que hemos resuelto este tema de una forma mas eficiente y sencilla sin necesidad de recursos externos, como es el caso de este ejemplo, que utiliza una DLL. Los ejemplos de Emilio y Buho les podrás ver en nuestra web. (Sección Novedades o bien a través del buscador)
Ver Código
Las palabras claves de búsqueda son: access ejemplos usuarios conectados dll
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 01:00
Gracias Javier,

Me has puesto unos cuantos ejemplos,
- como saber los usuarios conectados a una aplicación ya lo conocía, ... y de hecho lo uso en este proceso para saber quién tiene 'cazada' la aplicación
- los ejemplos para desconectar a los usuarios son básicamente el mismo, control desde el front de un parámetro en el back, y si existe cerrar el programa, pero no es aplicable aquí, ya que estamos hablando de bastantes aplicaciones distintas y que no se quieren tocar
- como conectar con una BD con ADO, DAO, crear recordsets con ADO, DAO  ... no tiene que ver mucho con lo planteado
- una API para conectar a una unidad de red ¿?
- ¿conectarme a una BD de FOXPRO?
- ¿saber si estoy conectado a internet?
- ¿recordsets desconectados?
- ¿saber si estoy conectado a internet con un MODEM o ADSL? 
- ...
No comprendo que tienen que ver con lo preguntado.

En principio es posible que resuelva el tema con un script vbs, pero de todas formas lo principal es saber como lanzar desde Access esos comandos que podemos utilizar en una pantalla de CMD o POWERSHELL.







Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 02:17
Desde mi total ignorancia, anduve mirando e hice esto:

Dim x As Variant
    x = Shell("POWERSHELL.exe query user >c:\Temp\datos.txt", vbNormalFocus)

En PowerShell funciona bien, pero en Access me sale un aviso de código malicioso en macro y sin dejarme otra opción sale de Access. 

Lo digo, porque a lo mejor tu que sabes más de esto, quizás puedas controlar la seguridad de las macros de modo que te permita ejecutarlo, al menos puntualmente

Sólo respondí porque mi error era diferente a los tuyos, por si te servía de algo

Sorry pero no doy para más

Edito:
En PowerShell funciona bien, siempre y cuando la ruta ya exista previamente, el archivo .txt lo genera y lo rellena, pero si la ruta no existe, da error

Edito Otra vez

He metido ese código en una función, habiendo habilitado en el centro de confianza la carpeta donde está la base de datos y funciona.

Supongo que el secreto está en incluir la base de datos como de confianza para que el antivirus no de la lata

 
Public Function ComandoCMD() As Variant

Dim x As Variant
    x = Shell("POWERSHELL.exe query user >c:\Temp\datos.txt", vbNormalFocus)

End Function



Editado por Dabellaso - 27/Abril/2020 a las 02:44
El saber no ocupa lugar, sólo tiempo
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 09:37
Dabellaso,

Lo primero gracias por el interés.

La función que pones a mi me funciona (exista o no exista el fichero destino datos.txt) con una función DOS (por ejemplo DIR), pero si le pongo la funcion query user o query session no me da error, pero ni siquiera me genera el fichero de salida. ¿A ti te ha funcionado?

Yo uso W10-PRO + Office 2010.

P.D. Si abro manualmente una ventana de PowerShell (o CMD) y lanzo la función si que trabaja correctamente.

P.D.1. Entra en las opciones de Access -> Centro de confianza -> configuración centro de confianza. Ahí tienes las distintas opciones que puedes cambiar, entre ellas el nivel de ejecución de macros.



Editado por Mihura - 27/Abril/2020 a las 09:49
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Cont@BOT Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 30/Marzo/2020
Localización: Sevilla
Estado: Sin conexión
Puntos: 2
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 10:13
Creo que esto puede ayudar

Public Function Ejecuta_Cmd() As String
Dim Cadena As String
Dim oShell As Object

'Creas el fichero bat o cmd o powershell...
Cadena = "@ECHO OFF"
Cadena = Cadena & vbCrLf & "Query User"

Open Application.CurrentProject.Path & "\Ejecuta.cmd" For Output As #3
    Print #3, Cadena
Close #3

Cadena = ""

'Ejecutas el fichero
Set oShell = CreateObject("WScript.Shell")
'Utilizas Exec en vez de Run, y además lees la salida de la consola
Cadena = oShell.Exec("""" & Application.CurrentProject.Path & "\Ejecuta.cmd""").StdOut.ReadAll
Set oShell = Nothing
'Borras el fichero creado
Kill Application.CurrentProject.Path & "\Ejecuta.cmd"
'Aquí ya haces lo que quieras con Cadena para obtener lo que quieres
Ejecuta_Cmd = Cadena
End Function
Cont@BOT
IA para PYMES
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 10:31
Don Juan Carlos, .... bienvenido a esta jaula de grillos Guiño.

Muchas gracias por el interés, lo que apuntas me suena a variante de una de las muchas pruebas que llevo hechas, al fin y al cabo te creas un bat (o un cmd) y lo ejecutas desde un Shell.

Porque ..... ¿a ti te funciona con query user? a mi no, si pongo como función dir (Cadena = Cadena & vbCrLf & "dir") va como un tiro, pero la que yo busco no va ... Llorar

Un saludo y cuidaín con el bichito. Gran sonrisa



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 10:55
Publicado originalmente por Mihura Mihura escribió:

Dabellaso,
Lo primero gracias por el interés.

Que menos!, gracias a ti por todo

Publicado originalmente por Mihura Mihura escribió:

Dabellaso,
La función que pones a mi me funciona (exista o no exista el fichero destino datos.txt) con una función DOS (por ejemplo DIR), pero si le pongo la funcion query user o query session no me da error, pero ni siquiera me genera el fichero de salida. ¿A ti te ha funcionado?

Yo uso W10-PRO + Office 2010.


Yo uso Win10-PRO + Office 2019

Con lo que expuse se me abre la ventana de Windows Power shell (La que tiene fondo azul, no el cmd que tiene fondo negro) y tras un momento se cierra, después fui a la carpeta indicada y efectivamente hay estaba el archivo con los datos.

Modifique el contenido del txt y volví a repetir para ver si sobrescribía el fichero, y si, lo hace

Era muy tarde y no hice muchas pruebas, me pondré en un rato, pero lo que si pude constatar es que como te indiqué, el archivo .txt no es necesario que exista ya que lo genera, pero la ruta de carpeta si debe existir antes, de otro modo me daba error. (Eso lo probé desde el PowerShell no desde Access, y era PowerShell quien se quejaba de ruta no encontrada)

Lo del tema de la seguridad de macros tampoco lo probé mucho, sólo metí la base de datos en una carpeta de confianza y funcionó. Hice una ultima prueba después de saber que funcionaba sacándola nuevamente de esa carpeta y me volvió el aviso del antivirus. y así quedo ayer.

Acabo de probarlo otra vez y me sigue funcionando. Seguiré haciendo pruebas , y mirando los valores que devuelve Shell. Si descubro algo te digo. Si de alguna manera te puedo ayudar para descubrir porque me funciona a mi y a ti no me dices que hacer

saludos

Edito. si me indias como obtenerlo, te digo la versión del Powershell, que como ya te digo es la primera vez que trasteo con el


Editado por Dabellaso - 27/Abril/2020 a las 11:02
El saber no ocupa lugar, sólo tiempo
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4856
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 11:02
Publicado originalmente por Mihura Mihura escribió:


No comprendo que tienen que ver con lo preguntado.



Al hacer la búsqueda dentro de la WEB de Buho me aparecieron todos esos resultados , ........  Ya vi que muchos resultados No se ajustaban a lo que pedías, simplemente hice un copia y pega de todo.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 11:23
Veamos, que se va viendo luz al final de este túnel ... 

El problema es el entorno en el que se ejecuta, mirando con Cont@bot el porqué a él si le funciona y a mí no, al ponernos a analizar tema de antivirus, firewall, permisos de usuario, resulta que él lo ha ejecutado en un ordenador con Windows Server, he hecho la prueba en un equipo que tiene Windows Server + Office 2010 y me ha funcionado, en cambio en otro equipo 'servidor' con W7-Pro + Office 2010 no ha funcionado.

Dabellaso, dices que a ti te funciona con W10-PRO + Office 2019 luego la versión de office puede ser también otra clave, voy a probar con W10 + Office 2016 (en una maquina virtual) a ver que pasa.

Ed. W10 + Office 2016 funciona la rutina propuesta por Cont@bot


Editado por Mihura - 27/Abril/2020 a las 12:14
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 27/Abril/2020 a las 12:15
Visto lo visto,

 ¿a alguien se le ocurre como atacar el problema desde Access por otro camino distinto?


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje Enviado: 28/Abril/2020 a las 17:47
Has probado con WMI?

- https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-logonsession
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 28/Abril/2020 a las 17:54
Ahí es justo dónde estamos, pero casca con W7 ... Evil Smile
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje Enviado: 29/Abril/2020 a las 14:30
Esto está probado en Win7+Access 2013. Otra cosa será si sirve realmente, no tengo posibilidad de probar nada en ningún servidor, y a este equipo y mi usuario le han "capado" casi todo:


Function test1()
    Dim objWmi As Object        'Objeto WMI
    Dim colAccesos As Object    'Colección de accesos
    Dim objAcceso As Object     'Cada uno de los accesos
    Dim objCuenta As Object     'Cuenta que se está usando
    Dim objSesion As Object     'Datos de la sesión
   
    Set objWmi = GetObject("WINMGMTS:\\.\ROOT\cimv2")
    Set colAccesos = objWmi.InstancesOf("Win32_LoggedOnUser", 1)
    
    For Each objAcceso In colAccesos
        With objAcceso
            'Datos de la cuenta
            Debug.Print .Antecedent
            Set objCuenta = GetObject("WINMGMTS:" & .Antecedent)
           
            'Datos de la sesión
            Debug.Print .Dependent
            Set objSesion = GetObject("WINMGMTS:" & .Dependent)
        End With
       
        With objCuenta
            Debug.Print " Caption="; .Caption,
            Debug.Print " Description="; .Description,
            Debug.Print " Domain="; .Domain,
            Debug.Print " InstallDate="; .InstallDate,
            Debug.Print " LocalAccount="; .LocalAccount,
            Debug.Print " Name="; .Name,
            Debug.Print " SID="; .SID,
            Debug.Print " SIDType="; .SIDType,
            Debug.Print " Status="; .Status
        End With
       
        Debug.Print
       
        With objSesion
            Debug.Print " Caption="; .Caption,
            Debug.Print " Description="; .Description,
            Debug.Print " InstallDate="; .InstallDate,
            Debug.Print " Name="; .Name,
            Debug.Print " Status="; .Status,
            Debug.Print " StartTime="; .StartTime,
            Debug.Print " AuthenticationPackage="; .AuthenticationPackage,
            Debug.Print " LogonId="; .LogonId,
            Debug.Print " LogonType="; .LogonType
        End With
       
        Debug.Print "============================================================="
    Next
End Function
~
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable