Solved

VB.NET Create Virtual Directory

Posted on 2008-10-17
8
778 Views
Last Modified: 2012-05-05
I am using two scripts that I found that I can create a Virtual Dirctory or Web Site.  I have two questions:

CreateVirtualDir:  When I run this, it creats the virtual directory fine, but it creates it in the Default Web site.  I'd like to specify a Web site for the VD to be created.  How?

CreateWebsite:  This creates a web site with no problems, however it does not automatically start.  How can I invoke start?  Lastly, how do I get this to first check if the web site exists and if so not add the site again?
Sub CreateVirtualDir(ByVal WebSite As String, ByVal AppName As String, ByVal Path As String)

 

        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 System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/W3SVC/1/Root")

 

                'make sure folder exists

                If Not System.IO.Directory.Exists(Path) Then

                    System.IO.Directory.CreateDirectory(Path)

                    PathCreated = True

                End If

 

                'If the virtual directory already exists then delete it

                For Each VD As System.DirectoryServices.DirectoryEntry In IISAdmin.Children

                    If VD.Name = AppName Then

                        IISAdmin.Invoke("Delete", New String() {VD.SchemaClassName, AppName})

                        IISAdmin.CommitChanges()

                        Exit For

                    End If

                Next VD

          'Create and setup new virtual directory

                    Dim VDir As System.DirectoryServices.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) = True

                    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"

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

                    VDir.CommitChanges()

 

                    'the following are acceptable params

                    'INPROC = 0

                    'OUTPROC = 1

                    'POOLED = 2

                    VDir.Invoke("AppCreate", 1)

                End If

            Catch Ex As Exception

                If PathCreated Then

                    System.IO.Directory.Delete(Path)

                End If

                Throw Ex

            End Try        

    End Sub

    Public Function CreateWebsite(ByVal webserver As String, ByVal serverComment As String, ByVal serverBindings As String, ByVal homeDirectory As String) As Integer

        Dim w3svc As DirectoryEntry

        w3svc = New DirectoryEntry("IIS://localhost/w3svc")

 

        'Create a website object array

        Dim newsite() As Object

        newsite = New Object() {serverComment, New Object() {serverBindings}, homeDirectory}

 

        'invoke IIsWebService.CreateNewSite

        Dim websiteId As Object

        websiteId = w3svc.Invoke("CreateNewSite", newsite)

           

''''  My Attempt to get the start to work automatically...doesn't work.

        'newsite = w3svc.Invoke("Start", System.DBNull.Value)

 

        Return websiteId

    End Function

Open in new window

0
Comment
Question by:azyet24
  • 5
  • 3
8 Comments
 
LVL 38

Accepted Solution

by:
PaulHews earned 500 total points
ID: 22749059
>CreateWebsite: This creates a web site with no problems, however it does not automatically start. How can I invoke start?

When you create your website, you need to keep track of the websiteID variable that is returned from the invoke. That is the reference you will use for getting a reference to the directoryservices object needed for the invoke:

Dim NewSite As New System.DirectoryServices.DirectoryEntry("IIS://localhost/W3SVC/" & websiteID.ToString)
If Not NewSite Is Nothing Then
NewSite.Invoke("Start", Nothing)
End If

>I'd like to specify a Web site for the VD to be created. How?

Here again, you need to use the websiteID returned above. In this line of the CreateVirtualDir sub, you need to specify the correct ID instead of 1 which is the default web site:

Dim IISAdmin As New System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/W3SVC/" & websiteID.ToString & "/Root")


>Lastly, how do I get this to first check if the web site exists and if so not add the site again?

Since you don't know the ID of the site at this time, only the name, you have to loop through all the sites, and check if the name exists.




    Private Function CheckWebsiteExists(ByVal Name As String) As Boolean

        Using websvc As New System.DirectoryServices.DirectoryEntry("IIS://" & Environment.MachineName & "/W3svc")

            

            For Each site As System.DirectoryServices.DirectoryEntry In websvc.Children

                If site.SchemaClassName = "IIsWebServer" Then

                    Debug.WriteLine(site.Name) 'This is the ID if you want it.

                    If Name = site.InvokeGet("ServerComment").ToString Then

                        Return True

                    End If

                End If

            Next

        End Using

        Return False

    End Function

Open in new window

0
 

Author Comment

by:azyet24
ID: 22749259
>I'd like to specify a Web site for the VD to be created. How?

>Here again, you need to use the websiteID returned above. In this line of the CreateVirtualDir sub, you >need to specify the correct ID instead of 1 which is the default web site:

>Dim IISAdmin As New System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/W3SVC/" & >websiteID.ToString & "/Root")

This is updating the correct website, but it creates application rather than virtualhost (icon is glob instead of folder).  When I right click on the web site, there is two options: Add Application, Add Virtual Host.  I want the virtual host.
0
 
LVL 38

Expert Comment

by:PaulHews
ID: 22750257
Maybe you should post the full source for which you are having the problem.
0
 

Author Comment

by:azyet24
ID: 22750666

CreateVirtualDir("LocalHost", name, "C:\Inetpub\wwwroot\Communities")
 
 

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

        Dim servername As String

        servername = "XPSM1210"

        Dim root As New System.DirectoryServices.DirectoryEntry("IIS://" & servername & "/W3SVC")

        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 System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/W3SVC/" & 2 & "/Root")
 

                'make sure folder exists

                If Not System.IO.Directory.Exists(Path) Then

                    System.IO.Directory.CreateDirectory(Path)

                    PathCreated = True

                End If
 

                'If the virtual directory already exists then delete it

                For Each VD As System.DirectoryServices.DirectoryEntry In IISAdmin.Children

                    If VD.Name = AppName Then

                        IISAdmin.Invoke("Delete", New String() {VD.SchemaClassName, AppName})

                        IISAdmin.CommitChanges()

                        Exit For

                    End If

                Next VD

                Dim avoid As Integer = 1

                If avoid = 1 Then

                    'Create and setup new virtual directory

                    Dim VDir As System.DirectoryServices.DirectoryEntry = IISAdmin.Children.Add(AppName, "IIsWebVirtualDir") '(VDirName, "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) = True

                    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"

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

                    VDir.CommitChanges()
 

                    'the following are acceptable params

                    'INPROC = 0

                    'OUTPROC = 1

                    'POOLED = 2

                    VDir.Invoke("AppCreate", 1)

                End If

            Catch Ex As Exception

                If PathCreated Then

                    System.IO.Directory.Delete(Path)

                End If

                Throw Ex

            End Try

        End If

    End Sub

Open in new window

0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 38

Expert Comment

by:PaulHews
ID: 22753062

>This is updating the correct website, but it creates application rather than virtualhost (icon is glob instead of folder).  When I right click on the web site, there is two options: Add Application, Add Virtual Host.  I want the virtual host.<

Okay, I see what you mean now.  Comment out this line from the above:

VDir.Invoke("AppCreate", 1)

That's what takes your virtual directory and creates an application... I would leave it in if you are deploying an ASP.NET application however.



0
 

Author Comment

by:azyet24
ID: 22753726
Yes that worked perfectly.  Woulld you also know how to delete a website and/or virtual domain via vb.net?
0
 
LVL 38

Expert Comment

by:PaulHews
ID: 22759028
There's a bit in CreateVirtualDir above shows how to delete a virtual directory:

'If the virtual directory already exists then delete it
For Each VD As System.DirectoryServices.DirectoryEntry In IISAdmin.Children
    If VD.Name = AppName Then
        IISAdmin.Invoke("Delete", New String() {VD.SchemaClassName, AppName})
        IISAdmin.CommitChanges()
        Exit For
    End If
Next VD

I'm not sure how to delete a web site, but I think I answered your original question pretty completely.
0
 
LVL 38

Expert Comment

by:PaulHews
ID: 22759149
Okay, this worked to delete a web site.  No error checking or anything, but should give the basic idea.
    Private Sub DeleteWebSite(ByVal ID As String)

        Using web As New System.DirectoryServices.DirectoryEntry("IIS://" & Environment.MachineName & "/W3svc/" & ID)

            web.Invoke("Stop")

            web.DeleteTree()

        End Using

    End Sub

Open in new window

0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

This article explains how to create and use a custom WaterMark textbox class.  The custom WaterMark textbox class allows you to set the WaterMark Background Color and WaterMark text at design time.   IMAGE OF WATERMARKS STEPS Create VB …
Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now