views:

104

answers:

1

I'm using the following function to create an IIS7 Application and/or Virtual Directory.

How would I also set the Application to use a different Application Pool?

Private Sub CreateVirtualDir(ByVal WebSite As String, ByVal AppName As String, ByVal Path As String, Optional ByVal IsApplication As Boolean = True, Optional ByVal RunScripts As Boolean = True, Optional ByVal IsWrite As Boolean = True)

  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
    If IsApplication Then
      VDir.Properties("AppFriendlyName").Item(0) = AppName
    End If
    VDir.Properties("EnableDirBrowsing").Item(0) = False
    VDir.Properties("AccessRead").Item(0) = True
    VDir.Properties("AccessExecute").Item(0) = False
    VDir.Properties("AccessWrite").Item(0) = IsWrite
    VDir.Properties("AccessScript").Item(0) = RunScripts
    VDir.Properties("AuthNTLM").Item(0) = True
    VDir.Properties("EnableDefaultDoc").Item(0) = True
    VDir.Properties("DefaultDoc").Item(0) = "default.htm,default.aspx,default.asp"
    VDir.Properties("AspEnableParentPaths").Item(0) = True
    ''VDir.Properties("AppCreate").Item(0) = False
    VDir.CommitChanges()

    ''the following are acceptable params
    ''INPROC = 0
    ''OUTPROC = 1
    ''POOLED = 2
    If IsApplication Then
      VDir.Invoke("AppCreate", 1)
    Else
      VDir.Invoke("AppCreate", False)
    End If
    Catch Ex As Exception
    If PathCreated Then
      System.IO.Directory.Delete(Path)
    End If
    ''MsgBox(Ex.Message)
    End Try
  End If
End Sub
+1  A: 

Just before you do VDir.CommitChanges() insert this line:

VDir.Properties("AppPoolId").Item(0) = "<your_app_pool_name>"
Kev
Actually - that didn't work after all. Is there another setting that needs to go along with it or something? I even tried changing the VDir.Invoke("AppCreate", 1) to VDir.Invoke("AppCreate", 2) for POOLED but that didn't work either.
EdenMachine
@EdenMachine - I ran your code locally and it worked ok. Do you really need to use System.DirectoryServices? It's much easier to do this using Microsoft.Web.Administration on IIS7.x.
Kev
Yes, I use all that - I'll keep trying then if you're able to get it to work.
EdenMachine