jueves, 5 de noviembre de 2009

Como obtener el puerto, IP y header del IIS

En varias ocasiones se ocupa saber cierta información del IIS, como el puerto o la IP de uno de los servidores.

El ejemplo que les voy a mostrar permite obtener esa información de un servidor IIS local. Fue bastante util para mi en un proyecto.

Aquí les va:

using System;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
namespace EnumSites
{
class Program
{
static void Main(string[] args)
{
DirectoryEntry entry = new DirectoryEntry("IIS://localhost/w3svc/1");
PropertyValueCollection pvc = entry.Properties["ServerBindings"];
foreach (object value in pvc)
{
// Format is IPAddress:Port:HostHeader
string[] Bits = value.ToString().Split(':');
string IPAddress = Bits[0];
string TCPIPPort = Bits[1];
string HostHeader = Bits[2];
Console.WriteLine("IP = {0}, Port = {1}, Header = {2}",
(IPAddress.Length == 0) ? "(All Unassigned)" : IPAddress,
TCPIPPort,
(HostHeader.Length == 0) ? "(No Host Header)" : HostHeader);
}
Console.Read();
}
}
}

Como pueden ver, se obtiene un DirectoryEntry con el site localhost. De aquí se obtiene la variable ServerSettings, y de aquí obtener el valor que nos brinda. Estos valores vienen separados por dos puntos (":"). El primer valor nos indica la IP, la segunda el puerto y el tercero el header.

Espero que esto les sea útil algún día.

Saludos

lunes, 2 de noviembre de 2009

Obtener el path de mysql de forma dinamica

Algunas veces, uno ocupa saber donde está instalado alguna aplicación. Esta ruta puede variar dependiendo de donde haya escogido el usuario instalarla. Una de esta aplicaciones es mysql.

Muchas veces uno ocupa saber adonde está instalado la aplicación MySQL Server para poder ejecutar distintas opciones (un ejemplo es una archivo script). Sin embargo, la ruta donde está instalado puede variar de una máquina a otra o incluso de versión.

Un ejemplo de esto es el siguiente:

  • Mi ruta del MySQL es C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql.exe
  • Pero en otra computadora es C:\Program Files\MySQL\MySQL Server 5.0\bin\mysql.exe.
Esta pequeña diferencia es suficiente para que algo funcione o no.

Entonces se pregunta, como hago para poder saber esto sin que el usuario tenga que escribirlo?

El truco es el siguiente: Cuando uno instala MySQL, este automáticamente instala y pone a ejecutar un servicio. Este servicio contiene valiosa información sobre la versión de MySQL que tenemos, entre esa, la ruta. El siguiente código se vale de esto para obtener la ruta de mysql:

public static string GetMySQLPath()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_Service WHERE DisplayName = 'MySQL'");

foreach (ManagementObject queryObj in searcher.Get())
{
string servicePath = (string)queryObj["PathName"];
string executablePath;
if (servicePath.StartsWith("\""))
{
executablePath = servicePath.Substring(1, servicePath.IndexOf('"', 1) - 1);
}
else
{
executablePath = servicePath.Substring(0, servicePath.IndexOf(' '));
}
FileInfo executableFile = new FileInfo(executablePath);
return executableFile.DirectoryName;
}
}
catch (Exception)
{
//No action in particular
}
return null;
}

Con este código, podemos obtener la ruta de MySQL sin tener que buscarla en un explorador ni tener que escribirla.

Saludos

viernes, 16 de octubre de 2009

Creación User Interface en Web Setup Projects de .NET

Visual Studio provee una herramienta bastante util sobre como crear instaladores de las aplicaciones desarrolladas en este ambiente. Sin embargo; la configuración básica en la que se crea estos instaladores a veces es muy limitada, en especial si uno necesita que el usuario ingrese ciertos datos sin la necesidad de que sean tan invasivos en nuestros proyectos. De ahí surge la idea de agregar User Interface al instalador.

Para lograr esto hay que seguir los siguientes pasos:

  1. Crear un Web Setup Project: Donde se crear un proyecto de instalación vacío.
  2. Agregar el Primery Output y el Content Files del proyecto web al que queremos crear la aplicación web.
  3. Creamos un proyecto que contenga una clase installer. Esto es necesario, ya que esta clase es la que nos permite interactual y trabajar con ciertas acciones que queremos en nuestros instaladores. En este archivo, podemos reescribir código de la siguiente manera:
  4. Teniendo esta clase, volvemos al setup project y hacemos click derecho encima de este proyecto. Aquí podemos ver como que se muestra un menu. Vamos a la opción de View, la cual desplega otro menú. Aquí seleccionamos la opción de "User Interface".
  5. Esta los muestra una pantalla en donde aparecen las distintas ventanas del instalador. Si hacemos click en una de las secciones, nos aparece un menú que contiene la opción de "Add Dialog". Hacemos click ahí.
  6. Nos despliega una ventana con las distintas opciones de ventanas de diálogos que podemos escoger. Nosotros escogemos Textbox (A).
  7. Si seleccionamos el dialogo creado y vemos las propiedades de estas, nos permite editar las diferentes opciones. La mas importante aquí es la de Edit[numero]Property, ya que esta nos permite obtener el valor escrito por el usuario del instalador.
  8. Hecho eso, vamos a crear un "Custom Action". Hacemos lo mismo que en el paso 4, pero en lugar de escoger "User Interface", escogemos "Custom Actions".
  9. Aquí se nos muestra los Custom Actions existentes. Para nuestro ejemplo hacemos click derecho en la sección de commit, y escogemos "Add Custom Action".
  10. Nos sale una ventana. Escogemos la opción "Web Application Folder" en "Look in", y hacemos click en el "Add File".
  11. Escogemos el dll creado del proyecto con la clase instaler. Le damos ok y le damos ok para volver a la pantalla principal del Custom Dialog.
  12. Si hacemos click en la acción agregada y vemos las propiedades, nos encotramos con una que se llama "CustomActionData". En esa parte ponemos lo siguiente: /rootpas=[EDITA1]. El /rootpas es el nombre de una variable con la que se llamara en la clase instalador. Por medio de esta obtenemos el valor escrito, que viene asignada en la parte [EDITA1].
  13. En el archivo de código de la clase instalador, accedemos al valor obtenido por medio de la siguiente linea de código: Context.Parameters["rootpas"];
  14. Con esto tenemos todo lo necesario para poder obtener datos digitados por el usuario.

Saludos.