176 lines
12 KiB
PowerShell
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
|
|
} |