Featured Posts

Diplomado de desarrollo de aplicaciones para Windows Phone 7.1–LatinoaméricaDiplomado de desarrollo de aplicaciones para Windows... Los invito cordialmente a que se inscriban al Diplomado de desarrollo de aplicaciones para Windows Phone 7.1, impulsado por Microsoft México para todo el mundo!  Completamente...

Readmore

Nueva carrera en Microsoft Virtual Academy: Windows Phone 7.1 (Mango)Nueva carrera en Microsoft Virtual Academy: Windows... Tengo el gusto de darles a conocer la disponibilidad de una nueva carrera en el Microsoft Virtual Academy (MVA): La carrera de Windows Phone 7.1 Mango. Esta es la descripción...

Readmore

Nueva carrera en Microsoft Virtual Academy: Silverlight 4Nueva carrera en Microsoft Virtual Academy: Silverlight... ¿Eres estudiante de Microsoft Virtual Academy (MVA)? Tengo el gusto de anunciarles oficialmente el lanzamiento de la nueva carrera de Silverlight 4 para esta plataforma educativa. La...

Readmore

Rodrigo Díaz Concha Rss

Cómo obtener la dirección IP local desde una aplicación de Silverlight

Posted on : 07-01-2011 | By : Rodrigo | In : Silverlight 4

Tags: , ,

4

Introducción

Existen una gran cantidad de escenarios en donde es necesario conocer la dirección IP local de la máquina en donde está corriendo una aplicación, principalmente por cuestiones de auditoría, seguridad, etc.  A partir de Silverlight 4 contamos con la posibilidad de ejecutar las aplicaciones Afuera del Navegador en un modelo de seguridad de Confianza Elevada, es decir, rebasando las restricciones inherentes a esta tecnología Web para que los aplicativos puedan comportarse casi como si se tratasen de una aplicación de escritorio tradicional.

En el caso de aplicaciones de Silverlight tradicionales (dentro del navegador) podríamos conocer la dirección IP del usuario en el Servidor.  Pero ¿qué pasa con Aplicaciones Fuera del Navegador, en donde no tenemos la seguridad de que se cuente con acceso a un Servidor y mucho menos conectividad como tal?

En este artículo veremos cómo podemos obtener la dirección IP local del equipo desde una aplicación de Silverlight 4 que esté ejecutando en Confianza Elevada, a través del uso de WMI (acrónimo de Windows Management Instrumentation): la infraestructura de administración de datos (de hardware y software) y notificaciones en los Sistemas Operativos Windows.

WMI

Con WMI podemos obtener información detallada acerca del hardware y software local en el equipo, así como de equipos remotos, a través de lenguajes de script, PowerShell o incluso por medio de herramientas utilitarias que hayan sido creadas para conectarse al repositorio de componentes de WMI.  Por ejemplo, en el sistema operativo Windows existe el comando WMIC.EXE, quien nos permite obtener una gran cantidad de información con respecto al equipo a través de comandos sencillos que consultan el repositorio WMI:

SNAGHTMLb6defc

En la figura anterior podemos apreciar el uso de WMIC y la ejecución de algunos comandos (timezone, diskdrive, desktop, entre muchos otros).  Para mayor información acerca de WMIC pueden leer el siguiente artículo de TechNet.  Los comandos pueden aceptar algunos verbos para construir internamente una consulta con el lenguaje WQL (WMI Query Language), usado para obtener los datos que necesitemos del repositorio.

Es precisamente a través de WQL el medio por el cual podemos obtener prácticamente cualquier tipo de información del equipo en donde esté ejecutando la aplicación de Silverlight 4 en Confianza Elevada.

WbemScripting.SWbemLocator

Cuando una aplicación de Silverlight 4 está ejecutando en Confianza Elevada podemos utilizar la clase AutomationFactory para la invocación de Servidores de Automatización.  Para esto debemos configurarla a través de las propiedades del proyecto en Visual Studio .NET y además validar si está disponible esta característica a través de la propiedad estática AutomationFactory.IsAvailable (WMI está disponible en Windows y no en Mac OS).

WbemScripting.SWbemLocator es un objeto que nos permite ejecutar consultas de WQL para obtener datos del repositorio de WMI.  Su método ConnectServer nos brinda la oportunidad de conectarnos a un equipo (local o remoto) y a un espacio de nombres de WMI determinado (root\cimv2 es el espacio de nombres predeterminado).  Si la conexión es exitosa, ConnectServer nos regresará un objeto de tipo SWbemServices que podremos usar para la ejecución de consultas WQL.  Para mayor información del objeto WbemScripting.SWbemLocator pueden revisar la siguiente página.

La solución

Crearemos una nueva aplicación de tipo Silverlight 4 y agregaremos a la solución un proyecto de tipo Silverlight Class Library al cual le llamaremos Utilerias para poder reutilizar esta funcionalidad en diversos proyectos.  La aplicación de Silverlight 4 la configuraremos para que ejecute Afuera del Navegador y en Confianza Elevada.

Crearemos un método estático llamado GetLocalIPAddress() en donde implementaremos toda la funcionalidad y cerraremos el círculo de la explicación.  A continuación, el código completo:

public class Utilerias

{

    public static string GetLocalIPAddress()

    {

        if (!Application.Current.HasElevatedPermissions)

        {

            return "Esta funcionalidad necesita ejecutarse fuera del navegador y en confianza elevada";

        }

        try

        {

            if (AutomationFactory.IsAvailable)

            {

                using (dynamic wmi = AutomationFactory.CreateObject("WbemScripting.SWbemLocator"))

                {

                    dynamic service = wmi.ConnectServer(".", @"root\cimv2");

                    //El siguiente query de WQL obtendrá la información de WMI necesaria

                    //Estamos filtrando que DNSHostName no sea nulo

                    dynamic query = service.ExecQuery(@"select IPAddress from Win32_NetworkAdapterConfiguration where DNSHostName is not null");

                    //Obtiene la dirección IP

                    string address = query.ItemIndex(0).IPAddress[0];

                    return address;

                }

            }

            else

            {

                return "No disponible";

            }

        }

        catch (System.Exception)

        {

            return "No disponible";

        }

    }

}

En el código podemos apreciar los conceptos anteriormente explicados, y resalta la consulta de WQL que estamos ejecutando:

select IPAddress from Win32_NetworkAdapterConfiguration where DNSHostName is not null

Es notable que la sintaxis es muy parecida a T-SQL.  La consulta hace uso de la clase Win32_NetworkAdapterConfiguration, quien representa la información de los adaptadores de red.  Además, estamos validando que nos regrese únicamente aquellas que su propiedad DNSHostName no sea nula.  Esta validación es necesaria para identificar únicamente aquellos adaptadores de red que verdaderamente esten conectados.  Obviamente necesitamos hacer más validaciones y filtros en el caso de que tengamos diferentes conexiones al mismo tiempo, pero en el escenario aquí explicado solo una conexión está habilitada.  Para mayor información de la clase Win32_NetworkAdapterConfiguration pueden revisar la siguiente página.  Para una lista más extensa de todas las clases pueden consultar esta página.

La invocación del método –por ejemplo en el evento Click de un Botón efectivamente nos daría la dirección IP local del equipo:

SNAGHTMLd47b2c

Resumen

WMI es la infraestructura en los sistemas operativos Windows que nos permite obtener información del hardware y software de un equipo local o remoto.  Silverlight 4 en Confianza Elevada puede ejecutar servidores de automatización como por ejemplo WbemScripting.SWbemLocator, quien es la puerta de entrada para la ejecución de queries WQL, para la consulta del repositorio de WMI.  A través de esta técnica prácticamente podemos conocer cualquier tipo de información que necesitemos en nuestros aplicativos de Silverlight 4.

Salu2!

Comments (4)

Chido, mmm… ese código se me hace conocido, jajajaja

Salu2!!!

jajaja! salu2!!!

Mas facil consultar a un Webservice, porque si estas detras de una DMZ te va a tomar la IP local

Ejemplo:

http://my-ip.cc/host.json

Saludos

Hola Fabián, el escenario del artículo es cuando una aplicación está ejecutando Afuera del Navegador y no tienes acceso a Servicios.

Salu2!

Write a comment

Spam Protection by WP-SpamFree