Direcciones MAC y cómo obtener información detallada sobre tarjetas de red con .NET.

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Direcciones-MAC-y-como-obtener-informacion-detallada-sobre-tarjetas-de-red-con-NET.aspx

Aparecido con la versión 2.0 de la plataforma, allá por 2005, el espacio de nombres System.Net.NetworkInformation resulta de gran utilidad a la hora de crear aplicaciones de diagnóstico de red basadas en la plataforma .NET. Gracias a las clases contenidas en éste podemos obtener información de todo tipo acerca de nuestros dispositivos de comunicaciones (tarjetas de red y otros adaptadores) de forma que resultaría fácil clonar algunas herramientas de diagnóstico del sistema operativo para adaptarlas a nuestras necesidades. En su día, ya hace muchos años, comenté lo fácil que era construir un clon de "ping.exe" para determinar el estado de un servidor remoto (si responde o no). También es sencillo responder a cambios en la conectividad con los eventos de la clase NetworkChange, como también expliqué en su momento, lo cual nos permite detectar cambios en la dirección IP o que se pierda la conexión a Internet por ejemplo.

Direcciones MAC

Ayer, para un experimento, estuve construyendo una pseudo-clon básico de la utilidad "ipConfig.exe" que viene con Windows (en concreto el resultado de ipconfig /all). En realidad la parte que me interesaba era la obtención de la dirección física de las tarjetas de red, lo que coloquialmente se denomina Dirección MAC.

Las direcciones "Media Access Control" (MAC) son las direcciones físicas de los adaptadores de red, independientes de protocolos y otros factores superiores, ya que se trata de números únicos en el mundo asociados a cada tarjeta de red y grabados físicamente en éstas por el fabricante. De modo que comprobando las direcciones MAC podemos estar seguros de que estamos en un determinado sistema o no (enseguida las salvedades a esto). Es más, generalmente todas las tarjetas de red llevan su MAC impresa en una etiqueta para que podamos verla a simple vista:

MACEnTarjeta

 

La mayoría de los routers inalámbricos del mercado permiten hacer un filtro por MAC de modo que sólo las tarjetas de red que estén en una lista de MACs concreta puedan conectarse a dicha red. Si bien esto detendrá a los script-kiddies y otros posibles atacantes con poca idea, no sirve de mucho a la hora de protegernos de verdad ya que cualquier hacker avezado puede determinar alguna MAC válida analizando el tráfico inalámbrico y falseando la dirección MAC de su tarjeta de red, el llamado "mac spoofing", algo muy fácil de hacer en todos los sistemas operativos. En las maquinas virtuales (por ejemplo en Hyper-V o Virtual Box) es muy sencillo asignar cualquier dirección MAC que elijamos a una tarjeta de red virtual, por lo que podríamos emular cualquier tarjeta de red del mundo muy fácilmente. Por ejemplo, esta es la de un Linux Fedora virtualizado que tengo bajo Virtual Box:

MACEnVirtualBox

Las MAC pueden ser utilizadas también para licenciar un software de modo que sólo pueda ejecutarse en un determinado equipo (atándolo a sus tarjetas de red). Este es el motivo, por ejemplo, de que si cambiamos de tarjeta de red en nuestro equipo tengamos que volver a activar Windows, si bien no es el único factor físico que controla el sistema de licenciamiento de Microsoft.

El código de ejemplo

A continuación dejo el código fuente de un pequeño programa que, haciendo uso del espacio de nombres NetworkInformation, muestra información sobre todos los adaptadores de red de nuestro equipo, incluyendo sus direcciones MAC:

   1: using System;

   2: using System.Net.NetworkInformation;

   3:  

   4: public class InfoTarjetasRed

   5: {

   6:     //Entrada a la aplicación de consola

   7:     public static void Main()

   8:     {

   9:         try

  10:         {

  11:             MuestraInfoTarjetasRed();

  12:         }

  13:         catch (Exception e)

  14:         {

  15:             string error = string.Format("---nSe ha producido el siguiente error:n{0}n---", e.ToString());

  16:             Console.WriteLine(error);

  17:         }

  18:         finally

  19:         {

  20:             Console.Write("Pulsa cualquier tecla para continuar...");

  21:             Console.ReadKey();

  22:         }

  23:     }

  24:  

  25:     private static void MuestraInfoTarjetasRed()

  26:     {

  27:         //Obtengo el nombre del ordenador y el dominio actuales

  28:         IPGlobalProperties propsOrdenador = IPGlobalProperties.GetIPGlobalProperties();

  29:         Console.WriteLine("Información de los interfaces de red de: {0}.{1}", propsOrdenador.HostName, propsOrdenador.DomainName);

  30:         Console.WriteLine("ntNombre de host ...........: {0}", propsOrdenador.HostName);

  31:         

  32:         //Info de las tarjetas de red

  33:         NetworkInterface[] tarjetas = NetworkInterface.GetAllNetworkInterfaces();

  34:         if (tarjetas == null || tarjetas.Length < 1)

  35:         {

  36:             Console.WriteLine("No se han encontrado tarjetas de red");

  37:             return;

  38:         }

  39:         

  40:         //Recorremos las propiedades de cada tarjeta

  41:         foreach (NetworkInterface tarjeta in tarjetas)

  42:         {

  43:             //Nombre de la tarjeta

  44:             Console.WriteLine("n{0}:",tarjeta.Name);

  45:             Console.WriteLine("  Descripción .............. : {0}", tarjeta.Description);

  46:             Console.WriteLine("  Tipo de interfaz ......... : {0}", tarjeta.NetworkInterfaceType);

  47:             Console.WriteLine("  Velocidad ................ : {0:n}", tarjeta.Speed);

  48:             Console.WriteLine("  Estado ................... : {0}", tarjeta.OperationalStatus);

  49:             Console.WriteLine("  Soporta Multicast ........ : {0}", tarjeta.SupportsMulticast);

  50:             Console.WriteLine("  Dirección física (MAC) ... : {0}", ObtenMACLegible(tarjeta.GetPhysicalAddress().GetAddressBytes()));

  51:             

  52:             //Propiedades de protocolos

  53:             IPInterfaceProperties propiedades = tarjeta.GetIPProperties();

  54:             //IPv6?

  55:             bool soportaIPv6 = tarjeta.Supports(NetworkInterfaceComponent.IPv6);

  56:             Console.WriteLine("  ¿Soporta IPv6? ........... : {0}", soportaIPv6);

  57:         }

  58:     }

  59:     

  60:     //Pasamos los bytes de la dirección física a Hexadecimal para mostrarlos como MAC

  61:     private static string ObtenMACLegible(byte[] bytes)

  62:     {

  63:         string MAC = "";

  64:         for(int i = 0; i< bytes.Length; i++)

  65:         {

  66:             MAC += String.Format("{0}", bytes[i].ToString("X2"));

  67:             // Se mete un guión tras cada byte excepto en el último

  68:             if (i != bytes.Length -1)

  69:             {

  70:                 MAC += ("-");

  71:             }

  72:         }

  73:         return MAC;

  74:     }

  75: }

Lo único que se hace para visualizar la MAC de un modo más legible es separar sus bytes con guiones y expresarlos en hexadecimal, que es la forma más común (método ObtenMACLegible del final).

El resultado por la consola es similar al siguiente (he cambiado las MAC por seguridad):

MACSalidaConsola

 

Te puedes descargar el código fuente y el ejecutable (InfoTarjetasRed.zip, 3.57 KB) para probarlo por tu cuenta. ¡Espero que te sea útil!

El examen 70-536 NO se retira

Post original en JASoft.org: http://www.jasoft.org/Blog/post/El-examen-70-536-NO-se-retira.aspx

vtortolarealDesde que salieron las nuevas certificaciones para Visual Studio 2010 el año pasado, ya no es necesario hacer el examen de fundamentos de la plataforma .NET, el examen 70-536. Como ya he manifestado en multitud de ocasiones y también indicaba en el post del enlace anterior, personalmente me parece un grave error y creo que esto hará que las personas que se certifican ahora estén menos preparadas en la -tan necesaria- base que los anteriores. Pero aunque muchos se lo hemos dicho a Microsoft por escrito no nos han hecho ni caso.

En cualquier caso la no necesidad de presentarse al 70-536 ha llevado a mucha gente a pensar que es un examen que ya no vale y que se va a retirar. Y me gustaría aclarar la situación para que no hay confusiones al respecto.

El examen 70-536 no se retira

Microsoft mantiene una página en Internet en la que informa exactamente de qué exámenes se retiran y cuando, con un año de antelación:

http://www.microsoft.com/learning/en/us/certification/exam-dev.aspx#tab4

Y como se puede observar, a fecha de hoy el 70-536 no está en la lista.

Otra cosa muy diferente es que, para las nuevas certificaciones de .NET 4.0 no te lo piden como obligatorio, ya que ahora sólo necesitas hacer un examen por especialidad para ser Technology Specialist, pero no retiran para nada el examen. Simplemente no será obligatorio.

Eso no significa que no sirva. De hecho nos parece una desgracia muy grande por parte de Microsoft que no obliguen a hacerlo para certificarte ya que, tal y como lo tienen planteado con .NET 4.0, puedes certificarte en, por ejemplo, desarrollo Web pero no tener ni idea de los fundamentos de la plataforma que son realmente importantes. Nosotros (y mucha otra gente con la que hemos hablado y que lo han manifestado en Internet) pensamos que se están equivocando.

Mi opinión es que la gente que además de certificarse en alguna especialidad de 4.0 también tenga el 70-536 será mucho más valiosa para las empresas si le sabe transmitir el valor que tiene. Cuando surge un problema "de base" es cuando uno que domina los fundamentos de la plataforma con el 70-536 es capaz de marcar la diferencia con un programador más "del montón".

Creo que es por un tema meramente económico, ya que al eliminar la barrera del 70-536 muchos más programadores menos preparados podrán acceder a certificarse. Pero eso es “pan para hoy y hambre para mañana” pues podrían devaluar las nuevas certificaciones.

Incluso aunque retiraran el examen del 70-536 algún día (que lo dudo porque es el único de fundamentos que hay, en tal caso lo actualizarían, algo que no le vendría mal tampoco), el que lo haya aprobado seguiría certificado en él, puesto que las certificaciones de desarrollo no caducan.

Espero que esta aclaración pueda resultarte útil.

Nota: La imagen simpática estilo Simpsons se la he robado al bueno de Valeriano Tórtola. Espero que no le importe pero es que me ha gustado mucho 😛

Campos ReadOnly y InsertVisible en edición de datos con controles enlazados Web Forms

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Campos-ReadOnly-y-InsertVisible-en-edicion-de-datos-con-controles-enlazados-Web-Forms.aspx

En las rejillas (y en realidad en cualquier control enlazado a datos de ASP.NET Web Forms) es posible marcar algunos campos como de solo lectura estableciendo como verdadera su propiedad ReadOnly.

BoundFieldReadOnly

Si establecemos un campo como ReadOnly, a la hora de editarlo se comporta como una etiqueta, es decir, se muestra de la misma manera tanto en modo visualización como en modo edición, normalmente en forma de etiqueta de texto que muestra el contenido del campo. Si se trata de una plantilla, ya no tendremos la propiedad ReadOnly y tendremos que sustituir el TextBox por defecto para edición por una etiqueta o similar en el caso de la plantilla de edición de registros, pero esto es otra historia.

Bien, la cuestión es que este comportamiento tiene un efecto secundario que puede causarnos algunos problemas (o al menos despistarnos un poco según lo que esperemos) y es que los campos ReadOnly no se envían al servidor durante las inserciones y actualizaciones.

Es decir, a todos los efectos es como si no existieran para la edición, por lo que si estamos insertando un registro nuevo y no se admiten valores nulos en el campo de solo lectura tendremos que tener en cuenta esta particularidad y gestionarla. No debería suponer un problema en el caso de las actualizaciones ya que el valor del campo no se modifica y, aunque no se admitan nulos, dado que el registro ya existe nos estamos asegurando por definición que no va a ser nulo. Esto es así, claro, si estamos gestionando correctamente la edición de los datos y no tratamos de recoger el valor del campo de solo lectura y enviarlo (se nos puede escapar y lo enviaríamos nulo al no ser enviado al servidor durante el postback). Este problema se da típicamente cuando hemos incluido el campo como uno más en la consulta de actualización, y luego sin embargo marcamos el campo correspondiente del control enlazado como de sólo lectura.

Existe otra propiedad que se llama InsertVisible (ver la figura anterior, un poco más arriba) que sirve para indicar si el campo será visible o no durante la inserción. Si la ponemos a False desaparecerá el campo y con él el posible problema. Se suele usar con campos como autonuméricos y similares que no tienen sentido durante una inserción, pero si puede tener sentido mostrarlos como sólo lectura durante la edición, de ahí la existencia de las dos propiedades, que puede ser algo confusa.

Es una pequeña particularidad pero que a más de uno le puede causar quebraderos de cabeza y que, si te ocurre, no es nada fácil de descubrir.

¡Espero que te sea útil!

Aprovechar el bajón del verano para especializarse en alguna tecnología

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Aprovechar-el-bajon-del-verano-para-especializarse-en-alguna-tecnologia.aspx

En verano siempre hay un bajón de actividad porque a partir de Junio ya todos los clientes están pensando más en las vacaciones que en el trabajo. Así, siempre hay 2-3 meses en los que, indefectiblemente, la actividad baja y normalmente tenemos más tiempo para hacer otras cosas: aportar a un proyecto Open Source, leer todos los posts atrasados y, como no, intentar aprender o especializarnos en una tecnología.

Este año desde campusMVP hemos querido ponérselo más fácil a todos los que quieran especializarse en desarrollo Web o en acceso a datos con .NET y por eso hemos lanzado la campaña "Verano feliz".

Cursos desarrollo Web ASP.NETPor ello hemos lanzado unos packs veraniegos con importantes descuentos y regalos. Sólo serán válidos para los primeros 20 que se anoten y hasta el 30 de Junio.

¿Qué incluyen los pack?

Nuestros cursos de certificación son los más completos del mercado y sirven no sólo para sacarse la certificación, sino para realmente convertirse en expertos en la materia objeto de estudio. Además incluyen las tutorías para que los alumnos no estén solos durante el estudio: 24 horas de acceso para estudiar y preguntar sobre el curso.

Hemos querido incluir un buen descuento (de hasta 200€) sobre el precio normal de los cursos de certificación. Además hemos añadido al paquete varios regalos interesantes, valorados también en hasta 200 €:

  • Libros de Krasis Press: te mandamos en papel los libros de nuestro catálogo relacionados con cada curso. También los tendrás para descarga en PDF nada más empezar el curso.
  • Un mochila de la prestigiosa marca Eastpack de campusMVP, para que los lleves a cualquier sitio.
  • Una camiseta de "feed your brain" para que presumas de orgullo geek
  • Una suscripción de 3 meses a los vídeos de Pluralsight. Nuestros amigos americanos, también MVPs, tienen una amplísima colección de vídeos de aprendizaje sobre casi todas las tecnologías de Microsoft. Te resultarán un gran complemento para aprender cualquier concepto previo que te haga falta preparar o para complementar el estudio. Te encantarán.
  • El simulador oficial del examen: para que no te pille por sorpresa y te presentes con seguridad. La versión que incluimos es de 6 meses de acceso, no disponible para su compra en la Web de MeasureUp (lo máximo que te venden son 3 meses), pero que nosotros sí podemos ofrecer gracias a nuestro especial acuerdo con ellos.
  • Sin coste para tu empresa: si el pack te lo compra la empresa para la que trabajas, nos encargamos gratuitamente de gestionar el papeleo para que pueda salirle sin coste (dependiendo del crédito que tengáis con el Estado). Así que habla con tu jefe y convéncelo puesto que os puede salir a coste cero o a una fracción del coste normal.
  • No te preocupes por irte de vacaciones unos días: nos dices qué día te vas y qué día vuelves y prorrogaremos el curso automáticamente en la misma cantidad de días para que no pierdas tiempo. Así te puedes ir de vacaciones sin agobios por estudiar 🙂

¡Ah!, y sin olvidarme de que como sabes somos la única empresa en ofrecerte garantía de aprobado: si no apruebas la certificación te devolvemos el dinero y te puedes quedar los regalos. Tan seguros estamos de la calidad de los cursos y de nuestra metodología.

Por cierto, yo soy el tutor de la parte principal del curso de desarrollo web junto con Alberto Población (MVP) y José María Aguilar. Y nuevamente mi buen amigo y reconocido profesional José María Aguilar es el tutor del pack de acceso a datos.

Más información:

¡Anímate!

NOTA: Por cuestiones logísticas esta oferta sólo está disponible para España.

Cómo usar expresiones regulares en las búsquedas de Visual Studio

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Como-usar-expresiones-regulares-en-las-busquedas-de-Visual-Studio.aspx

Aparte de para las labores habituales de todo desarrollador (o sea, escribir código, jeje), Visual Studio es también una estupenda herramienta para procesar archivos, sobre todo cuando necesitas hacer cambios masivos en contenidos mediante buscar y reemplazar. Como te permite abrir muchos archivos y luego buscar cadenas sobre ellos usando expresiones regulares, puedes hacer cambios más o menos complejos con relativa facilidad.

Sin embargo la sintaxis de expresiones regulares que admite difiere en bastantes cosas de la sintaxis habitual en la mayoría de los lenguajes de programación, como C#/.NET o JavaScript, por ejemplo.

Para expresiones regulares básicas es igual y no tendrás problemas, pero hay otras cuestiones que, de entrada, resultarán más complejas porque cambia la sintaxis.

Por ejemplo, imagina que tienes que cambiar todas las etiquetas <ul>  dentro de varios archivos HTML por etiquetas <ol>, para convertir todas las listas en listas ordenadas.

Abrirías el diálogo de buscar y reemplazar (CTRL+H) y podrías probar con esta configuración:

BuscarExpReg_1

La expresión regular (<ul.*>) no tiene nada raro aparentemente: busca las cadenas que empiecen por <ul y contengan (o no) lo que sea dentro de la etiqueta, cerrándose, claro está, con un “>”.

Si tenemos algo como esto:

BuscarExpReg_2

Encontrará sin problema el <ul> que tenemos.

Sin embargo consideremos este otro código:

BuscarExpReg_3

Algún diseñador HTML desbocado nos ha puesto en la misma línea toda la línea. Si ahora hacemos uso del diálogo anterior para hacer la búsqueda, el primer <ul> aparecerá sin problemas como antes, pero esto es lo que encontrará la expresión para el segundo:

BuscarExpReg_4

Efectivamente: la línea entera.

El problema es que por defecto, como en casi todos los lenguajes, las expresiones regulares son “codiciosas” (o en inglés “greedy”). Por ello tratan de que se cumpla la expresión pero de la manera más amplia posible. Es decir, si le ponemos “.*>” tratará de buscar cualquier cadena de cualquier longitud (el punto con el asterisco) que termine con un “>”. Como es “codiciosa” por defecto, buscará la más larga posible. En una línea como la resaltada en la figura anterior (por defecto no son multi-línea) la expresión se extiende hasta alcanzar el último “>” de la misma. Pero eso no es lo que nosotros queremos.

Para evitar este problema en una expresión regular común en C# o JavaScript usamos el operador “?”. Este operador a continuación de un modificador de longitud estilo “*” o “+” indica que éste debe comportarse de la manera menos codiciosa posible (non-greedy). Si intentamos meter este operador en el diálogo de Visual Studio veremos que, directamente, no encuentra nada.

El motivo es que las expresiones regulares de VS consideran este operador “?” como  una interrogación más, es decir, sería como decirle que la cadena debe terminar con una interrogación y un mayor.

Entonces ¿cómo se consiguen expresiones non-greedy en Visual Studio?

Pues muy sencillo. Simplemente hay que utilizar la sintaxis especial que le han otorgado (la verdad es que deberían haber usado una sintaxis común, la misma que en –NET para evitar problemas, pero sus buenas razones tendrían quiero pensar).

De hecho precisamente por esta sintaxis especial es necesario marcar los símbolos “>” y “<” como “>” y “<”, es decir, con caracteres de escape, porque de otro modo éstos indican el fin y el principio de línea respectivamente (en condiciones normales no habría que “escapearlos”).

Si vemos con detenimiento la tabla de caracteres de control especiales para estas expresiones regulares nos daremos cuenta de que Visual Studio utiliza dos caracteres especiales propios para indicar coincidencias no-codiciosas:

· @: es equivalente a “*?” en expresiones regulares convencionales. Es decir, coincide con cualquier número de caracteres de manera no codiciosa, incluyendo el hecho de que no haya ninguno (o sea, puede haberlos o no).

· #: es equivalente a “+?” en expresiones regulares convencionales. Es decir, coincide con cualquier número de caracteres excepto 0 de manera no codiciosa. Es decir, que debe haber al menos una coincidencia.

Así, en el caso anterior, podríamos usar este diálogo para encontrar correctamente los <ul> de nuestras páginas:

BuscarExpReg_5

Es decir, la expresión regular se descompone en los siguientes elementos:

· “<ul”: la cadena debe empezar por “<ul”

· “.@”: cualquier caracter, el número de veces que sea, incluyendo el hecho de que no exista ninguno. Así encaja con <ul> y también con <ul class=”Lista”> o con cualquier otro atributo que tenga la etiqueta. El caracter @ indica que debe ser non-greedy, es decir, que debe detectar la cadena más corta posible.

· “>”: la cadena debe terminar con un “>”, como todas las etiquetas HTML.

Fácil, pero cuando intentas usar expresiones regulares normales puedes volverte loco´. Así que ya sabes, ten a mano siempre el enlace anterior y verifica los caracteres especiales que usa Visual Studio para sus búsquedas.

El objetivo de este post era llamar la atención sobre esta sintaxis especial, ayudar a alguno que tuviera problemas con el uso de esta herramienta y, de paso, repasar los mínimos de las expresiones regulares, algo que todo programador debería conocer al dedillo trabaje en el lenguaje que trabaje 🙂

¡Espero que te sea útil!