297 lines
No EOL
8 KiB
PowerShell
297 lines
No EOL
8 KiB
PowerShell
#region Private variables
|
|
|
|
$loggingDirectory = "C:\Temp"
|
|
$loggingFile = "Install.log"
|
|
$logFile = Join-Path $loggingDirectory $loggingFile
|
|
|
|
#endregion
|
|
|
|
#region Public methods
|
|
|
|
function CheckCredentials
|
|
{
|
|
If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
|
|
[Security.Principal.WindowsBuiltInRole] "Administrator"))
|
|
{
|
|
Write-Warning "You do not have Administrator rights to run this script!`nPlease re-run this script as an Administrator!"
|
|
return $false
|
|
}
|
|
|
|
Write-Host "Done."
|
|
return $true
|
|
}
|
|
|
|
function EnableEmbeddedIISFeatures
|
|
{
|
|
cd $PSScriptRoot
|
|
|
|
$featureList = @("IIS-WebServerRole",
|
|
"IIS-WebServer",
|
|
"IIS-CommonHttpFeatures",
|
|
"IIS-HttpErrors",
|
|
"IIS-HttpRedirect",
|
|
"IIS-ApplicationDevelopment",
|
|
"IIS-NetFxExtensibility",
|
|
"IIS-NetFxExtensibility45",
|
|
"IIS-HealthAndDiagnostics",
|
|
"IIS-HttpLogging",
|
|
"IIS-LoggingLibraries",
|
|
"IIS-RequestMonitor",
|
|
"IIS-HttpTracing",
|
|
"IIS-Security",
|
|
"IIS-URLAuthorization",
|
|
"IIS-RequestFiltering",
|
|
"IIS-IPSecurity",
|
|
"IIS-Performance",
|
|
"IIS-HttpCompressionDynamic",
|
|
"IIS-WebServerManagementTools",
|
|
"IIS-ManagementScriptingTools",
|
|
"IIS-IIS6ManagementCompatibility",
|
|
"IIS-Metabase",
|
|
"IIS-CertProvider",
|
|
"IIS-WindowsAuthentication",
|
|
"IIS-DigestAuthentication",
|
|
"IIS-ClientCertificateMappingAuthentication",
|
|
"IIS-IISCertificateMappingAuthentication",
|
|
"IIS-StaticContent",
|
|
"IIS-DefaultDocument",
|
|
"IIS-DirectoryBrowsing",
|
|
"IIS-WebSockets",
|
|
"IIS-ApplicationInit",
|
|
"IIS-ASPNET",
|
|
"IIS-ASPNET45",
|
|
"IIS-ASP",
|
|
"IIS-CGI",
|
|
"IIS-ISAPIExtensions",
|
|
"IIS-ISAPIFilter",
|
|
"IIS-ServerSideIncludes",
|
|
"IIS-CustomLogging",
|
|
"IIS-BasicAuthentication",
|
|
"IIS-HttpCompressionStatic",
|
|
"IIS-ManagementConsole",
|
|
"IIS-ManagementService")
|
|
|
|
Enable-WindowsOptionalFeature -FeatureName $featureList -Online > $null
|
|
|
|
Write-Host "Done."
|
|
}
|
|
|
|
function ScaffoldIIS($hostName, $hostIp, $iisApplication, $iisVirtualApplications)
|
|
{
|
|
SetHostsFile $hostName $hostIp
|
|
|
|
CreateApplicationPool $iisApplication
|
|
|
|
if($iisVirtualApplications -ne $null)
|
|
{
|
|
CreateApplicationPool $iisVirtualApplications
|
|
}
|
|
|
|
CreateSite $iisApplication $iisVirtualApplications
|
|
|
|
GrantPermissionToApplicationPool $iisApplication
|
|
|
|
AddSslBindingToIdpAndAddAsTrustedCert $iisApplication $hostName
|
|
|
|
if($iisVirtualApplications -ne $null)
|
|
{
|
|
GrantPermissionToApplicationPool $iisVirtualApplications
|
|
}
|
|
|
|
Write-Host "IIS scaffolding has been successfully completed!"
|
|
}
|
|
|
|
function ResetIIS
|
|
{
|
|
& {iisreset} > $null
|
|
Write-Host "Done."
|
|
}
|
|
|
|
function ResetEnvironment
|
|
{
|
|
cd $PSScriptRoot
|
|
Write-Host "Done."
|
|
}
|
|
|
|
function StartLogging
|
|
{
|
|
ScaffoldLoggingContainer
|
|
|
|
try { Stop-Transcript } catch {}
|
|
Start-Transcript -path $logFile -append
|
|
}
|
|
|
|
function StopLogging
|
|
{
|
|
try { Stop-Transcript } catch {}
|
|
}
|
|
|
|
#endregion Public methods
|
|
|
|
#region Private methods
|
|
|
|
function SetHostsFile($hostName, $ip)
|
|
{
|
|
$hostsPath = "$env:windir\System32\drivers\etc\hosts"
|
|
$measure = Get-Content $hostsPath | Select-String $hostName | measure | select -Property Count
|
|
|
|
if($measure.Count -eq 0)
|
|
{
|
|
"`r`n" + $ip + "`t" + $hostName | Out-File -encoding ASCII -append $hostsPath
|
|
Write-Host $hostsPath "Host file has been successfully updated!"
|
|
}
|
|
}
|
|
|
|
function CreateApplicationPool($iisApplication)
|
|
{
|
|
#navigate to the app pools root
|
|
cd IIS:\AppPools\
|
|
|
|
foreach($iisApplicationPool in $iisApplication)
|
|
{
|
|
$iisApplicationPoolName = $iisApplicationPool.poolName
|
|
|
|
#check if the app pool exists
|
|
if (!(Test-Path $iisApplicationPoolName -pathType container))
|
|
{
|
|
#create the app pool
|
|
$appPool = New-Item $iisApplicationPoolName
|
|
|
|
foreach($iisApplicationPoolProperty in $iisApplicationPool.property)
|
|
{
|
|
$appPool | Set-ItemProperty -Name $iisApplicationPoolProperty.name -Value $iisApplicationPoolProperty.value
|
|
}
|
|
|
|
Write-Host "$iisApplicationPoolName (application pool) has been successfully created!"
|
|
}
|
|
}
|
|
}
|
|
|
|
function GrantPermissionToApplicationPool($iisApplicationPoolName, $containerDirectoryPath)
|
|
{
|
|
foreach($iisApp in $iisApplication)
|
|
{
|
|
Write-Host "Grant RW directory level permission for" $iisApp.poolName "(" $iisApp.applicationPath ")"
|
|
$fullApplicationPoolName = "IIS AppPool\" + $iisApp.poolName
|
|
|
|
GrantModifyPermissionToFolder $fullApplicationPoolName $iisApp.applicationPath "Modify"
|
|
|
|
Write-Host "Grant R directory level permission for IUSR" "(" $iisApp.applicationPath ")"
|
|
GrantModifyPermissionToFolder "IUSR" $iisApp.applicationPath "Read"
|
|
}
|
|
}
|
|
|
|
function GrantModifyPermissionToFolder($userName, $path, $accessLevel)
|
|
{
|
|
$acl = Get-Acl $path
|
|
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule($userName, $accessLevel, "ContainerInherit,ObjectInherit", "None", "Allow")
|
|
|
|
$acl.SetAccessRule($ar)
|
|
Set-Acl $path $acl
|
|
}
|
|
|
|
function CreateSite($iisApplication, $iisVirtualApplication)
|
|
{
|
|
#navigate to the sites root
|
|
cd IIS:\Sites\
|
|
|
|
$iisApplicationName
|
|
|
|
foreach($iisApp in $iisApplication)
|
|
{
|
|
$iisApplicationName = $iisAppName = $iisApp.name
|
|
|
|
#check if the site exists
|
|
if (Test-Path $iisAppName -pathType container)
|
|
{
|
|
$targetApplication = "IIS:\Sites\$iisAppName"
|
|
$previousSite = Get-Item $targetApplication
|
|
$previousSiteLocation = $previousSite.physicalPath
|
|
|
|
Remove-Item $targetApplication -Recurse -Force > $null
|
|
|
|
Write-Host "Previous $iisAppName (site) has been successfully deleted! Physical location: $previousSiteLocation"
|
|
}
|
|
|
|
#create the site
|
|
$application = New-Item $iisAppName -bindings $iisApp.bindings -physicalPath $iisApp.applicationPath
|
|
$application | Set-ItemProperty -Name "applicationPool" -Value $iisApp.poolName
|
|
|
|
$newSite = Get-Item "IIS:\Sites\$iisAppName"
|
|
$newSiteLocation = $newSite.physicalPath
|
|
|
|
Write-Host "$iisAppName (site) has been successfully created! Physical location: $newSiteLocation"
|
|
}
|
|
|
|
if($iisVirtualApplication -ne $null)
|
|
{
|
|
foreach($iisVirtualApp in $iisVirtualApplication)
|
|
{
|
|
$iisVirtualAppName = $iisVirtualApp.name
|
|
|
|
#create the virtual application
|
|
New-Item "IIS:\Sites\$iisApplicationName\$iisVirtualAppName" -physicalPath $iisVirtualApp.applicationPath -type Application
|
|
Set-ItemProperty "IIS:\Sites\$iisApplicationName\$iisVirtualAppName" -Name "applicationPool" -Value $iisVirtualApp.poolName
|
|
|
|
$newSite = Get-Item "IIS:\Sites\$iisApplicationName\$iisVirtualAppName"
|
|
$newSiteLocation = $newSite.physicalPath
|
|
|
|
Write-Host "$iisVirtualAppName (virtual application) has been successfully created! Physical location: $newSiteLocation"
|
|
}
|
|
}
|
|
}
|
|
|
|
function ScaffoldLoggingContainer
|
|
{
|
|
if(!(Test-Path $loggingDirectory))
|
|
{
|
|
New-Item $loggingDirectory -ItemType Directory > $null
|
|
}
|
|
|
|
if((Test-Path $logFile))
|
|
{
|
|
Remove-Item $logFile -Force > $null
|
|
}
|
|
|
|
New-Item $logFile -ItemType File > $null
|
|
}
|
|
|
|
function AddSslBindingToIdpAndAddAsTrustedCert($iisApplication, $dnsName)
|
|
{
|
|
#TODO: meglehet csinálni paraméterezve a binding-ot, nem kell a foreach
|
|
|
|
foreach($iisApp in $iisApplication)
|
|
{
|
|
$newCert = New-SelfSignedCertificate -DnsName $dnsName -CertStoreLocation cert:\LocalMachine\My
|
|
|
|
##New-WebBinding -Name $iisApp.name -HostHeader $dnsName -Port 443 -Protocol https
|
|
|
|
$binding = Get-WebBinding -Name $iisApp.name -Protocol "https"
|
|
|
|
$binding.AddSslCertificate($newCert.GetCertHashString(), "my")
|
|
|
|
$tempCert = Join-Path "c:\Temp" $dnsName
|
|
|
|
Export-Certificate -Cert $newCert -FilePath $tempCert -Type SST
|
|
|
|
Import-Certificate -CertStoreLocation cert:\CurrentUser\Root -FilePath $tempCert
|
|
|
|
Remove-Item $tempCert
|
|
|
|
Write-Host "Done."
|
|
}
|
|
}
|
|
|
|
#endregion Private methods
|
|
|
|
#region Exports
|
|
|
|
export-modulemember -function CheckCredentials
|
|
export-modulemember -function EnableEmbeddedIISFeatures
|
|
export-modulemember -function ScaffoldIIS
|
|
export-modulemember -function ResetIIS
|
|
export-modulemember -function ResetEnvironment
|
|
export-modulemember -function StartLogging
|
|
export-modulemember -function StopLogging
|
|
|
|
#endregion Exports |