Solved

VB.NET Create Virtual Directory

Posted on 2008-10-17
8
791 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
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 

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
 
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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: Kraeven
Introduction Remote Share is a simple remote sharing tool, enabling you to see, add and remove remote or local shares. The application is written in VB.NET targeting the .NET framework 2.0. The source code and the compiled programs have been in…
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…

831 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