Click here to Skip to main content
15,896,118 members
Articles / Web Development / IIS

IIsManager

Rate me:
Please Sign up or sign in to vote.
4.56/5 (9 votes)
20 Aug 2008Ms-PL 37.5K   211   26  
Manage IIS 6 in .NET
#Region "Imports"
Imports System.DirectoryServices
#End Region

Public Class IIsService
    Implements IDisposable

#Region "Privates"

    Private _ServiceEntry As DirectoryEntry
    Private _ApplicationPoolsEntry As DirectoryEntry

#End Region

#Region "Properties"

    Public ReadOnly Property Sites() As IIsSite()
        Get

            Dim WebSites() As IIsSite = {}

            Try

                Dim SiteEntries = From wse As DirectoryEntry In _ServiceEntry.Children _
                                  Where wse.SchemaClassName = SiteSchemaClassName _
                                  Select wse

                For Each se In SiteEntries

                    ReDim Preserve WebSites(WebSites.Length)
                    WebSites(WebSites.Length - 1) = New IIsSite(se, New DirectoryEntry(se.Path & "/Root"))

                Next

            Catch ex As Exception

                GetPropertyEx("Sites", ex)

            End Try

            Return WebSites

        End Get
    End Property

    Public ReadOnly Property ApplicationPools() As IIsApplicationPool()
        Get

            Dim AppPools() As IIsApplicationPool = {}

            Try

                Dim AppPoolEntries = From ape As DirectoryEntry In _ApplicationPoolsEntry.Children _
                                     Where ape.SchemaClassName = ApplicationPoolSchemaClassName _
                                     Select ape

                For Each ae In AppPoolEntries

                    ReDim Preserve AppPools(AppPools.Length)
                    AppPools(AppPools.Length - 1) = New IIsApplicationPool(ae)

                Next

            Catch ex As Exception

                GetPropertyEx("ApplicationPools", ex)

            End Try

            Return AppPools

        End Get
    End Property

#End Region

#Region "Constructors and Destructors"

    Public Sub New()

        Dim ServiceName = FirstServiceName()
        Dim AppPoolsName = FirstAppPoolsName()

        If ServiceName = String.Empty Then

            Throw New Exception("No IIS Web Service Metabase entry found on this machine.")

        Else

            _ServiceEntry = New DirectoryEntry(IIsProviderPath & "/" & ServiceName)
            _ServiceEntry.RefreshCache()

        End If

        If AppPoolsName = String.Empty Then

            Throw New Exception("No Application Pools Metabase entry found on this machine.")

        Else

            _ApplicationPoolsEntry = New DirectoryEntry(IIsProviderPath & "/" & ServiceName & "/" & AppPoolsName)
            _ApplicationPoolsEntry.RefreshCache()

        End If

    End Sub

    Protected Overrides Sub Finalize()

        If Not _ApplicationPoolsEntry Is Nothing Then _ApplicationPoolsEntry.Close()
        If Not _ServiceEntry Is Nothing Then _ServiceEntry.Close()

    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose

        If Not _ApplicationPoolsEntry Is Nothing Then _ApplicationPoolsEntry.Close()
        If Not _ServiceEntry Is Nothing Then _ServiceEntry.Close()

    End Sub

#End Region

#Region "Private Functions and Methods"

    Private Function FirstServiceName() As String

        Dim IIsEntry As DirectoryEntry = Nothing
        Dim ServiceName = ""

        Try

            IIsEntry = New DirectoryEntry(IIsProviderPath)

            ServiceName = (From de As DirectoryEntry In IIsEntry.Children _
                           Where de.SchemaClassName = ServiceSchemaClassName _
                           Select de.Name).FirstOrDefault

        Catch ex As Exception

        Finally

            If Not IIsEntry Is Nothing Then IIsEntry.Close()

        End Try

        Return ServiceName

    End Function

    Private Function FirstAppPoolsName() As String

        Dim IIsEntry As DirectoryEntry = Nothing
        Dim AppPoolsName = ""

        Try

            IIsEntry = New DirectoryEntry(IIsProviderPath & "/" & FirstServiceName())

            AppPoolsName = (From de As DirectoryEntry In IIsEntry.Children _
                            Where de.SchemaClassName = ApplicationPoolsSchemaClassName _
                            Select de.Name).FirstOrDefault

        Catch ex As Exception

        Finally

            If Not IIsEntry Is Nothing Then IIsEntry.Close()

        End Try

        Return AppPoolsName

    End Function

#End Region

#Region "Public Functions and Methods"

    Public Function AddAppPool(ByVal Id As String) As IIsApplicationPool

        AddAppPool = Nothing

        Try

            Dim ae As DirectoryEntry = _ApplicationPoolsEntry.Invoke("Create", ApplicationPoolSchemaClassName, Id)

            ae.CommitChanges()

            AddAppPool = New IIsApplicationPool(ae)

            ae.Close()

        Catch ex As Exception

            Throw New Exception(String.Format("An error occured while trying to add Application Pool '{0}'.", Id), ex)

        End Try

    End Function

    Public Function RemoveAppPool(ByVal Id As String) As Boolean

        Try

            _ApplicationPoolsEntry.Invoke("Delete", ApplicationPoolSchemaClassName, Id)

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function

    Public Function AddSite(ByVal Description As String, ByVal Path As String, ByVal Bindings() As SiteBinding) As IIsSite

        Try

            Dim ObjectsA() As Object

            If Bindings.Length > 0 Then

                ReDim ObjectsA(Bindings.Length - 1)

                For wsbI = 0 To Bindings.Length - 1

                    ObjectsA(wsbI) = String.Format("{0}:{1}:{2}", Bindings(wsbI).IP, Bindings(wsbI).Port, Bindings(wsbI).HostHeader)

                Next

            Else

                ObjectsA = New Object() {}

            End If

            Dim SiteId As String = _ServiceEntry.Invoke("CreateNewSite", Description, ObjectsA, Path)

            Dim ws = New DirectoryEntry(_ServiceEntry.Path & "\" & SiteId)
            Dim wr = New DirectoryEntry(ws.Path & "\Root")

            Return New IIsSite(ws, wr)

        Catch ex As Exception

            Return Nothing

        End Try

    End Function

    Public Function AddSite(ByVal Description As String, ByVal Path As String, ByVal Binding As SiteBinding) As IIsSite

        Return AddSite(Description, Path, New SiteBinding() {Binding})

    End Function

    Public Function AddSite(ByVal Description As String, ByVal Path As String, ByVal BindingHostHeader As String, Optional ByVal BindingPort As Integer = 80, Optional ByVal BindingIP As String = "") As IIsSite

        Return AddSite(Description, Path, New SiteBinding With {.IP = BindingIP, .Port = BindingPort, .HostHeader = BindingHostHeader})

    End Function

    Public Function RemoveSite(ByVal Id As String) As Boolean

        Try

            _ServiceEntry.Invoke("Delete", SiteSchemaClassName, Id)

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function

#End Region

End Class

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


Written By
Software Developer (Senior)
Netherlands Netherlands
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions