ps/Modules/Alkami.DevOps.Inventory/Public/Get-IISInventory.ps1
2023-05-30 22:51:22 -07:00

176 lines
12 KiB
PowerShell

function Get-IISInventory {
<#
.SYNOPSIS
Returns an OrderedDictionary that Represents the IIS Inventory.
#>
[CmdletBinding()]
Param()
$logLead = (Get-LogLeadName);
$providerStopWatch = [System.Diagnostics.StopWatch]::StartNew()
$mgr = New-Object Microsoft.Web.Administration.ServerManager
$iisDictionary = New-Object System.Collections.Specialized.OrderedDictionary
$iisDetails = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails = New-Object System.Collections.Specialized.OrderedDictionary
Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Parsing IIS Details"
try {
foreach ($appPool in $mgr.ApplicationPools) {
$appPoolName = $appPool.Name
$appPoolDetails[$appPoolName] = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails[$appPoolName]["CLRVersion"] = $appPool.ManagedRuntimeVersion
$appPoolDetails[$appPoolName]["Enable32BitAppOnWin64"] = $appPool.Enable32BitAppOnWin64
$appPoolDetails[$appPoolName]["ManagedPipelineMode"] = $appPool.ManagedPipelineMode
$appPoolDetails[$appPoolName]["QueueLength"] = $appPool.QueueLength
$appPoolDetails[$appPoolName]["StartMode"] = $appPool.StartMode
$appPoolDetails[$appPoolName]["State"] = $appPool.State
$appPoolDetails[$appPoolName]["AutoStart"] = $appPool.AutoStart
$appPoolDetails.$appPoolName["CPU"] = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails.$appPoolName["CPU"]["Limit"] = $appPool.Cpu.Limit
$appPoolDetails.$appPoolName["CPU"]["LimitAction"] = $appPool.Cpu.Action
$appPoolDetails.$appPoolName["CPU"]["LimitInterval"] = ($appPool.Cpu.ResetInterval).ToString()
$appPoolDetails.$appPoolName["CPU"]["AffinityEnabled"] = $appPool.Cpu.SmpAffinitized
$appPoolDetails.$appPoolName["CPU"]["AffinityMask"] = $appPool.Cpu.SmpProcessorAffinityMask
$appPoolDetails.$appPoolName["CPU"]["AffinityMask64"] = $appPool.Cpu.SmpProcessorAffinityMask2
$appPoolDetails.$appPoolName["ProcessModel"] = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails.$appPoolName["ProcessModel"]["EventLogEntry"] = $appPool.ProcessModel.LogEventOnProcessModel
$appPoolDetails.$appPoolName["ProcessModel"]["IdentityType"] = $appPool.ProcessModel.IdentityType
$appPoolDetails.$appPoolName["ProcessModel"]["UserName"] = $appPool.ProcessModel.UserName
$appPoolDetails.$appPoolName["ProcessModel"]["IdleTimeout"] = ($appPool.ProcessModel.IdleTimeout).ToString()
$appPoolDetails.$appPoolName["ProcessModel"]["IdleTimeoutAction"] = $appPool.ProcessModel.IdleTimeoutAction
$appPoolDetails.$appPoolName["ProcessModel"]["LoadUserProfile"] = $appPool.ProcessModel.LoadUserProfile
$appPoolDetails.$appPoolName["ProcessModel"]["MaximumWorkerProcesses"] = $appPool.ProcessModel.MaxProcesses
$appPoolDetails.$appPoolName["ProcessModel"]["PingEnabled"] = $appPool.ProcessModel.PingingEnabled
$appPoolDetails.$appPoolName["ProcessModel"]["PingMaxResponseTime"] = ($appPool.ProcessModel.PingInterval).ToString()
$appPoolDetails.$appPoolName["ProcessModel"]["PingPeriod"] = ($appPool.ProcessModel.PingResponseTime).ToString()
$appPoolDetails.$appPoolName["ProcessModel"]["ShutdownTimeLimit"] = ($appPool.ProcessModel.ShutdownTimeLimit).ToString()
$appPoolDetails.$appPoolName["ProcessModel"]["StartupTimeLimit"] = ($appPool.ProcessModel.StartupTimeLimit).ToString()
$appPoolDetails.$appPoolName["ProcessOrphaning"] = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails.$appPoolName["ProcessOrphaning"]["OrphanWorkerProcess"] = $appPool.Failure.OrphanWorkerProcess
$appPoolDetails.$appPoolName["ProcessOrphaning"]["Executable"] = $appPool.Failure.OrphanActionExe
$appPoolDetails.$appPoolName["ProcessOrphaning"]["ExecutableParams"] = $appPool.Failure.OrphanActionParams
$appPoolDetails.$appPoolName["RapidFailProtection"] = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails.$appPoolName["RapidFailProtection"]["ReponseType"] = $appPool.Failure.LoadBalancerCapabilities
$appPoolDetails.$appPoolName["RapidFailProtection"]["Enabled"] = $appPool.Failure.RapidFailProtection
$appPoolDetails.$appPoolName["RapidFailProtection"]["FailureInterval"] = ($appPool.Failure.RapidFailProtectionInterval).ToString()
$appPoolDetails.$appPoolName["RapidFailProtection"]["MaximumFailures"] = $appPool.Failure.RapidFailProtectionMaxCrashes
$appPoolDetails.$appPoolName["RapidFailProtection"]["Executable"] = $appPool.Failure.AutoShutdownExe
$appPoolDetails.$appPoolName["RapidFailProtection"]["ExecutableParams"] = $appPool.Failure.AutoShutdownParams
$appPoolDetails.$appPoolName["Recycling"] = New-Object System.Collections.Specialized.OrderedDictionary
$appPoolDetails.$appPoolName["Recycling"]["DisallowOverlappedRecycle"] = $appPool.Recycling.DisallowOverlappingRotation
$appPoolDetails.$appPoolName["Recycling"]["DisableConfigRecycling"] = $appPool.Recycling.DisallowRotationOnConfigChange
$appPoolDetails.$appPoolName["Recycling"]["RecyclingEventLogging"] = $appPool.Recycling.LogEventOnRecycle
$appPoolDetails.$appPoolName["Recycling"]["PrivateMemoryLimit"] = $appPool.Recycling.PeriodicRestart.PrivateMemory
$appPoolDetails.$appPoolName["Recycling"]["RegularTimeInterval"] = ($appPool.Recycling.PeriodicRestart.Time).ToString()
$appPoolDetails.$appPoolName["Recycling"]["RequestLimit"] = $appPool.Recycling.PeriodicRestart.Requests
$appPoolDetails.$appPoolName["Recycling"]["SpecificTimes"] = $appPool.Recycling.PeriodicRestart.Schedule
$appPoolDetails.$appPoolName["Recycling"]["VirtualMemoryLimit"] = $appPool.Recycling.PeriodicRestart.Memory
}
foreach ($site in $mgr.Sites) {
$siteName = $site.Name
$webSiteDetails[$siteName] = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails[$siteName]["Id"] = $site.Id
$webSiteDetails[$siteName]["Name"] = $site.Name
$webSiteDetails[$siteName]["State"] = $site.State
$webSiteDetails[$siteName]["IsLocallyStored"] = $site.IsLocallyStored
$webSiteDetails[$siteName]["ServerAutoStart"] = $site.ServerAutoStart
$webSiteDetails[$siteName]["DefaultAppPool"] = $site.ApplicationDefaults.ApplicationPoolName
$applicationHeader = "Applications"
$webSiteDetails[$siteName][$applicationHeader] = New-Object System.Collections.Specialized.OrderedDictionary
foreach ($webApp in $site.Applications) {
if ($webApp.Path -eq "/") {
$webAppName = $webApp.Path
}
else {
$webAppName = (($webApp.Path).Split("/") | Select-Object -Skip 1 -First 1)
}
$webSiteDetails[$siteName][$applicationHeader][$webAppName] = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails[$siteName][$applicationHeader][$webAppName]["ApplicationPool"] = $webApp.ApplicationPoolName
$webSiteDetails[$siteName][$applicationHeader][$webAppName]["EnabledProtocols"] = $webApp.EnabledProtocols
$webSiteDetails[$siteName][$applicationHeader][$webAppName]["IsLocallyStored"] = $webApp.IsLocallyStored
$webSiteDetails[$siteName][$applicationHeader][$webAppName]["PhysicalPath"] = $webApp.VirtualDirectories[0].PhysicalPath
$webSiteDetails[$siteName][$applicationHeader][$webAppName]["Path"] = $webApp.Path
$webSiteDetails[$siteName][$applicationHeader][$webAppName]["PreloadEnabled"] = $webApp.Attributes["preloadEnabled"].Value
}
$bindingHeader = "Bindings"
$webSiteDetails[$siteName][$bindingHeader] = New-Object System.Collections.Specialized.OrderedDictionary
foreach ($binding in $site.Bindings) {
$bindingInfo = $binding.BindingInformation
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo] = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["HostName"] = $binding.Host
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["Protocol"] = $binding.Protocol
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["Address"] = $binding.Endpoint.Address.IPAddressToString
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["Port"] = $binding.Endpoint.Port
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["SslFlags"] = $binding.SslFlags
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["CertificateStoreName"] = $binding.CertificateStoreName
$webSiteDetails[$siteName][$bindingHeader][$bindingInfo]["CertificateHash"] = `
if ($binding.CertificateHash) {
([System.BitConverter]::ToString($binding.CertificateHash).Replace('-',''))
}
}
$logHeader = "Log"
$webSiteDetails[$siteName][$logHeader] = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails[$siteName][$logHeader]["Enabled"] = $site.LogFile.Enabled
$webSiteDetails[$siteName][$logHeader]["Period"] = ($site.LogFile.Period).ToString()
$webSiteDetails[$siteName][$logHeader]["Rollover"] = $site.LogFile.LocalTimeRollover
$webSiteDetails[$siteName][$logHeader]["Format"] = $site.LogFile.LogFormat
$webSiteDetails[$siteName][$logHeader]["Directory"] = $site.LogFile.Directory
$webSiteDetails[$siteName][$logHeader]["Flags"] = ($site.LogFile.LogExtFileFlags).ToString()
$reqLogHeader = "FailedRequestLog"
$webSiteDetails[$siteName][$reqLogHeader] = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails[$siteName][$reqLogHeader]["Enabled"] = $site.TraceFailedRequestsLogging.Enabled
$webSiteDetails[$siteName][$reqLogHeader]["MaxLogFiles"] = $site.TraceFailedRequestsLogging.MaxLogFiles
$webSiteDetails[$siteName][$reqLogHeader]["Directory"] = $site.TraceFailedRequestsLogging.Directory
$webSiteDetails[$siteName][$reqLogHeader]["MaxSizeKB"] = $site.TraceFailedRequestsLogging.Attributes["maxLogfileSizeKb"].Value
$limitsHeader = "Limits"
$webSiteDetails[$siteName][$limitsHeader] = New-Object System.Collections.Specialized.OrderedDictionary
$webSiteDetails[$siteName][$limitsHeader]["ConnectionTimeout"] = ($site.Limits.ConnectionTimeout).ToString()
$webSiteDetails[$siteName][$limitsHeader]["MaxBandwidth"] = $site.Limits.MaxBandwidth
$webSiteDetails[$siteName][$limitsHeader]["MaxConnections"] = $site.Limits.MaxConnections
$webSiteDetails[$siteName][$limitsHeader]["MaxUrlSegments"] = $site.Limits.MaxUrlSegments
}
}
catch {
$iisDictionary["Error"] = $_.Exception.ToString()
}
$iisDetails.Add("AppPools", $appPoolDetails)
$iisDetails.Add("Sites", $webSiteDetails)
$iisDictionary.Add("IIS", $iisDetails)
Write-Verbose "$logLead : [$($providerStopWatch.Elapsed)] : Provider Complete"
$providerStopWatch.Stop()
return $iisDictionary
}