Inicio > Componentes, Delphi, GLibWMI, Programación, WMI > Librería de componentes GLibWMI 3.0

Librería de componentes GLibWMI 3.0

Share Button

GLibWMI es una librería/biblioteca de componentes enfocados a la Administración de Sistemas Windows.
Están basados en la WMI de Windows (Windows Management Instrumentation). Podéis conocer algo más sobre WMI en la entrada del blog titulada «WMI – Introducción«.

Actualmente se ha liberado la versión 3.0 estable.

El código se ha subido en GitHub y en el blog se mantienen las versiones antiguas

Proyecto en GitHub.

 

 

 

_________________________________________________________

ACTUALIZACIÓN 01/07/2020.

La librería de componentes se ha actualizado a la versión 3.0 considerada como estable (hasta ahoira estaba en fase beta). Se han añadido además nuevas demos y se han actualizado las existentes.

La versión 3.0 cuenta con nuevos componentes y compila sin problemas desde Delphi 6 hasta la versión Delphi 10.3 (por ahora no se ha probado en 10.4, pero debería compilar sin ningun problema).

ACTUALIZACIÓN 03/04/2019.

Actualizada la librería la versión 2.2b. Compatible con Delphi 10.2 (Tokyo) y anteriores.

  • Eliminados Hints y Warnings en los de componentes.
  • Eliminados Hints y Warning en los ejemplos .
  • Se añaden Units a los uses necesarias para versiones nuevas.
  • Se añade fichero incluyendo directivas de compilación.
  • Se generan packages para las nuevas versiones de delphi.

<DESCARGAR LIBRERÍA COMPLETA versión 2.2b>
<DESCARGAR SOURCE DEMOS versión 2.2b>
<DESCARGAR EXE DEMOS versión 2.2b>

_________________________________________________________

ACTUALIZACIÓN:  1o/09/2014.

Liberada la Versión 2.1b.

Nuevas propiedades en los componentes y algunos errores corregidos.

Además la librería se ha compilado con Delphi XE7 sin problemas.

ejemplos_thumb.png

<DESCARGAR LIBRERÍA COMPLETA versión 2.1b>

<DESCARGAR SOURCE DEMOS versión 2.1b>

<DESCARGAR EXE DEMOS versión 2.1b>

_________________________________________________________

ACTUALIZACIÓN:  01/08/2013.

Liberada la Versión 2.0b.

Nuevos componentes añadidos (BootConfigurationInfo, DesktopInfo CodecsInfo, RegistryInfo, TimeZoneInfo) y corrección de algunos bugs.
Compilado para las nuevas versiones de Delphi, incluídas XE4 y XE5.

 Versión 2.0 GLibWMI

<DESCARGAR LIBRERÍA COMPLETA versión 2.0b>

<DESCARGAR SOURCE DEMOS versión 2.0b>

<DESCARGAR EXE DEMOS versión 2.0b>

_________________________________________________________

ACTUALIZACIÓN:  23/02/2010.

Liberada la Versión 1.8b.

Nuevos componentes añadidos y corrección de algunos bugs; Correción en la recuperación de propiedades y algunas pérdidas de memoria.

Actualizadas las demos con los nuevos componentes.

Como la anterior verión, los últimos cambios están subidos en Sourceforge (GLibWMI).

<Descargar librería completa;  Sources+Bin versión 1.8b>

<Descargar demos; Sources+Bin versión 1.8b>

<Descargar demos; Bin versión 1.8b>

_________________________________________________________

ACTUALIZACIÓN:  22/01/2010.

Versión 1.6b.

He subido el proyecto a Sourceforge (GLibWMI). La ultima versión estará disponible allí para su descarga.

Se distribuye con licencia GNU y todos los ficheros (incluídos los fuentes se pueden descargar).

Descargar ficheros:

<GLibWMI completa 1.6b>
<GLibWMI demos 1.6b>
<GLibWMI EXE demos 1.6b>

_________________________________________________________

La librería está en fase beta y se puede usar de forma libre y gratuíta.

Las versiones actuales están disponibles (ficheros compilados) para D6, D7 y D2009.

Se pueden descargar diferentes paquetes:

<GLibWMI>
<GLibWMI para Delphi 6>
<GLibWMI para Delphi 7>
<GLibWMI para Delphi 2009>
<Demos compiladas>>

Funciona sin problemas en sistemas basados en Windows 2000 y posteriores.
Para más información consultar:
«Operating System Availability of WMI Components»

Como bien he dicho, están en fase beta, así que se aditen sugerencias, errores, comentarios,…

Un saludo.

Share Button
  1. Raynel Rodríguez
    miércoles, 3 de febrero de 2016 a las 00:22 | #1

    Hola Neftalí, saludos y felicitaciones por tus componentes, son excelentes!!. Tengo un problema o duda, estoy haciendo una aplicación de o cual crea un número serial para validar el programa por primera vez, estoy usando los componentes GLibWMI para realizarlo, en especifico los de BiosCode, pero al correrlo y validarlo con este ejemplo:

    BiosCode:=BiosInfo1.GetHashCode;
    if Hash 0 then
    EdIcode.Text := inttostr(Bioscode)+Claveanhadida
    else
    EdIcode.Text := inttostr(Bioscode);
    Clave := EdIcode.Text;

    El valor que puse en EdIcode varía, sé que si corro la aplicación en modo administrador el valor guardado en esta variable permanece fijo, cómo haría para que el valor permanezca fijo, cualquier ayuda sería excelente, uso Win 8.1. De antemano, muchísimas gracias.

  2. Neftalí
    miércoles, 3 de febrero de 2016 a las 09:46 | #2

    @Raynel Rodríguez
    Hola Raynel.
    Tendrías que ponerme algo más de código o enviarme un ejemplo, porque con ese que has puesto, no soy capaz de entender el problema que tienes.

    Un saludo.

  3. Jaume
    martes, 24 de enero de 2017 a las 22:31 | #3

    Hola Neftalí,
    Enhorabuena, te felicito. Es de agradecer esta librería.
    ¿El serial number de la propiedad SerialNumber del componente DiskDriveInfo de la GLibWMI que se muestra en los distintos discos es el número de serie del Fabricante, o es el que se asigna al formatear?
    Saludos y gracias por tu tiempo.

  4. miércoles, 25 de enero de 2017 a las 09:08 | #4

    @Jaume
    Hola Jaume.
    El serial es realmente el número de serie del fabricante (que no cambia cuando formateas el disco).

    El algunos sistemas antiguos (Windows XP) te devolverá un valor vacío porque no estaba implementado todavía en WMI. A partir de esa versión ya obtienes el valor correcto.

  5. Antonio
    viernes, 10 de marzo de 2017 a las 06:50 | #5

    Hola Neftalí.
    Excelentes componentes te mando una felicitación.
    Tengo una duda espero me puedas ayudar, con tus componentes podria desde una pc remota basado en una ip o nombre del equipo en red saber el hardware y software instalado en el equipo remoto?
    En caso de que si se pueda me podrias ayudar diciendome como poder hacerlo o cual componente usar con un pequeño ejemplo?
    De antemano muchas gracias.
    Saludos.

  6. viernes, 10 de marzo de 2017 a las 08:47 | #6

    @Antonio
    Hola Antonio.
    Gracias por la felicitación.
    En prinicpio WMI permite sin problemas conectarse tanto a un equipo local, como a otros equipos de una red, siempre que tengas permisos de acceso (y poseas usuario y contraseña).

    En mi caso esta librería inicialmente se pensó para una conexión local, así que en su día no publiqué las propiedades de usuario y contraseña, pero sí están presentes en el método de conexión, así que podrías modificar con muy poco esfuerzo el código para publicar esas propiedades.

    Si buscas en la unit CWMIBase (que usan todos lo componentes) verás que hay un método para realizar la conexión:

    //: Conectar al proveedor.
    procedure TWMIBase.ConnectWMI();

    Que posee la siguiente llamada:

    // Connect to the WMI service, with the root\cimv2 namespace
    aServices := Locator.ConnectServer(
    Self.FHost, // Host
    GetWMIRoot(), // root
    {user}STR_EMPTY, {password}STR_EMPTY,
    STR_EMPTY, STR_EMPTY, 0, nil);

    El Host, el usuario y el password se inicializan con: ‘.’ y 2 cadenas vacías. Eso corresponde a un equipo local (al mismo equipo donde se ejecuta), pero si cambias esos parámetros por el nombre/IP de otro equipo, un usuario y una contraseña válida, deberías poder acceder sin problemas a otros equipos de la red.

    Pruébalo y dime qué tal te ha ido.

    Un saludo.

  7. Jose
    miércoles, 8 de noviembre de 2017 a las 11:32 | #7

    Hola Neftalí,
    Gracias por este aporte, me ha sido de gran ayuda durante mucho tiempo.

    Estoy usando delphi 7, y utilizo el componente para obtener el número de serie del disco duro.
    He usado tambien el componente TDiskinfo.
    Me están surgiendo problemas con discos duros sólidos. TDiskInfo no me devuelve ningun valor, y con GLib me devuelve una cadena que no tiene nada que ver.
    El numero de serie real del disco es: H21995***2069, es un disco sólido.
    TDiskInfo no me devuelve nada
    GLib me devuelve:324839313539304a********2039202020202020
    El código con el que obtengo con Glib es:

    if (DDInfo.ObjectsCount 0) then
    begin
    memo1.Clear;
    for i := 0 to (DDInfo.ObjectsCount – 1) do
    begin
    DDInfo.ObjectIndex := i+1;
    memo1.Lines.Add(DDInfo.DiskDriveProperties.SerialNumber);
    end;
    end;

    Espero que puedas ayudarme.
    Gracias por todo.

  8. jueves, 9 de noviembre de 2017 a las 11:23 | #8

    @Jose
    Hola Jose.
    La verdad es que no he tenido la oportunidad de comprobar el componente con un disco sólido.
    GLibWMI se basa en WMI, así que habría que saber qué devuelve Windows para ese disco duro.
    Para ello y siguiewndo las intrucciones de esta entrada (http://neftali.clubdelphi.com/wmi-%e2%80%93-introduccion/) puedes ver la información que Windows tiene del disco.

    1) Abre una pantalla de MSDOS (CMD)
    2) Escribe lo siguiente:

    C:\Windows\System32>wmic diskdrive get Caption, Description, DeviceID, Manufacturer, SerialNumber, Size

    Eso te dará la información que el sistema tiene, a través de WMI, de los discos instalados. A ver qué sale ahí. Eso mismo es lo que puede ofrecerte GLibWMI, porque es la información que consulta. Debería ser lo mismo que te devuelve el componente; Si no es así es que hay algún problema en GLibWMI.

    Un saludo.

  9. Jose
    jueves, 16 de noviembre de 2017 a las 18:32 | #9

    Germán Estévez :
    @Jose
    Hola Jose.
    La verdad es que no he tenido la oportunidad de comprobar el componente con un disco sólido.
    GLibWMI se basa en WMI, así que habría que saber qué devuelve Windows para ese disco duro.
    Para ello y siguiewndo las intrucciones de esta entrada (http://neftali.clubdelphi.com/wmi-%e2%80%93-introduccion/) puedes ver la información que Windows tiene del disco.
    1) Abre una pantalla de MSDOS (CMD)
    2) Escribe lo siguiente:
    C:\Windows\System32>wmic diskdrive get Caption, Description, DeviceID, Manufacturer, SerialNumber, Size
    Eso te dará la información que el sistema tiene, a través de WMI, de los discos instalados. A ver qué sale ahí. Eso mismo es lo que puede ofrecerte GLibWMI, porque es la información que consulta. Debería ser lo mismo que te devuelve el componente; Si no es así es que hay algún problema en GLibWMI.
    Un saludo.

    Buenas tardes,
    hoy he podido probarlo en un equipo.
    Aparece el numero de serie 324839313539304a********2039202020202020.
    El caso es que hay aplicaciones que dan información de disco duro que si me lo da bien.
    que crees que podrías hacer?, se te ocurre algo? Gracias por todo

  10. Jose
    jueves, 16 de noviembre de 2017 a las 19:07 | #10

    Jose :

    Germán Estévez :
    @Jose
    Hola Jose.
    La verdad es que no he tenido la oportunidad de comprobar el componente con un disco sólido.
    GLibWMI se basa en WMI, así que habría que saber qué devuelve Windows para ese disco duro.
    Para ello y siguiewndo las intrucciones de esta entrada (http://neftali.clubdelphi.com/wmi-%e2%80%93-introduccion/) puedes ver la información que Windows tiene del disco.
    1) Abre una pantalla de MSDOS (CMD)
    2) Escribe lo siguiente:
    C:\Windows\System32>wmic diskdrive get Caption, Description, DeviceID, Manufacturer, SerialNumber, Size
    Eso te dará la información que el sistema tiene, a través de WMI, de los discos instalados. A ver qué sale ahí. Eso mismo es lo que puede ofrecerte GLibWMI, porque es la información que consulta. Debería ser lo mismo que te devuelve el componente; Si no es así es que hay algún problema en GLibWMI.
    Un saludo.

    Buenas tardes,
    hoy he podido probarlo en un equipo.
    Aparece el numero de serie 324839313539304a********2039202020202020.
    El caso es que hay aplicaciones que dan información de disco duro que si me lo da bien.
    que crees que podrías hacer?, se te ocurre algo? Gracias por todo

    He estado mirando por internet y he visto que este comando si lo muestra:
    wmic path win32_physicalmedia get SerialNumber
    Si lo devuelve, no se si podría generarme algun problema al cambiar a esta propiedad.
    Saludos.

  11. jueves, 16 de noviembre de 2017 a las 20:41 | #11

    @Jose
    Hola Jose.
    En ese componente no puedes cambiar la propiedad pues la clase es diferente, el componente ataca a la clase Win32_DiskDrive y la opción que comentas ataca a la clase Win32_PhysicalMedia.

    De todas formas no te hace falta. Dentro del paquete hay un componente llamado TWMISQL que permite realizar consultas contra las clases que no solucionan el resto de componentes:
    Si lo utilizas, puedes usar como SQL: «Select * from Win32_physicalmedia» y con eso podrás obtener ese valor.

    Hay un ejemplo en las demos sobre este componente.

    Un saludo.

  12. Jose
    miércoles, 22 de noviembre de 2017 a las 08:44 | #12

    @Germán Estévez

    Modifiqué uno de los componentes cambiando la consulta, y obteniendo únicamente el numero de serie y funciona perfectamente.

    Gracias por todo.

  13. lunes, 4 de diciembre de 2017 a las 21:33 | #13

    @Jose
    Perfecto Jose.

    Un saludo.

  14. miércoles, 3 de abril de 2019 a las 12:18 | #14

    I would like to suggest to you publish it on Github.
    Additionally, if it could compile on FreePascal / Lazarus would be great.

    Thanks for your work.

    regards,
    Marcos Douglas

  15. miércoles, 3 de abril de 2019 a las 15:07 | #15

    @mdbs99
    Thanks Marcos for the comments.
    I have get your recommendation and have upoload the code to GitHub (updates the component page).

  16. Startkill
    lunes, 17 de junio de 2019 a las 06:21 | #16

    Muy buen aporte el tuyo, nos ahorras mucho trabajo…

    Gracias por todo

    Your friend;

    Startkill
    Lima-Perú

  17. Alejandro G
    sábado, 28 de diciembre de 2019 a las 23:54 | #17

    Buenas,

    Muy bueno los componentes. He estado mirando el código que está en GitHub y me llamó la atención que los mensjes (Strings) los pusieras como CONST y no como RESOURCESTRING. Ya se que para el caso es lo mismo pero a que se debe estó.

    Además he visto que en todos los componentes donde existe la propiedad Availability llegas hasta el enumerado 17 cuando Microsoft llega hasta el 21. Esto puede que sea porque las clases que usaste no lo tenían en su momento?. Igual no es nada grabe porque se los puedo agregar y listo.

    Mas allá de esto, quería saber con que programa realizar los iconos, ya que tengo que hacer algunos para unos componentes propios y no se con que haceerlos.

    Saludos

  18. Alejandro G
    domingo, 29 de diciembre de 2019 a las 23:17 | #18

    Buenas,

    Muy buenos los componentes. Esto lo conocía pero nunca me puse a investigarlo y ahora se dio. He visto los fuentes de GitHub y me preguntaba porque los strings que muestras los tienes como CONST y no como RESOUSESTRING (aunque para este caso es lo mismo uno que otro).

    Por otro lado, he visto que hay un par de métodos que los tienes como published junto con las propiedades que hacen uso de estos. No sería mejor tenerlos como privados y que solo queden publicadas las propiedades?. A lo mejor lo pensaste así por alguna razón que desconosco.

    Saludos

  19. lunes, 30 de diciembre de 2019 a las 15:26 | #19

    @Alejandro G
    Hola Alejandro, gracias por los comentarios. Intento responderte a todas las preguntas.

    1) En cuanto a los resourcestrings, si te refieres a los que se definen dentro de los componentes (CBiosInfo, por ejemplo) es debido a que los dejé como originalmente los devuelve WMI. Se podrían pasar a resourcestring y así poder traducirlos, pero me pareció adecuado que el valor fuera como el original para poder «cuadrarlo» con la documentación. Aunque no habría problema en cambiarlo.

    2) En cuanto a la propiedad Availability es exactamente por lo que comentas. En su momento los valores disponibles llegaban hasta el 17. Ahora hay nuevos así que habría que actualizar el código. Es posible que pase con otras propiedades, incluso que haya aparecido alguna propiedad nueva que no existe. Lo apunto para revisarlos.

    3) Como programa de iconos suelo utilizar IcoFX que tiene versiones gratuitas (anyFX) o Greenfish Icon Editor muy parecido.

    4) En cuanto a los métodos, tal vez se me ha escapado alguno como public/pulished y tal vez no sea necesario. Si es así se pueden pasar a privados. Si me comentas cueles son, me lo apunto para la próxima actualización.

    Gracias por los comentarios.

  20. Alejandro G
    viernes, 3 de enero de 2020 a las 01:29 | #20

    @Germán Estévez

    Mil gracias por las respuestas.

    Saludos

  21. Fran
    miércoles, 22 de abril de 2020 a las 21:22 | #21

    Hola Germán, desde hace dos años, vengo utilizando en un programa tu componente DiskDriveInfo del paquete GlibWMI, para leer datos de un pendrive que se usa como mochila.
    Hasta ahora, todo funcionó correctamente pero de buenas a primeras, sin saber porqué, ha empezado a dar un problema. Al compilar el programa, (puesto que he de hacerlo para cada persona que me lo compra, con datos del pendrive diferentes), da el siguiente error: Project Programa.exe raised exception class EOleException with message ‘OLE error E06D7363’. Process stopped. Use step or run to continue.
    No es un error de compilación sino que este se produce al arrancar el programa después de la compilación, puesto que lo primero que hace el programa al arrancar, es leer los datos del pendrive. El programa queda compilado correctamente y funciona sin problemas, leyendo la llave correctamente, pero es muy fastidioso no poder probar las modificaciones directamente desde el IDE de Delphi, más teniendo en cuenta que nunca pasó eso. Pensé que podría haber instalado incorrectamente Delphi o el paquete de componentes, pues tuve que reinstalarlo recientemente (en el mismo ordenador) y no recuerdo si había vuelto a compilar ese programa después, pero volví a reinstalar delphi y el paquete de sin resultado positivo. También pensé que, como al reinstalar delphi, aproveché para descargar la versión más reciente del paquete, igual era esa última versión la que daba el problema, pero he ido instalando las versiones anteriores una por una (no recuerdo la que usaba antes) sin conseguir resolver el problema. Por supuesto cada vez he desintalado la versión instalada y sustituido los paths en Library path y Browsing path.
    Por supuesto, también pensé que podría haber pasado algo en el código del programa, a pesar de no haber tocado nada del código recientemente, pero para salir de dudas, hice un pequeño programa que solo incluía el componente, un botón y un Tlabel donde se leía el modelo del pendrive al pulsar el botón y el problema surge igualmente trabajando desde el IDE de Delphi y de la misma forma que mi programa, cuando se arranca el programa fuera de Delphi, funciona perfectamente.
    El paquete lo tengo instalado en Delphi 7 y lo utilizo en Windows 10.
    Me gustaría preguntarte si tienes alguna idea de donde podría venir ese error. Solo soy aficionado a la programación, no soy profesional (el programa, aunque lo vendo, solo es para colegas de mi afición, el Belenismo, ya que es para controlar Belenes) y el problema me trae loco.
    Te agradecería una orientación. Muchas gracias de antemano, y felicitaciones por estos componentes.

  22. Fran
    miércoles, 22 de abril de 2020 a las 23:45 | #22

    Se me olvidó indicarte donde se interrumpe la ejecución. Ésta se produce en las líneas marcadas del procedimiento que transcribo, de la unit CWMIBase.

    procedure TWMIBase.ConnectWMI();
    var
    Locator: ISWbemLocator;
    begin

    try
    // Create the Location object
    Locator := CoSWbemLocator.Create();
    // Connect to the WMI service, with the root\cimv2 namespace

    EN LA LÍNEA SIGUIENTE ES DONDE SE INTERRUMPE LA EJECUCIÓN. SI SE PULSA RUN DE NUEVO, SE VUELVE A INTERRUMPIR EN LA SIGUIENTE MARCADA

    aServices := Locator.ConnectServer(
    Self.FHost, // Host
    GetWMIRoot(), // root
    {user}STR_EMPTY, {password}STR_EMPTY,
    STR_EMPTY, STR_EMPTY, 0, nil);

    Self.FConnected := True;
    //-MessageDlg(‘Conectado’, mtInformation, [mbOK], 0);
    except
    Self.FConnected := False;
    //-MessageDlg(‘No Conectado’, mtInformation, [mbOK], 0);

    //+G EXCEPCION PRPIA

    ESTA ES LA SIGUIENTE

    raise Exception.Create(GetLastErrorAsString());
    end;
    end;

  23. jueves, 23 de abril de 2020 a las 07:44 | #23

    @Fran
    Hola Fran.
    Hace tiempo que no modifico los fuentes, sólo los voy recompilando para asegurarme de que funcionan en las últimas versiones. Si me dices que tú tampoco has cambiado el tuyo, es posible que sea algo relacionado con Windows o con tu versión de Delphi.

    Yo probaría (si está en tus posibilidades) compilarlo con una versión más nueva de delphi.

    Otra cosa que puedo hacer es que me envíes el programita (a german_ral@hotmail.com) que has hecho de ejemplo, lo pruebo y te digo. Tengo varias versiones de Delphi (enttre ellas D7) y te digo si a mi me pasa.

    Un saludo.

  24. Fran
    jueves, 23 de abril de 2020 a las 15:04 | #24

    Gracias por tu respuesta. Respecto a compilar el programa con una versión más reciente de Delphi, lo intenté hace poco, antes de tener el problema que te he comentado, con el objeto de modernizar el aspecto del programa y estar más actualizado, pero desgraciadamente no fué posible instalar en la versión más reciente de delphi dos componentes de terceros que solo los he podido encontrar para Delphi 7 o anteriores y que son insustituibles.
    Lo de mandarte el programita lo puedo hacer, pero tendría que mandarte el codigo fuente para que vieras el problema, porque como te digo el programa compilado funciona perfectamente fuera de Delphi. El error solo se produce durante la ejecución desde el entorno de Delphi.
    Yo he pensado que eso de que el problema surgiera de buenas a primeras es muy raro. Recuerdo ahora que una versión nueva que estaba preparando con algunas mejoras, la compilé hace unos días sin problema. Lo único que ha cambiado desde entonces es que Windows 10 se ha actualizado dos veces. ¿Podría venir el error por esto, es decir, que debido a la actualización de Windows, el componente haya dejado de ser compatible?.
    Te mandaré el código fuente en estos días. Muchas gracias de nuevo por prestarnos tu tiempo y espero que esta consulta te sirva a ti también para las revisiones que haces de tus conponentes. ¡Un saludo!

  25. jueves, 23 de abril de 2020 a las 15:26 | #25

    @Fran
    Hola Fran.
    Cuando decías que me enviaras un programa me refería a un pequeño ejemplo donde consigas que se reproduzca el problema, no estaba pensando en el código del tuyo. Intentaré así reproducir el problema en mi máquina (diferente a la tuya) y con versiones distintas.

    De todas formas por lo que comentas me inclino más por lo último que dices. Algun cambio en el «entorno».
    * Actualización de Windows.
    * Cambios en el IDE (si hubieras instalado algo en el D7; Expertos o similares)

    Si no has hecho lo segundo, lo más lógico es lo primero.

    Un saludo

  26. fran
    jueves, 23 de abril de 2020 a las 18:43 | #26

    Si, entendí que te referías al programita de prueba pero hice un «pensamiento en voz alta» nada mas. Ya te lo mandé y a ver si entran las capturas de pantalla, porque de primera no entraban.

Comment pages
1 2 589
  1. Sin trackbacks aún.
What is 17 + 23 ?
Please leave these two fields as-is:
IMPORTANTE! Para continuar, debes contestar la pregunta anterior (para evitar SPAM) :-)