Public/InstallHelpers/Install.IIS.Functions.psm1
# # DOCS: https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/iisadministration-powershell-cmdlets # # DOCS: CMDLET LIST - https://docs.microsoft.com/en-us/powershell/module/iisadministration/?view=win10-ps # # DOCS: EXAMPLES: https://blogs.iis.net/jeonghwan/how-to-use-iisadministration-powershell-cmdlets-to-configure-iis-configuration-settings # # DOCS: https://octopus.com/blog/iis-powershell # # NOTE: You may need to run this if you have IISAdministration 1.0.0 installed: # # Install-Module -Name IISAdministration -AllowClobber -Force # #Requires -RunAsAdministrator # #Requires -Version 5.0 # $ErrorActionPreference = "Stop"; # Set-StrictMode -Version 'Latest' # [string[]] $desiredFeatures = @( # 'IIS-WebServerRole', # 'IIS-WebServer', # 'IIS-CommonHttpFeatures', # 'IIS-HttpErrors', # 'IIS-HttpRedirect', # 'IIS-ApplicationDevelopment', # 'NetFx4Extended-ASPNET45', # 'IIS-NetFxExtensibility45', # 'IIS-HealthAndDiagnostics', # 'IIS-HttpLogging', # 'IIS-LoggingLibraries', # 'IIS-RequestMonitor', # 'IIS-HttpTracing', # 'IIS-Security', # 'IIS-RequestFiltering', # 'IIS-Performance', # 'IIS-WebServerManagementTools', # 'IIS-Metabase', # 'IIS-ManagementConsole', # 'IIS-BasicAuthentication', # 'IIS-WindowsAuthentication', # 'IIS-StaticContent', # 'IIS-DefaultDocument', # 'IIS-WebSockets', # 'IIS-ApplicationInit', # 'IIS-ISAPIExtensions', # 'IIS-ISAPIFilter', # 'IIS-HttpCompressionStatic', # 'IIS-ASPNET45' # ) # # TODO: Move this to the private folder # function _determineIfFeatureIsActive( # [Parameter(mandatory=$true)] # [string] $featureName # ) { # (Get-WindowsOptionalFeature -Online | Where-Object FeatureName -eq $featureName).State # } # # TODO: Move this to the private folder # function _enableWindowsFeature( # [Parameter(mandatory=$true)] # [string] $featureName # ) { # (Enable-WindowsOptionalFeature -Online -FeatureName $featureName).Online # } # function InstallIISWebServer( # [Parameter(mandatory=$false)] # $features = $desiredFeatures # ) { # foreach ($feature in $desiredFeatures) { # [string] $result = _determineIfFeatureIsActive -featureName $feature # if ($result -eq 'Disabled') { # _enableWindowsFeature $feature # } # } # } # function InstallIISAdminModule( # [Parameter(mandatory=$false)] # [bool] $clobberIISModule = $true # ) { # Install-Module ` # -Name IISAdministration ` # -AllowClobber:$clobberIISModule ` # -WarningAction SilentlyContinue ` # -Force # } # function TestForIISSiteExistence( # [Parameter(mandatory=$true)] # [string] $siteName # ) { # if ($null -eq (Get-IISSite $siteName -WarningAction SilentlyContinue)) { # return $false # } # return $true # } # # NOTE: Any sites or app pools that already exist will not be recreated. # # NOTE: Depends on module IISAdministration having been previously loaded # # App pool should be created before site so we can add the site to the pool after the site's creation # function CreateIISWebsite( # [Parameter(mandatory=$true)] # [string] $siteName, # [Parameter(mandatory=$true)] # [string] $port, # [Parameter(mandatory=$true)] # [string] $siteArtifactsFolder, # [Parameter(mandatory=$true)] # [bool] $useSelfSignedSSLCert # ) { # # In case previous invocations left one open # Stop-IISCommitDelay -commit $false -WarningAction SilentlyContinue # $absPathToSiteFiles = "$siteArtifactsFolder" # # # App pool should be created before site so we can add the site to the pool after the site's creation # $pool = Get-IISAppPool $siteName -WarningAction SilentlyContinue # if($null -eq $pool){ # Write-Host -ForegroundColor Yellow "Creating app pool: $siteName" # CreateAppPool -appPoolName $siteName # } # $site = Get-IISSite $siteName -WarningAction SilentlyContinue # if($null -eq $site) { # Write-Host -ForegroundColor Yellow "Creating site: $siteName" # Start-IISCommitDelay # $site = New-IISSite ` # -Name $siteName ` # -BindingInformation $("*:8081:" + $siteName) ` # -PhysicalPath $absPathToSiteFiles ` # -PassThru # # Examples of -BindingInformation: # # "*:80:" - Listens on port 80, any IP address, any hostname # # "10.0.0.1:80:" - Listens on port 80, specific IP address, any host # # "*:80:myhost.com" - Listens on port 80, specific hostname # # Set the Application Pool for the newly-created site. # $site.Applications["/"].ApplicationPoolName = $siteName # if ($useSelfSignedSSLCert -eq $true) { # $port = "443" # $bindingInformation = "*:" + $port + ":" + $siteName # $info = CreateSelfSignedCert -siteName $siteName # New-IISSiteBinding -Name $siteName -BindingInformation $bindingInformation ` # -CertificateThumbPrint $info['thumbPrint'] -CertStoreLocation $info['storePath'] ` # -Protocol https -Verbose -SslFlag 'Sni' # } # Stop-IISCommitDelay -Commit $true # } # } # # NOTE: Depends on WebAdministration module, which depends on IIS being installed # function AddVirtualDirectoryToSite( # [Parameter(mandatory=$true)] # [string] $siteName, # [Parameter(mandatory=$true)] # [string] $virDirName, # [Parameter(mandatory=$true)] # [string] $pathToArtifacts, # [Parameter(mandatory=$true)] # [string] $workDir # ) { # Set-Location $PSScriptRoot # $scriptRootParent = (Get-Item .).Parent.FullName # Import-Module "$scriptRootParent\ModuleHelpers\Module.Functions.psm1" # LoadModule -moduleNameOrPath 'WebAdministration' -installViaNuGet $true # if ($null -ne (Get-WebVirtualDirectory -site $siteName -Name "/$virDirName")) { # Remove-Item "IIS:\Sites\$siteName\$virDirName" -Force -Recurse # } # # TODO : Use IIS provider (see if() above) to create virtual directory? # New-WebVirtualDirectory -Site "$siteName" -Name $virDirName -PhysicalPath $pathToArtifacts # Set-Location $workDir # } # function ConfigureIISFilesystemPermissions( # [Parameter(mandatory=$true)] # [string] $dirToChmod, # [Parameter(mandatory=$false)] # [string] $webUser = 'IIS_IUSRS' # # [string] $webUser = 'Everyone' # ) { # # NOTE: IIS_IUSRS(local user) needs READ/WRITE/MODIFY in $artifactDestinationDir # $acl = Get-Acl $dirToChmod # $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( # $webUser, # 'FullControl', # 'ContainerInherit,ObjectInherit', # 'None', # 'Allow' # ) # $acl.SetAccessRule($accessRule) # $acl | Set-Acl $dirToChmod # } # Export-ModuleMember -Function "*" |