IIS Application - Create

Octopus.Script exported 2017-04-10 by bobjwalker belongs to ‘IIS’ category.

Create an IIS virtual application (a virtual directory with an application pool)

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Virtual path

VirtualPath =

The name of the application to create. For example, to serve an application that will be available at /myapp, enter myapp. To create an application under a parent virtual directory or application, separate with slashes - for example: /applications/myapp

Physical path

PhysicalPath =

Physical folder that the application will serve files from. Example: C:\MyApp.

Parent site

ParentSite =

The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:

Default Web Site

Application pool

ApplicationPoolName =

The name of the application pool that the application will run under.

Protocols

BindingProtocols = http

The protocols to use for the application

Require SSL

RequireSSL = False

Web site SSL settings

Client certificate

ClientCertificate = Ignore

(Require SSL) Defines how to handle client certificates if SSL is required.

Preload Enabled

PreloadEnabled = False

If true, sets the application to enable preloading.

Enable Anonymous authentication

EnableAnonymous = False

Whether IIS should allow anonymous authentication

Enable Basic authentication

EnableBasic = False

Whether IIS should allow basic authentication with a 401 challenge.

Enable Windows authentication

EnableWindows = False

Whether IIS should allow integrated Windows authentication with a 401 challenge.

Set Application Pool Settings

SetApplicationPoolSettings = False

If true, this will allow you to set the Application Pool CLR Version, identity using the .NET CLR Version, Identity, Username, and Password parameters. If false, the other four parameters will be ignored.

Application Pool .NET CLR Version

ApplicationPoolFrameworkVersion = v4.0

The version of the .NET common language runtime that this application pool will use.

Application Pool Identity

ApplicationPoolIdentityType = ApplicationPoolIdentity

Which built-in account will the application pool run under.

Application Pool Username

ApplicationPoolUsername =

The Windows/domain account of the custom user that the application pool will run under. Example: YOURDOMAIN\YourAccount. You will need to ensure that this user has permissions to run as an application pool.

Application Pool Password

ApplicationPoolPassword =

The password for the custom account given above.

Script body

Steps based on this template will execute the following PowerShell script.

## --------------------------------------------------------------------------------------
## Input
## --------------------------------------------------------------------------------------

$virtualPath = $OctopusParameters['VirtualPath']
$physicalPath = $OctopusParameters['PhysicalPath']
$applicationPoolName = $OctopusParameters['ApplicationPoolName']
$setApplicationPoolSettings = [boolean]::Parse($OctopusParameters['SetApplicationPoolSettings'])
$appPoolFrameworkVersion = $OctopusParameters["ApplicationPoolFrameworkVersion"]
$applicationPoolIdentityType = $OctopusParameters["ApplicationPoolIdentityType"]
$applicationPoolUsername = $OctopusParameters["ApplicationPoolUsername"]
$applicationPoolPassword = $OctopusParameters["ApplicationPoolPassword"]

$parentSite = $OctopusParameters['ParentSite']
$bindingProtocols = $OctopusParameters['BindingProtocols']
$authentication = $OctopusParameters['AuthenticationType']
$requireSSL = $OctopusParameters['RequireSSL']
$clientCertificate = $OctopusParameters['ClientCertificate']

$preloadEnabled = [boolean]::Parse($OctopusParameters['PreloadEnabled'])
$enableAnonymous = [boolean]::Parse($OctopusParameters['EnableAnonymous'])
$enableBasic = [boolean]::Parse($OctopusParameters['EnableBasic'])
$enableWindows = [boolean]::Parse($OctopusParameters['EnableWindows'])

## --------------------------------------------------------------------------------------
## Helpers
## --------------------------------------------------------------------------------------
# Helper for validating input parameters
function Validate-Parameter($foo, [string[]]$validInput, $parameterName) {
    Write-Host "${parameterName}: ${foo}"
    if (! $foo) {
        throw "$parameterName cannot be empty, please specify a value"
    }
    
    if ($validInput) {
        @($foo) | % { 
                if ($validInput -notcontains $_) {
                    throw "'$_' is not a valid input for '$parameterName'"
                }
             }  
        }   
}

# Helper to run a block with a retry if things go wrong
$maxFailures = 5
$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4
function Execute-WithRetry([ScriptBlock] $command) {
    $attemptCount = 0
    $operationIncomplete = $true

    while ($operationIncomplete -and $attemptCount -lt $maxFailures) {
        $attemptCount = ($attemptCount + 1)

        if ($attemptCount -ge 2) {
            Write-Output "Waiting for $sleepBetweenFailures seconds before retrying..."
            Start-Sleep -s $sleepBetweenFailures
            Write-Output "Retrying..."
        }

        try {
            & $command

            $operationIncomplete = $false
        } catch [System.Exception] {
            if ($attemptCount -lt ($maxFailures)) {
                Write-Output ("Attempt $attemptCount of $maxFailures failed: " + $_.Exception.Message)
            
            }
            else {
                throw "Failed to execute command"
            }
        }
    }
}

## --------------------------------------------------------------------------------------
## Configuration
## --------------------------------------------------------------------------------------
Validate-Parameter $virtualPath -parameterName "Virtual path"
Validate-Parameter $physicalPath -parameterName "Physical path"
Validate-Parameter $applicationPoolName -parameterName "Application pool"
Validate-Parameter $parentSite -parameterName "Parent site"


Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue
Import-Module WebAdministration -ErrorAction SilentlyContinue


## --------------------------------------------------------------------------------------
## Run
## --------------------------------------------------------------------------------------

Write-Host "Getting web site $parentSite"
# Workaround to bug in Get-WebSite cmdlet which would return all sites
# See http://forums.iis.net/p/1167298/1943273.aspx / http://stackoverflow.com/a/6832577/785750
$site = Get-WebSite  | where { $_.Name -eq $parentSite }
if (!$site) {
    throw "The web site '$parentSite' does not exist. Please create the site first."
}

$path = $site.PhysicalPath;
$parts = $virtualPath -split "[/\\]"
$name = ""

for ($i = 0; $i -lt $parts.Length; $i++) {
    $name = $name + "/" + $parts[$i]
    $name = $name.TrimStart('/').TrimEnd('/')
    if ($i -eq $parts.Length - 1) {
        
    }
    elseif ([string]::IsNullOrEmpty($name) -eq $false -and $name -ne "") {
        Write-Host "Ensuring parent exists: $name"
        
        $path = [IO.Path]::Combine($path, $parts[$i])
        $app = Get-WebApplication -Name $name -Site $parentSite

        if (!$app) {
            $vdir = Get-WebVirtualDirectory -Name $name -site $parentSite
            if (!$vdir) {
                Write-Verbose "The application or virtual directory '$name' does not exist"
                if([IO.Directory]::Exists([System.Environment]::ExpandEnvironmentVariables($path)) -eq $true)
                {
                    Write-Verbose "Using physical path '$path' as parent"
                }
                else
                {
                    throw "Failed to ensure parent"
                }
            }
            else
            {
                $path = $vdir.PhysicalPath
            }
        }
        else
        {
            $path = $app.PhysicalPath
        }
    }
}

$existing = Get-WebApplication -site $parentSite -Name $name

# Set App Pool
Execute-WithRetry { 
	Write-Verbose "Loading Application pool"
	$pool = Get-Item "IIS:\AppPools\$ApplicationPoolName" -ErrorAction SilentlyContinue
	if (!$pool) { 
		Write-Host "Application pool `"$ApplicationPoolName`" does not exist, creating..." 
		new-item "IIS:\AppPools\$ApplicationPoolName" -confirm:$false
		$pool = Get-Item "IIS:\AppPools\$ApplicationPoolName"
	} else {
		Write-Host "Application pool `"$ApplicationPoolName`" already exists"
	}
}

# Set App Pool Identity
Execute-WithRetry { 
	if($setApplicationPoolSettings)
    {
        Write-Host "Set application pool identity: $applicationPoolIdentityType"
        if ($applicationPoolIdentityType -eq "SpecificUser") {
            Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" -name processModel -value @{identitytype="SpecificUser"; username="$applicationPoolUsername"; password="$applicationPoolPassword"}
        } else {
            Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" -name processModel -value @{identitytype="$applicationPoolIdentityType"}
        }
    }
}

# Set .NET Framework
Execute-WithRetry { 
    if($setApplicationPoolSettings)
    {
        Write-Host "Set .NET framework version: $appPoolFrameworkVersion" 
        if($appPoolFrameworkVersion -eq "No Managed Code")
        {
            Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" managedRuntimeVersion ""
        }
        else
        {
            Set-ItemProperty "IIS:\AppPools\$ApplicationPoolName" managedRuntimeVersion $appPoolFrameworkVersion
        }
    }
}

Execute-WithRetry { 
    ## Check if the physical path exits
    if(!(Test-Path -Path $physicalPath)) {
        Write-Host "Creating physical path '$physicalPath'"
        New-Item -ItemType directory -Path $physicalPath
    }

    if (!$existing) {
        Write-Host "Creating web application '$name'"
        New-WebApplication -Site $parentSite -Name $name -ApplicationPool $applicationPoolName -PhysicalPath $physicalPath
        Write-Host "Web application created"
    } else {
        Write-Host "The web application '$name' already exists. Updating physical path:"

        Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -name physicalPath -value $physicalPath
        Write-Host "Physical path changed to: $physicalPath"

        Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -Name applicationPool -Value $applicationPoolName
        Write-Output "ApplicationPool changed to: $applicationPoolName"
    }
    
    Write-Host "Enabling '$bindingProtocols' protocols"
    Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -name enabledProtocols -value $bindingProtocols

    $enabledIisAuthenticationOptions = $Authentication -split '\\s*[,;]\\s*'

    try {

    Execute-WithRetry { 
        Write-Output "Anonymous authentication enabled: $enableAnonymous"
        Set-WebConfigurationProperty -filter /system.webServer/security/authentication/anonymousAuthentication -name enabled -value "$enableAnonymous" -PSPath IIS:\\ -location $parentSite/$virtualPath
    }    
    
    Execute-WithRetry { 
        Write-Output "Windows authentication enabled: $enableWindows"
        Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/windowsAuthentication -name enabled -value "$enableWindows" -PSPath IIS:\\ -location $parentSite/$virtualPath
    }

    Execute-WithRetry { 
        Write-Output "Basic authentication enabled: $enableBasic"
        Set-WebConfigurationProperty -filter /system.webServer/security/authentication/basicAuthentication -name enabled -value "$enableBasic" -PSPath IIS:\\ -location $parentSite/$virtualPath
    }

    } catch [System.Exception] {
        Write-Output "Authentication options could not be set. This can happen when there is a problem with your application's web.config. For example, you might be using a section that requires an extension that is not installed on this web server (such as URL Rewriting). It can also happen when you have selected an authentication option and the appropriate IIS module is not installed (for example, for Windows authentication, you need to enable the Windows Authentication module in IIS/Windows first)"
        throw
    }

    Set-WebConfiguration -value "None" -filter "system.webserver/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\ 
    if ($requireSSL -ieq "True")
    {
        Write-Output "Require SSL enabled: $requireSSL"
        Set-WebConfiguration -value "Ssl" -filter "system.webserver/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\ 
        Write-Output "Client certificate mode: $clientCertificate"
        if ($clientCertificate -ieq "Accept") {
           Set-WebConfigurationProperty -filter "system.webServer/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\ -name "sslFlags" -value "Ssl,SslNegotiateCert"
        }
        if ($clientCertificate -ieq "Require") {
           Set-WebConfigurationProperty -filter "system.webServer/security/access" -location $parentSite/$virtualPath -PSPath IIS:\\ -name "sslFlags" -value "Ssl,SslNegotiateCert,SslRequireCert"
        }
    }
    
    try {
        Set-ItemProperty IIS:\\Sites\\$parentSite\\$name -name preloadEnabled -value $preloadEnabled
        Write-Output "Preload Enabled: $preloadEnabled"
    } catch [System.Exception] {
       if ($preloadEnabled) {
            Write-Output "Preload Enabled: $preloadEnabled Could not be set. You may to install the Application Initialization feature"
            throw
       }
    }
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "5b3e7576-44f8-4852-ae09-a45bd985c549",
  "Name": "IIS Application - Create",
  "Description": "Create an IIS virtual application (a virtual directory with an application pool)",
  "Version": 37,
  "ExportedAt": "2017-04-10T15:13:10.653Z",
  "ActionType": "Octopus.Script",
  "Author": "bobjwalker",
  "Parameters": [
    {
      "Id": "679da415-996c-4ad3-87d5-bb8ce4e1f8d0",
      "Name": "VirtualPath",
      "Label": "Virtual path",
      "HelpText": "The name of the application to create. For example, to serve an application that will be available at `/myapp`, enter `myapp`. To create an application under a parent virtual directory or application, separate with slashes - for example: `/applications/myapp`",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "3eecef84-fe72-4efc-98bf-42aa41a2d488",
      "Name": "PhysicalPath",
      "Label": "Physical path",
      "HelpText": "Physical folder that the application will serve files from. Example: `C:\\MyApp`.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "f2b3a7ef-4d83-4692-a328-fc18cb85fd3e",
      "Name": "ParentSite",
      "Label": "Parent site",
      "HelpText": "The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:\n\n    Default Web Site",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "3cb9971e-a7f2-47e7-8201-fb25c3080bd0",
      "Name": "ApplicationPoolName",
      "Label": "Application pool",
      "HelpText": "The name of the application pool that the application will run under.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "2a5d18bf-50ad-43c4-882b-9314ee2551b4",
      "Name": "BindingProtocols",
      "Label": "Protocols",
      "HelpText": "The protocols to use for the application",
      "DefaultValue": "http",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "07d979ef-c343-4c9c-8681-d3c06f451539",
      "Name": "RequireSSL",
      "Label": "Require SSL",
      "HelpText": "Web site SSL settings",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "3a3a8fe8-9fb0-4db5-85c9-04141f33f32d",
      "Name": "ClientCertificate",
      "Label": "Client certificate",
      "HelpText": "_(Require SSL)_ Defines how to handle client certificates if SSL is required.",
      "DefaultValue": "Ignore",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "Ignore\nAccept\nRequire"
      },
      "Links": {}
    },
    {
      "Id": "174299e5-38dc-4fe9-b25a-6a5bdad05b34",
      "Name": "PreloadEnabled",
      "Label": "Preload Enabled",
      "HelpText": "If true, sets the application to enable preloading.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "1641d3e2-a1e5-4933-b993-6528f1764557",
      "Name": "EnableAnonymous",
      "Label": "Enable Anonymous authentication",
      "HelpText": "Whether IIS should allow anonymous authentication",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "3a52b977-3ea6-482b-8e55-62efd0198b14",
      "Name": "EnableBasic",
      "Label": "Enable Basic authentication",
      "HelpText": "Whether IIS should allow basic authentication with a 401 challenge.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "085a3183-30bc-499e-90bf-9b5bcdf0842a",
      "Name": "EnableWindows",
      "Label": "Enable Windows authentication",
      "HelpText": "Whether IIS should allow integrated Windows authentication with a 401 challenge.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "de7b8dee-bf5a-48ea-99bc-f5b86fcdf118",
      "Name": "SetApplicationPoolSettings",
      "Label": "Set Application Pool Settings",
      "HelpText": "If true, this will allow you to set the Application Pool CLR Version, identity using the .NET CLR Version, Identity, Username, and Password parameters.  If false, the other four parameters will be ignored.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "dd301881-0cd6-40bf-98b4-36e13a587fe2",
      "Name": "ApplicationPoolFrameworkVersion",
      "Label": "Application Pool .NET CLR Version",
      "HelpText": "The version of the .NET common language runtime that this application pool will use.",
      "DefaultValue": "v4.0",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "v2.0|CLR v2.0 (.NET 2.0, 3.0, 3.5)\nv4.0|CLR v4.0 (.NET 4.0, 4.5, 4.6)\nNo Managed Code"
      },
      "Links": {}
    },
    {
      "Id": "92cb9de4-f65f-4855-bc88-d89e6a748f3c",
      "Name": "ApplicationPoolIdentityType",
      "Label": "Application Pool Identity",
      "HelpText": "Which built-in account will the application pool run under.",
      "DefaultValue": "ApplicationPoolIdentity",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "ApplicationPoolIdentity|Application Pool Identity\nLocalService|Local Service\nLocalSystem|Local System\nNetworkService|Network Service\nSpecificUser|Custom user ..."
      },
      "Links": {}
    },
    {
      "Id": "7cbeec84-7fad-46dd-98de-ed61531f8bb3",
      "Name": "ApplicationPoolUsername",
      "Label": "Application Pool Username",
      "HelpText": "The Windows/domain account of the custom user that the application pool will run under. Example: YOURDOMAIN\\\\YourAccount. You will need to ensure that this user has permissions to run as an application pool.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "748a99a2-a9f4-46b2-b9b5-283a864171d3",
      "Name": "ApplicationPoolPassword",
      "Label": "Application Pool Password",
      "HelpText": "The password for the custom account given above.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      },
      "Links": {}
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptBody": "## --------------------------------------------------------------------------------------\n## Input\n## --------------------------------------------------------------------------------------\n\n$virtualPath = $OctopusParameters['VirtualPath']\n$physicalPath = $OctopusParameters['PhysicalPath']\n$applicationPoolName = $OctopusParameters['ApplicationPoolName']\n$setApplicationPoolSettings = [boolean]::Parse($OctopusParameters['SetApplicationPoolSettings'])\n$appPoolFrameworkVersion = $OctopusParameters[\"ApplicationPoolFrameworkVersion\"]\n$applicationPoolIdentityType = $OctopusParameters[\"ApplicationPoolIdentityType\"]\n$applicationPoolUsername = $OctopusParameters[\"ApplicationPoolUsername\"]\n$applicationPoolPassword = $OctopusParameters[\"ApplicationPoolPassword\"]\n\n$parentSite = $OctopusParameters['ParentSite']\n$bindingProtocols = $OctopusParameters['BindingProtocols']\n$authentication = $OctopusParameters['AuthenticationType']\n$requireSSL = $OctopusParameters['RequireSSL']\n$clientCertificate = $OctopusParameters['ClientCertificate']\n\n$preloadEnabled = [boolean]::Parse($OctopusParameters['PreloadEnabled'])\n$enableAnonymous = [boolean]::Parse($OctopusParameters['EnableAnonymous'])\n$enableBasic = [boolean]::Parse($OctopusParameters['EnableBasic'])\n$enableWindows = [boolean]::Parse($OctopusParameters['EnableWindows'])\n\n## --------------------------------------------------------------------------------------\n## Helpers\n## --------------------------------------------------------------------------------------\n# Helper for validating input parameters\nfunction Validate-Parameter($foo, [string[]]$validInput, $parameterName) {\n    Write-Host \"${parameterName}: ${foo}\"\n    if (! $foo) {\n        throw \"$parameterName cannot be empty, please specify a value\"\n    }\n    \n    if ($validInput) {\n        @($foo) | % { \n                if ($validInput -notcontains $_) {\n                    throw \"'$_' is not a valid input for '$parameterName'\"\n                }\n             }  \n        }   \n}\n\n# Helper to run a block with a retry if things go wrong\n$maxFailures = 5\n$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4\nfunction Execute-WithRetry([ScriptBlock] $command) {\n    $attemptCount = 0\n    $operationIncomplete = $true\n\n    while ($operationIncomplete -and $attemptCount -lt $maxFailures) {\n        $attemptCount = ($attemptCount + 1)\n\n        if ($attemptCount -ge 2) {\n            Write-Output \"Waiting for $sleepBetweenFailures seconds before retrying...\"\n            Start-Sleep -s $sleepBetweenFailures\n            Write-Output \"Retrying...\"\n        }\n\n        try {\n            & $command\n\n            $operationIncomplete = $false\n        } catch [System.Exception] {\n            if ($attemptCount -lt ($maxFailures)) {\n                Write-Output (\"Attempt $attemptCount of $maxFailures failed: \" + $_.Exception.Message)\n            \n            }\n            else {\n                throw \"Failed to execute command\"\n            }\n        }\n    }\n}\n\n## --------------------------------------------------------------------------------------\n## Configuration\n## --------------------------------------------------------------------------------------\nValidate-Parameter $virtualPath -parameterName \"Virtual path\"\nValidate-Parameter $physicalPath -parameterName \"Physical path\"\nValidate-Parameter $applicationPoolName -parameterName \"Application pool\"\nValidate-Parameter $parentSite -parameterName \"Parent site\"\n\n\nAdd-PSSnapin WebAdministration -ErrorAction SilentlyContinue\nImport-Module WebAdministration -ErrorAction SilentlyContinue\n\n\n## --------------------------------------------------------------------------------------\n## Run\n## --------------------------------------------------------------------------------------\n\nWrite-Host \"Getting web site $parentSite\"\n# Workaround to bug in Get-WebSite cmdlet which would return all sites\n# See http://forums.iis.net/p/1167298/1943273.aspx / http://stackoverflow.com/a/6832577/785750\n$site = Get-WebSite  | where { $_.Name -eq $parentSite }\nif (!$site) {\n    throw \"The web site '$parentSite' does not exist. Please create the site first.\"\n}\n\n$path = $site.PhysicalPath;\n$parts = $virtualPath -split \"[/\\\\]\"\n$name = \"\"\n\nfor ($i = 0; $i -lt $parts.Length; $i++) {\n    $name = $name + \"/\" + $parts[$i]\n    $name = $name.TrimStart('/').TrimEnd('/')\n    if ($i -eq $parts.Length - 1) {\n        \n    }\n    elseif ([string]::IsNullOrEmpty($name) -eq $false -and $name -ne \"\") {\n        Write-Host \"Ensuring parent exists: $name\"\n        \n        $path = [IO.Path]::Combine($path, $parts[$i])\n        $app = Get-WebApplication -Name $name -Site $parentSite\n\n        if (!$app) {\n            $vdir = Get-WebVirtualDirectory -Name $name -site $parentSite\n            if (!$vdir) {\n                Write-Verbose \"The application or virtual directory '$name' does not exist\"\n                if([IO.Directory]::Exists([System.Environment]::ExpandEnvironmentVariables($path)) -eq $true)\n                {\n                    Write-Verbose \"Using physical path '$path' as parent\"\n                }\n                else\n                {\n                    throw \"Failed to ensure parent\"\n                }\n            }\n            else\n            {\n                $path = $vdir.PhysicalPath\n            }\n        }\n        else\n        {\n            $path = $app.PhysicalPath\n        }\n    }\n}\n\n$existing = Get-WebApplication -site $parentSite -Name $name\n\n# Set App Pool\nExecute-WithRetry { \n\tWrite-Verbose \"Loading Application pool\"\n\t$pool = Get-Item \"IIS:\\AppPools\\$ApplicationPoolName\" -ErrorAction SilentlyContinue\n\tif (!$pool) { \n\t\tWrite-Host \"Application pool `\"$ApplicationPoolName`\" does not exist, creating...\" \n\t\tnew-item \"IIS:\\AppPools\\$ApplicationPoolName\" -confirm:$false\n\t\t$pool = Get-Item \"IIS:\\AppPools\\$ApplicationPoolName\"\n\t} else {\n\t\tWrite-Host \"Application pool `\"$ApplicationPoolName`\" already exists\"\n\t}\n}\n\n# Set App Pool Identity\nExecute-WithRetry { \n\tif($setApplicationPoolSettings)\n    {\n        Write-Host \"Set application pool identity: $applicationPoolIdentityType\"\n        if ($applicationPoolIdentityType -eq \"SpecificUser\") {\n            Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" -name processModel -value @{identitytype=\"SpecificUser\"; username=\"$applicationPoolUsername\"; password=\"$applicationPoolPassword\"}\n        } else {\n            Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" -name processModel -value @{identitytype=\"$applicationPoolIdentityType\"}\n        }\n    }\n}\n\n# Set .NET Framework\nExecute-WithRetry { \n    if($setApplicationPoolSettings)\n    {\n        Write-Host \"Set .NET framework version: $appPoolFrameworkVersion\" \n        if($appPoolFrameworkVersion -eq \"No Managed Code\")\n        {\n            Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" managedRuntimeVersion \"\"\n        }\n        else\n        {\n            Set-ItemProperty \"IIS:\\AppPools\\$ApplicationPoolName\" managedRuntimeVersion $appPoolFrameworkVersion\n        }\n    }\n}\n\nExecute-WithRetry { \n    ## Check if the physical path exits\n    if(!(Test-Path -Path $physicalPath)) {\n        Write-Host \"Creating physical path '$physicalPath'\"\n        New-Item -ItemType directory -Path $physicalPath\n    }\n\n    if (!$existing) {\n        Write-Host \"Creating web application '$name'\"\n        New-WebApplication -Site $parentSite -Name $name -ApplicationPool $applicationPoolName -PhysicalPath $physicalPath\n        Write-Host \"Web application created\"\n    } else {\n        Write-Host \"The web application '$name' already exists. Updating physical path:\"\n\n        Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -name physicalPath -value $physicalPath\n        Write-Host \"Physical path changed to: $physicalPath\"\n\n        Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -Name applicationPool -Value $applicationPoolName\n        Write-Output \"ApplicationPool changed to: $applicationPoolName\"\n    }\n    \n    Write-Host \"Enabling '$bindingProtocols' protocols\"\n    Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -name enabledProtocols -value $bindingProtocols\n\n    $enabledIisAuthenticationOptions = $Authentication -split '\\\\s*[,;]\\\\s*'\n\n    try {\n\n    Execute-WithRetry { \n        Write-Output \"Anonymous authentication enabled: $enableAnonymous\"\n        Set-WebConfigurationProperty -filter /system.webServer/security/authentication/anonymousAuthentication -name enabled -value \"$enableAnonymous\" -PSPath IIS:\\\\ -location $parentSite/$virtualPath\n    }    \n    \n    Execute-WithRetry { \n        Write-Output \"Windows authentication enabled: $enableWindows\"\n        Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/windowsAuthentication -name enabled -value \"$enableWindows\" -PSPath IIS:\\\\ -location $parentSite/$virtualPath\n    }\n\n    Execute-WithRetry { \n        Write-Output \"Basic authentication enabled: $enableBasic\"\n        Set-WebConfigurationProperty -filter /system.webServer/security/authentication/basicAuthentication -name enabled -value \"$enableBasic\" -PSPath IIS:\\\\ -location $parentSite/$virtualPath\n    }\n\n    } catch [System.Exception] {\n        Write-Output \"Authentication options could not be set. This can happen when there is a problem with your application's web.config. For example, you might be using a section that requires an extension that is not installed on this web server (such as URL Rewriting). It can also happen when you have selected an authentication option and the appropriate IIS module is not installed (for example, for Windows authentication, you need to enable the Windows Authentication module in IIS/Windows first)\"\n        throw\n    }\n\n    Set-WebConfiguration -value \"None\" -filter \"system.webserver/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ \n    if ($requireSSL -ieq \"True\")\n    {\n        Write-Output \"Require SSL enabled: $requireSSL\"\n        Set-WebConfiguration -value \"Ssl\" -filter \"system.webserver/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ \n        Write-Output \"Client certificate mode: $clientCertificate\"\n        if ($clientCertificate -ieq \"Accept\") {\n           Set-WebConfigurationProperty -filter \"system.webServer/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ -name \"sslFlags\" -value \"Ssl,SslNegotiateCert\"\n        }\n        if ($clientCertificate -ieq \"Require\") {\n           Set-WebConfigurationProperty -filter \"system.webServer/security/access\" -location $parentSite/$virtualPath -PSPath IIS:\\\\ -name \"sslFlags\" -value \"Ssl,SslNegotiateCert,SslRequireCert\"\n        }\n    }\n    \n    try {\n        Set-ItemProperty IIS:\\\\Sites\\\\$parentSite\\\\$name -name preloadEnabled -value $preloadEnabled\n        Write-Output \"Preload Enabled: $preloadEnabled\"\n    } catch [System.Exception] {\n       if ($preloadEnabled) {\n            Write-Output \"Preload Enabled: $preloadEnabled Could not be set. You may to install the Application Initialization feature\"\n            throw\n       }\n    }\n}\n",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.RunOnServer": "false",
    "Octopus.Action.Script.ScriptFileName": null,
    "Octopus.Action.Package.FeedId": null,
    "Octopus.Action.Package.PackageId": null
  },
  "Category": "IIS",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/iis-app-create.json",
  "Website": "/step-templates/5b3e7576-44f8-4852-ae09-a45bd985c549",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Monday, April 10, 2017