viernes, 24 de diciembre de 2010

Felicidadesssssssss!


Que tengan muy felices fiestas y que se cumplan todos sus deseos.

Desde ya todo esto y mucho más para el 2011.


Saludos.

Mariano Llarin.-
Neuquén, Argentina

martes, 28 de septiembre de 2010

Cloud computing - Introducción

Una idea de cloud computing...

Lo que hoy en día se da a conocer como trabajar en la nube se presenta en tres categorías:

- Software como servicio (Software as a Service, SaaS).
- Servicios adjuntos (Attached Services).
- Plataformas en la nube (Cloud Platforms).



Estas 3 categorías son presentadas para diferentes ambientes de trabajo. Lo que se pretende y se apunta a desarrollar son servicios de aplicaciones en la nube. Algunas de estas pueden ser por ejemplo Google maps que ofrece los mapas on-line y brinda además herramientas para los desarrolladores para que utilicen esta aplicación para situar mapas en las aplicaciones desarrolladas por los mismos. Este tipo de plataforma de aplicaciones no aparecen muy a menudo. Pero como dijo David Chappell, "cuando aparece una plataforma de innovación exitosa, genera un enorme impacto".

En los próximos días voy a adentrarme más en esto y explicar quizás un poco mejor algunas de estas cosas. Es como mucha información de golpe y me sale toda junta. Tengo como que acomodar un poco todo lo almacenado. Además, un día largo el de hoy...

En breve la continuación de esto y con algo más práctico. Se viene interesante...


Saludos,


Mariano Llarin.-

viernes, 27 de agosto de 2010

ASP.NET - GridView con botones como columnas

Para agregar dentro de una grilla columnas de tipo commandfield es posible por medio del código o a través del smart tag del control.

Si lo hacemos desde el smart tag, debemos seleccionar del menú la opción editar columnas. Luego agregar columnas de tipo CommandField.

Si lo hacemos a través de la vista de código, dentro de la definición de las columnas de la grilla, agregamos el siguiente código por cada columna de tipo ButtonField:


<asp:buttonfield headertext="ver" commandName="Boton1" buttontype="Button"></asp:buttonfield>

De esta forma ya tenemos un ButtonField dentro de nuestra grilla. En este caso lo definí como un botón pero es posible definirlo como un link, botón o como una imágen cambiando esto en el button type de la definición anterior.

Una vez realizado el código dentro del archivo .aspx nos dirijimos al código (en mi caso vb) para darle funcionalidad a esta solución para saber cuando se presione el botón y el de que fila se presiona.

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
Dim Indice As Int32 = Convert.ToInt32(e.CommandArgument)
Dim Row As GridViewRow = GridView1.Rows(Indice)

If e.CommandName = "Boton1" Then
' Acá detectamos que se presionó en botón y la fila, la devuelve el indice.
' Además el control Row lo agregué por si para ver que es posible guardar todos los items de la fila seleccionada en este.
End If
End Sub

Espero haya sido de utilidad.

Saludos,

Mariano Llarin.-

domingo, 22 de agosto de 2010

Conectarse a bases de datos Sql Server CE

Formato del connectionString para una base de datos Sql Server CE:

"Connection.ConnectionString=“DataSource=My Documents\database.sdf"

Para utilizar esta conección desde visual studio desarrollando aplicaciones para dispositivos móviles deberemos declararla de la siguiente forma:

Me.conexion = New SqlServerCe.SqlCeConnection( _ "DataSource=My Documents\northwind.sdf") Me.conexion.Open()


Espacios de nombres utilizados:


Imports System.Data.SqlServerCe

Imports System.Data.SqlClient


Guardar y leer archivos XML en dispositivos móviles.

Un archivo XML puede ser tratado como una base de datos local en dispositivos móviles. Para esto vamos a mostrar como crear un archivo XML y llenarlo con datos. Luego como realizar la lectura del mismo.

Para crear el archivo XML, suponiendo que tenemos un dataset creado:

Dim FS As New System.IO.FileStream("windows\archivo.xml", _
System.IO.FileMode.Create)

Dim XMLTW As New System.Xml.XmlTextWriter( _
FS, System.Text.Encoding.Unicode)

' El dataset ya creado y con información. Lo guardo dentro del XMLTextWriter
DS.WriteXml(XMLTW, XmlWriteMode.WriteSchema)
XMLTW.Close()

Luego, para poder leerlo, realizamos lo siguiente:

Dim DS2 As New DataSet
Dim FS As New System.IO.FileStream("windows\archivo.xml", _
System.IO.FileMode.Open)
Dim XMLR As New System.Xml.XmlTextReader(FS)
DS2.ReadXml(XMLR, XmlReadMode.ReadSchema )
myXMLReader.Close()

Dim unaFila As DataRow
Dim i As Integer
For i = 0 To DS2.Tables("Archivo").Rows.Count - 1
unaFila = DS2.Tables("Archivo").Rows(i)
MessageBox.Show(("Archivo" & i.ToString & "= " & _ unaFila("Nombre")))
Next i

sábado, 21 de agosto de 2010

ASP.NET - Datos agrupados en GridView

Dentro de una grilla del tipo GridView para aplicaciones ASP.NET es posible realizar agrupados.

En este caso voy a hacer un agrupado sin duplicar el header de la grilla, o sea que manteniendo un único header voy a crear un agrupado con la información que queramos agregar en el mismo y agregando algunos botones por medio de HTML para hacerlo un poco más completo.

Ejemplo:

Esta es la grilla vista desde la página aspx, en la misma pareciera que no se está agrupando nada pero cambia la vista luego de compilarse.



El código aspx sería el siguiente:




<asp:GridView ID="Grd" runat="server" AutoGenerateColumns="False" CellSpacing="1"
CaptionAlign="Top" CellPadding="1" DataKeyNames="Col1,Col2,Col11"
CssClass="Estilo16">

<RowStyle CssClass="Estilo16" BorderStyle="Solid" />

<Columns>
<asp:BoundField DataField="Col1" HeaderText="" Visible="False"><ItemStyle Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col2" HeaderText="" Visible="False" />
<asp:BoundField HeaderText="Col3" DataField="" ReadOnly="True" ><ItemStyle Width="12%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col4" HeaderText="" ReadOnly="True" ><ItemStyle Width="34%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col5" HeaderText="" ReadOnly="True" ><ItemStyle Width="10%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col6" HeaderText="" ReadOnly="True" ><ItemStyle Width="7%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col7" HeaderText="" ReadOnly="True" ><ItemStyle Width="7%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col8" HeaderText="" ReadOnly="True" ><ItemStyle Width="7%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col9" HeaderText="" ReadOnly="True" ><ItemStyle Width="5%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col10" HeaderText="" ReadOnly="True" ><ItemStyle Width="10%" Height="20px" /></asp:BoundField>
<asp:CommandField ButtonType="Image" HeaderText="" SelectImageUrl="~/imagenes/lupa.gif" ShowSelectButton="True" ><ItemStyle Width="5%" Height="20px" /></asp:CommandField>
<asp:CommandField ButtonType="Image" DeleteImageUrl="~/imagenes/btnBaja.png" HeaderText="" ShowDeleteButton="True" ><ItemStyle Width="4%" Height="20px" /></asp:CommandField>
<asp:BoundField DataField="Col10" HeaderText="" Visible="False" ReadOnly="True" />
<asp:BoundField DataField="Col11" HeaderText="" Visible="False" />
</Columns>
<HeaderStyle BackColor="#E8E8E8" CssClass="tabla" Height="29px" />
</asp:GridView>



Este es el código VB:




Private Sub Grd_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Grd.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim DRowV As DataRowView = e.Row.DataItem
Dim unColorFila As New Color

' Este código se utiliza con la recuperación de algunas columnas de un Stored procedure.

If Not IsDBNull(DRowV("NumeroCC")) Then
If DRowV("NumeroCC") > 0 Then
If Not IsDBNull(DRowV("Numero")) Then
If DRowV("Numero").ToString.Length > 0 Then
e.Row.Cells(4).Text = DRowV("NumeroCC").ToString & " - " & DRowV("Numero").ToString
End If
Else
e.Row.Cells(4).Text = DRowV("NumeroCC").ToString
End If
End If
End If

unColorFila = Color.FromArgb(255, 246, 246, 246)

If Not IsDBNull(DRowV("FechaVto")) And Not IsDBNull(DRowV("Cantidad")) And Not IsDBNull(DRowV("CantidadEntregada")) Then
If CType(DRowV("FechaVto"), Date) < Date.Now Then unColorFila = Color.FromArgb(255, 255, 229, 179)
If (CType(DRowV("Cantidad"), Decimal) <= CType(DRowV("CantidadEntregada"), Decimal)) Then unColorFila = Color.FromArgb(255, 232, 251, 227)
End If

e.Row.BackColor = unColorFila

If Not IsDBNull(DRowV("fecha")) Then
e.Row.Cells(5).Text = CType(DRowV("fecha"), Date).ToShortDateString
End If

If Not IsDBNull(DRowV("fechaVto")) Then
e.Row.Cells(6).Text = CType(DRowV("fechaVto"), Date).ToShortDateString
End If

If Not IsDBNull(DRowV("FechaAsignacion")) Then
e.Row.Cells(7).Text = CType(DRowV("FechaAsignacion"), Date).ToShortDateString
End If

'--------------------------------------------------------------------------------------

Dim table As Table = Grd.Controls(0)

'For Each row As GridViewRow In Grd.Rows

Dim realIndex As Int16 = table.Rows.GetRowIndex(e.Row)

Dim currentEmisor As String = Grd.DataKeys(e.Row.RowIndex).Values(0)
Dim currentID As Long = CType(Grd.DataKeys(e.Row.RowIndex).Values(2), Long)

' Estos son los campos para el agrupado.
If currentEmisor <> lastEmisor Or currentID <> lastID Then
' Acá creo la fila que va a cumplir la función del agrupado.
Dim groupHeaderRow As GridViewRow = New GridViewRow(realIndex, realIndex, DataControlRowType.Separator, DataControlRowState.Normal)
Dim newCell(2) As TableCell

' Agrupado con 2 columnas y un link
newCell(0) = New TableCell
newCell(0).ColumnSpan = 4
newCell(0).HorizontalAlign = HorizontalAlign.Left
newCell(0).CssClass = "tabla_botonera1"
newCell(0).Font.Bold = True
newCell(0).ControlStyle.BorderColor = Color.Transparent
newCell(0).ControlStyle.BorderStyle = BorderStyle.Solid
newCell(0).ControlStyle.BorderWidth = 0

If Not IsDBNull(DRowV("CompraDirecta")) Then
If DRowV("CompraDirecta").ToString = "1" Then
newCell(0).Text = "<span class=textoGris>&nbsp;&nbsp;Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=Estilo28>&nbsp;&nbsp;&nbsp;(Compra Directa)</span><span class=txtgeneral>&nbsp;&nbsp;&nbsp;" & currentEmisor & "</span><span class=mano onClick=MM_openBrWindow('Archivos_adjuntos.aspx?Id=" & currentID & "&ID_Nro=" & DRowV("Nro") & "','Archivos','resizable=yes','540','300','true')><strong>&nbsp;&nbsp;&nbsp;Archivos Adjuntos</strong></span>"
'newCell(0).Text = "<span class=textoGris>&nbsp;&nbsp;Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=Estilo28>&nbsp;&nbsp;&nbsp;(Compra Directa)</span><span class=txtgeneral>&nbsp;&nbsp;&nbsp;" & currentCategory & "</span><asp:linkbutton runat=server ID=lnkAdjuntos Text=Archivos Adjuntos cssclass=mano/>"
Else
newCell(0).Text = "<span class=textoGris>&nbsp;&nbsp;Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral>&nbsp;&nbsp;&nbsp;" & currentEmisor & "</span><span class=mano onClick=MM_openBrWindow('Archivos_adjuntos.aspx?Id=" & currentID & "&ID_Nro=" & DRowV("Nro") & "','Archivos','resizable=yes','540','300','true')><strong>&nbsp;&nbsp;&nbsp;Archivos Adjuntos</strong></span>"
'newCell(0).Text = "<span class=textoGris>&nbsp;&nbsp;Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral>&nbsp;&nbsp;&nbsp;" & currentCategory & "</span><asp:linkbutton runat=server ID=lnkAdjuntos Text=Archivos Adjuntos cssclass=mano/>"
End If
Else
newCell(0).Text = "<span class=textoGris>&nbsp;&nbsp;Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral>&nbsp;&nbsp;&nbsp;" & currentEmisor & "</span><span class=mano onClick=MM_openBrWindow('Archivos_adjuntos.aspx?Id=" & currentID & "&ID_Nro=" & DRowV("Nro") & "','Archivos','resizable=yes','540','300','true')><strong>&nbsp;&nbsp;&nbsp;Archivos Adjuntos</strong></span>"
'newCell(0).Text = "<span class=textoGris>&nbsp;&nbsp;Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral>&nbsp;&nbsp;&nbsp;" & currentCategory & "</span><asp:linkbutton runat=server ID=lnkAdjuntos Text=Archivos Adjuntos cssclass=mano/>"
End If
'onClick=MM_openBrWindow('Archivos_adjuntos.aspx','Archivos','resizable=yes','540','300','true')

' Columna con botón imprimir
newCell(1) = New TableCell
newCell(1).ColumnSpan = 2
newCell(1).VerticalAlign = VerticalAlign.Middle
newCell(1).HorizontalAlign = HorizontalAlign.Left
newCell(1).CssClass = "tabla_botonera1"
newCell(1).ControlStyle.BorderColor = Color.Transparent
newCell(1).ControlStyle.BorderStyle = BorderStyle.Solid
newCell(1).ControlStyle.BorderWidth = 0

If Not IsDBNull(DRowV("id_Urgencia")) Then
If DRowV("id_Urgencia").ToString = "1" Then
newCell(1).Text = "<img src=imagenes/Print.png width=16 height=16 align=absmiddle class=mano onClick=MM_openBrWindow('Imprimir.aspx?id=" & currentID & "','Imprimir','resizable=yes','800','600','true')><strong><span class=Estilo26>&nbsp;&nbsp;&nbsp;Urgente</span></strong>"
Else
newCell(1).Text = "<img src=imagenes/Print.png width=16 height=16 align=absmiddle class=mano onClick=MM_openBrWindow('Imprimir.asp?id=" & currentID & "','Imprimir','resizable=yes','800','600','true')>"
End If
Else
newCell(1).Text = "<img src=imagenes/Print.png width=16 height=16 align=absmiddle class=mano onClick=MM_openBrWindow('Imprimir.asp?id=" & currentID & "','Imprimir','resizable=yes','800','600','true')>"
End If

' Columna con nivel de urgencia
newCell(2) = New TableCell
newCell(2).ColumnSpan = 4
newCell(2).VerticalAlign = VerticalAlign.Middle
newCell(2).HorizontalAlign = HorizontalAlign.Left
newCell(2).CssClass = "tabla_botonera1"
newCell(2).ControlStyle.BorderColor = Color.Transparent
newCell(2).ControlStyle.BorderStyle = BorderStyle.Solid
newCell(2).ControlStyle.BorderWidth = 0

If Not IsDBNull(DRowV("id_Estado")) Then
If DRowV("id_Estado").ToString = "5" Then
newCell(2).Text = "<img src=imagenes/fondo_verde.png>"
Else
newCell(2).Text = "<img src=imagenes/fondo_naranja.png>"
End If
Else
newCell(2).Text = "<img src=imagenes/fondo_naranja.png>"
End If

groupHeaderRow.Cells.AddRange(newCell)

table.Controls.AddAt(realIndex, groupHeaderRow)

lastEmisor = currentEmisor
lastID = currentID
End If
End If

End Sub




Espero que con este código puedan crear sus propios agrupados, de una manera quizás más sencilla o algo bien completo para que la grilla sea bien útil y atractiva.

Saludos.

Mariano Llarin.-
Neuquén, Argentina.

viernes, 30 de julio de 2010

Conferencia de ASP.NET MVC 2.0


Conferencia ASP.NET MVC 2.0


Hace poco más de dos años, Microsoft presentaba las primeras versiones del framework ASP.NET MVC. Un framework de código abierto que propone una forma diferente de desarrollar sitios web adoptando prácticas como Test Driven Development, y ofreciendo un mayor control sobre el código cliente generado.




Hoy ya contamos con la versión 2 del framework y te lo queremos mostrar!

El miércoles 11 de agosto 18.30 horas
Argenta Tower Hotel & Suites
Juncal 868 CABA

Oradores: Rodolfo Finochietti (MVP), Diego González (MVP), y Pablo Zaidenvoren.

lunes, 14 de junio de 2010

Habilitar xp_cmdshell en sql server 2008

xp_cmdshell:
Mecanismo que crea un shell de comandos de Windows y lo pasa a una cadena para ejecutarlo desde sql. Los resultados se devuelven como filas de texto


Cuando aparece el mensaje SQL Server bloqueó el acceso a procedimiento 'sys.xp_cmdshell' del componente 'xp_cmdshell' esto se debe a que el mismo está desactivado.

En la versión anterior de sql era posible habilitar esta funcionalidad por medio de la herramienta Surface Area Configuration (SAC). Al ser sustituida por el Management Studio... una de las soluciones para habilitar esta funcionalidad es la siguiente:



Para habilitar esta característica en la versión 2008:


USE master
GO
EXECUTE sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
GO

sábado, 12 de junio de 2010

ASP.NET MVC - Introducción

- Que es?


ASP.NET MVC es un framework metodológico que divide la implementación de una aplicación en 3 roles: modelos, vistas y controladores.





Según el blog de Scott Guthrië...


  • Los “modelos” de una aplicación basada en MVC son los componentes responsables de mantener el estado. Normalmente el estado se guarda en una base de datos (por ejemplo: podríamos tener la clase Producto que se utiliza para representar los datos de la tabla Productos en SQL Server)
  • Las “vistas” son los componentes responsables de mostrar la interfaz de usuario de la aplicación. Esta UI se crea a partir del modelo de datos (por ejemplo: podríamos crear una vista “Edición” que muestre cajas de texto, controles desplegables (dropdownlist) y checkboxes dependiendo del estado actual de un objeto Producto)
  • Los “controladores” de una aplicación basada en MVC son los componentes responsables de la interacción con el usuario final, manipular el modelo y por último elegir una vista para renderizar la UI. En una aplicación MVC la vista solo muestra la información, el controlador es el que administra y responde a las peticiones del usuario y a las interacciones.


Esta separación de la entidad permite tener agilidad y flexibilidad en la construcción y mantenimiento aplicaciones.

Por ejemplo, mediante la separación de las vistas, se puede establecer una iteración en la apariencia de su aplicación sin tocar en cualquiera la lógica de negocio. Además es posible separar el trabajo por roles, de modo que, por ejemplo, los diseñadores pueden trabajar en las vistas, mientras que los desarrolladores trabajan en el modelo.

ASP.NET MVC lleva el poder de este paradigma de desarrollo al desarrollo de aplicaciones ASP.NET, lo que permite utilizar las habilidades de desarrollo de .NET para construir aplicaciones MVC.


Este tipo de desarrollo brinda:

  • Control completo sobre el marcado HTML

  • Permite ricos AJAX y la integración jQuery

  • Le permite crear URLs amigables SEO para su sitio

  • De hacer pruebas de desarrollo impulsado por (TDD) fácil





    Para obtener recursos de este framework visiten el siguiente link:

    ASP.NET MVC


    lunes, 31 de mayo de 2010

    Crear un directorio virtual desde vb.net y asociar al sitio

    Un directorio virtual es una ruta del servidor que no se encuentra en c:\inetpub\wwwroot (lugar habitual de las publicaciones). Igualmente, este puede ser accedido a traves del servidor web como si estuviera dentro de dicho lugar.

    Cuando accedemos a IIS es necesario escribir una dirección de este tipo: http://localhost. De esta forma, estaríamos accediendo en C:\Inetpub\wwwroot, que es llamado directorio particular. Por el contrario, en los directorios virtuales se accede con http://localhost/directorio_virtual, lo cual no tiene que coincidir que el directorio se encuentre en la carpeta de publicación del disco (es decir, no tiene porque exitir en C:\Inetpub\wwwroot\directorio_virtual) pero si existirá en otra ubicación del disco.


    Vamos a realizar esto por código VB.NET y a través de una carpeta existente(con el contenido que irá al sitio) , la copiaremos en la carpeta virtual y asociaremos con IIS.

    Para esto crearemos un procedimiento recursivo de modo que si dentro de la carpeta con archivos existe otra carpeta y archivos, podamos tambien copiarlos.



    Private Sub CopiarArchivos(ByVal Ip_FolderFrom As String, ByVal Ip_FolderTo As String)

    Dim strArchivos As String() = Directory.GetFiles(Ip_FolderFrom)
    Dim strCarpetas As String() = Directory.GetDirectories(Ip_FolderFrom)
    Dim NombreArchivo As String = ""
    Dim NombreCarpeta As String = ""

    ' Recorro todos los subdirectorios del directorio.
    For Each SubDirectorio As String In strCarpetas
    ' Creo la carpeta en el subdirectorio
    NombreCarpeta = Mid(SubDirectorio, SubDirectorio.LastIndexOf("\") + 2,SubDirectorio.Length)

    Directory.CreateDirectory(Ip_FolderTo & NombreCarpeta)

    ' Llamo de nuevo al procedimiento para copiar los archivos.
    Call CopiarArchivos(Ip_FolderFrom & "\" & NombreCarpeta,Ip_FolderTo & NombreCarpeta & "\")

    Next

    ' Recorro todos los archivos del directorio
    For Each Archivo As String In strArchivos

    ' Copio cada archivo en la carpeta destino (Ruta de instalacion ingresada)
    NombreArchivo = Mid(Archivo, Archivo.LastIndexOf("\") + 2, Archivo.Length)
    If Not File.Exists(Ip_FolderTo & NombreArchivo) Then File.Copy(Archivo, Ip_FolderTo & NombreArchivo, False)

    Next

    End Sub





    Con esta función podremos copiar los archivos y carpetas del sitio en la ubicación que elijamos.

    Luego con esto realizado podremos agregar la función que nos permita crear en IIS el sitio web apuntado al directorio virtual.


    Espacio utilizado: System.DirectoryServices




    Private Sub CreateVirtualDir(ByVal WebSite As String, ByVal AppName As String, ByVal Path As String)

    Try

    Dim IISSchema As New System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/Schema/AppIsolated")
    Dim CanCreate As Boolean = Not IISSchema.Properties("Syntax").Value.ToString.ToUpper() = "BOOLEAN"
    IISSchema.Dispose()

    If CanCreate Then
    Dim PathCreated As Boolean

    Try
    Dim IISAdmin As New DirectoryEntry("IIS://" & WebSite & "/W3SVC/1/Root")

    'Crear el sitio y asociar al directorio virtual
    Dim VDir As DirectoryEntry = IISAdmin.Children.Add(AppName, "IIsWebVirtualDir")

    VDir.Properties("Path").Item(0) = Path
    VDir.Properties("AppFriendlyName").Item(0) = AppName
    VDir.Properties("EnableDirBrowsing").Item(0) = False
    VDir.Properties("AccessRead").Item(0) = True
    VDir.Properties("AccessExecute").Item(0) = True
    VDir.Properties("AccessWrite").Item(0) = False
    VDir.Properties("AccessScript").Item(0) = True
    VDir.Properties("AuthNTLM").Item(0) = True
    VDir.Properties("EnableDefaultDoc").Item(0) = True
    VDir.Properties("DefaultDoc").Item(0) = "index.aspx" ' Pagina por defecto.
    VDir.Properties("AspEnableParentPaths").Item(0) = True

    VDir.CommitChanges()

    'the following are acceptable params
    'INPROC = 0
    'OUTPROC = 1
    'POOLED = 2
    VDir.Invoke("AppCreate", 1)

    Me.Hide()
    frmFinInstalacion.Show()

    Catch Ex As Exception
    If PathCreated Then
    System.IO.Directory.Delete(Path)
    End If
    If Ex.GetHashCode.ToString() = "7588182" Then
    Throw New Exception("El directorio virtual ya se encuentra creado.")
    Else
    Throw Ex
    End If


    End Try
    End If
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try
    End Sub






    Espero que esto sea útil para más de uno ya que es un poco complicado hacer estas cosas sin un instalador y a veces necesario.

    Saludos.

    Mariano Llarin.-