Colaboraciones en el Guille

Creación de un Sitio Virtual en IIS con Visual Basic.Net

 

Fecha: 15/Oct/2005 (13 de Octubre de 2005)
Autor: Bruno Capuano - bcapuano@gmail.com

 


Introducción

Una de las tantas librerías interesantes que posee el .Net Framework es la System.DirectoryServices. Esta librería permite acceder a los objetos de Active Directory , desde .Net. Dentro del mismo, podemos trabajar con dos clases principales DirectoryEntry y DirectorySearcher, que utilizan ell modelo de objetos de ADSI (Active Directory Services Interfaces). Con ADSI, podemos identificar y gestionar los diferentes recursos de Active Directory.

Para este ejemplo es necesario poseer un conocimiento general de la tecnología de Active Directory , y de los objetos que presenta. Les aconsejo esta sección, Introducción a los objetos de Active Directory.

Active Directoryes una estructura de árbol. Cada nodo del árbol contiene un conjunto de propiedades. Se puede utilizar este espacio de nombres para recorrer, buscar y modificar el árbol, y leer y escribir en las propiedades de un nodo.

La clase DirectoryEntry encapsula un nodo u objeto en la jerarquía de Active Directory . Se puede utilizar esta clase para enlazar objetos, leer propiedades y actualizar atributos. El objeto DirectoryEntry, junto con las clases auxiliares, proporciona compatibilidad con métodos de administración del ciclo de vida y métodos de desplazamiento, entre los que se incluyen la creación, la eliminación, el cambio de nombre, el desplazamiento de un nodo secundario, y la enumeración de nodos secundarios.

Se puede utilizar la clase DirectorySearcher para realizar consultas en la jerarquía de Active Directory. LDAP es el único proveedor de interfaces de servicios de Active Directory (Active Directory Service Interfaces, ADSI) del sistema compatible con la operación de búsqueda.

Una búsqueda de la jerarquía de Active Directory mediante DirectorySearcher devuelve instancias de SearchResult, que están contenidas en instancias de clase SearchResultCollection.

Objetivos

En este caso, accederemos al directorio raiz donde esté instalado el servicio IIS (Internet Information Server) y crearemos un directorio virtual, que haga referencia a un directorio físico determinado. Para ello hemos encapsulado la logica necesaria en una clase llamada IISUtil.vb. Esta clase fué creada a partir de una serie de ejemplos del MSDN y se fué depurando para obtener una clase mas concreta (gracias Lechu y Gustavo).

Esta clase posee dos métodos estáticos para crear y eliminar un directorio virtual. (Pueden encontrar el código completo al final del artículo o en la solución completa)

Public Function CreateVDir(ByVal WebSite As String, ByVal VDirName As String, ByVal Path As String, ByVal RootDir As Boolean, ByVal chkRead As Boolean, ByVal chkWrite As Boolean, ByVal chkExecute As Boolean, ByVal chkScript As Boolean, ByVal chkAuth As Boolean, ByVal webSiteNum As Integer, ByVal serverName As String) As String

  ' Code

End Function

Public Function DeleteVDir(ByVal WebSite As String, ByVal VDirName As String, ByVal Path As String, ByVal RootDir As Boolean, ByVal chkRead As Boolean, ByVal chkWrite As Boolean, ByVal chkExecute As Boolean, ByVal chkScript As Boolean, ByVal chkAuth As Boolean, ByVal webSiteNum As Integer, ByVal serverName As String) As String

  ' Code

End Function

Para continuar con el ejemplo, poseemos un formulario que permite seleccionar un directorio físico y especificar un nombre para el directorio virtual. Llamando al metodo CreateVDir, podemos crear un Virtual Site.

Desarrollo

Si miramos el código de la funcion CreateVDir, podemos encontrar las siguientes secciones;

' Determinar version del IIS

IISSchema = New System.DirectoryServices.DirectoryEntry("IIS://" & serverName & "/Schema/AppIsolated")

If IISSchema.Properties("Syntax").Value.ToString().ToUpper() = "BOOLEAN" Then

  IISUnderNT = True

Else

  IISUnderNT = False

End If

IISSchema.Dispose()

' Obtener el ADMIN

IISAdmin = New System.DirectoryServices.DirectoryEntry("IIS://" & serverName &"/W3SVC/" & webSiteNum & "/Root") 

  ' Crear el root si es necesario

 If Not RootDir Then

  ' borrar el directorio virtual si ya existe

 Dim v As System.DirectoryServices.DirectoryEntry

 For Each v In IISAdmin.Children

   If v.Name = VDirName Then

     ' eliminacion

      Try

       IISAdmin.Invoke("Delete", New String() {v.SchemaClassName, VDirName})

       IISAdmin.CommitChanges()

     Catch ex As Exception

       sRet &= ex.Message

      End Try

    End If

   Next v

  End If

  ' crear el directorio virtual

 If Not RootDir Then

   VDir = IISAdmin.Children.Add(VDirName, "IIsWebVirtualDir")

  Else

   VDir = IISAdmin

  End If  

' configurar el directorio virtual

VDir.Properties("AccessRead")(0) = chkRead

VDir.Properties("AccessExecute")(0) = chkExecute

VDir.Properties("AccessWrite")(0) = chkWrite

VDir.Properties("AccessScript")(0) = chkScript

VDir.Properties("AuthNTLM")(0) = chkAuth

VDir.Properties("EnableDefaultDoc")(0) = True

VDir.Properties("EnableDirBrowsing")(0) = False

VDir.Properties("DefaultDoc")(0) = True

VDir.Properties("Path")(0) = Path

VDir.Properties("DefaultDoc")(0) = "default.aspx"

' no soportado por NT

If Not IISUnderNT Then

  VDir.Properties("AspEnableParentPaths")(0) = True

End If

' Commit

VDir.CommitChanges()  

  ' crear la aplicacion web

 If IISUnderNT Then

   VDir.Invoke("AppCreate", False)

  Else

   VDir.Invoke("AppCreate", 1)

  End If  

 

Conclusión

Como podemos apreciar, trabajando con los objetos de Active Directory a través de la librería System.DirectoryServices, podemos realizar tareas una gran variedad de tareas, algunas tan simples como crear o eliminar un directorio virtual del IIS y otras más complejas como autenticar un usuario frente a un determinado dominio.

Para esto debemos conocer los métodos y propiedades para manipular completamente un Active Directory, y estudiando más a fondo las propiedades de los objetos de Active Directory, podemos interactuar con otros objetos como; los grupos de usuarios, los recursos compartidos, etc. Les dejo la inquietud. :D

 

Saludos desde Madrid

El Bruno

http://spaces.msn.com/members/brunocapuano


 

Código Fuente

Este es el código completo para la creación y eliminación de directorios virtuales.
 

                    Public Function CreateVDir(ByVal WebSite As String, ByVal VDirName As String, ByVal Path As String, ByVal RootDir As Boolean, ByVal chkRead As Boolean, ByVal chkWrite As Boolean, ByVal chkExecute As Boolean, ByVal chkScript As Boolean, ByVal chkAuth As Boolean, ByVal webSiteNum As Integer, ByVal serverName As String) As String

      Dim sRet As String = [String].Empty

      Dim IISSchema As System.DirectoryServices.DirectoryEntry

      Dim IISAdmin As System.DirectoryServices.DirectoryEntry

      Dim VDir As System.DirectoryServices.DirectoryEntry

      Dim IISUnderNT As Boolean

 

      ' Determinar version del IIS

      IISSchema = New System.DirectoryServices.DirectoryEntry("IIS://" & serverName & "/Schema/AppIsolated")

 

      If IISSchema.Properties("Syntax").Value.ToString().ToUpper() = "BOOLEAN" Then

        IISUnderNT = True

      Else

        IISUnderNT = False

      End If

      IISSchema.Dispose()

 

      ' Obtener el ADMIN

      IISAdmin = New System.DirectoryServices.DirectoryEntry("IIS://" & serverName & "/W3SVC/" & webSiteNum & "/Root")

 

      ' Crear el root si es necesario

      If Not RootDir Then

 

        ' borrar el directorio virtual si ya existe

        Dim v As System.DirectoryServices.DirectoryEntry

        For Each v In IISAdmin.Children

          If v.Name = VDirName Then

            ' eliminacion

            Try

              IISAdmin.Invoke("Delete", New String() {v.SchemaClassName, VDirName})

              IISAdmin.CommitChanges()

            Catch ex As Exception

              sRet &= ex.Message

            End Try

          End If

        Next v

      End If

 

      ' crear el directorio virtual

      If Not RootDir Then

        VDir = IISAdmin.Children.Add(VDirName, "IIsWebVirtualDir")

      Else

        VDir = IISAdmin

      End If

 

      ' configurar el directorio virtual

      VDir.Properties("AccessRead")(0) = chkRead

      VDir.Properties("AccessExecute")(0) = chkExecute

      VDir.Properties("AccessWrite")(0) = chkWrite

      VDir.Properties("AccessScript")(0) = chkScript

      VDir.Properties("AuthNTLM")(0) = chkAuth

      VDir.Properties("EnableDefaultDoc")(0) = True

      VDir.Properties("EnableDirBrowsing")(0) = False

      VDir.Properties("DefaultDoc")(0) = True

      VDir.Properties("Path")(0) = Path

      VDir.Properties("DefaultDoc")(0) = "default.aspx"

 

      ' no soportado por NT

      If Not IISUnderNT Then

        VDir.Properties("AspEnableParentPaths")(0) = True

      End If

 

      ' Commit

      VDir.CommitChanges()

 

      ' crear la aplicacion web

      If IISUnderNT Then

        VDir.Invoke("AppCreate", False)

      Else

        VDir.Invoke("AppCreate", 1)

      End If

 

      sRet &= "VRoot " & VDirName & " created!"

      Return sRet

    End Function

 

    Public Function DeleteVDir(ByVal WebSite As String, ByVal VDirName As String, ByVal Path As String, ByVal RootDir As Boolean, ByVal chkRead As Boolean, ByVal chkWrite As Boolean, ByVal chkExecute As Boolean, ByVal chkScript As Boolean, ByVal chkAuth As Boolean, ByVal webSiteNum As Integer, ByVal serverName As String) As String

      Dim sRet As String = [String].Empty

      Dim IISSchema As System.DirectoryServices.DirectoryEntry

      Dim IISAdmin As System.DirectoryServices.DirectoryEntry

      Dim VDir As System.DirectoryServices.DirectoryEntry

      Dim IISUnderNT As Boolean

 

      ' determinar version de IIS

      IISSchema = New System.DirectoryServices.DirectoryEntry("IIS://" & serverName & "/Schema/AppIsolated")

 

      If IISSchema.Properties("Syntax").Value.ToString().ToUpper() = "BOOLEAN" Then

        IISUnderNT = True

      Else

        IISUnderNT = False

      End If

      IISSchema.Dispose()

 

      ' obtener el ADMIN

      IISAdmin = New System.DirectoryServices.DirectoryEntry("IIS://" & serverName & "/W3SVC/" & webSiteNum & "/Root")

 

      ' verificar el root directory

      If Not RootDir Then

        ' eliminar el virtual directory si ya existe

        Dim v As System.DirectoryServices.DirectoryEntry

        For Each v In IISAdmin.Children

          If v.Name = VDirName Then

            ' eliminacion

            Try

              IISAdmin.Invoke("Delete", New String() {v.SchemaClassName, VDirName})

              IISAdmin.CommitChanges()

            Catch ex As Exception

              sRet &= ex.Message

            End Try

          End If

        Next v

      End If

 

 

      sRet &= "VRoot " & VDirName & " created!"

      Return sRet

    End Function

 


Espacios de nombres usados en el código de este artículo:

System
System.DirectoryServices


Fichero con el código de ejemplo: bcapuano_Creacion_de_un_Sitio_Virtual_en_IIS_Con_VBNet.zip - 10 KB


ir al índice principal del Guille