VB.NET Create Virtual Directory

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

azyet24Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
azyet24Author Commented:
>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
PaulHewsCommented:
Maybe you should post the full source for which you are having the problem.
0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

azyet24Author Commented:

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

>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
azyet24Author Commented:
Yes that worked perfectly.  Woulld you also know how to delete a website and/or virtual domain via vb.net?
0
PaulHewsCommented:
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
PaulHewsCommented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.