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 }