AppFabric Web Hosting Discovery

Microsoft.ApplicationServer.WebObjects.Discovery (Discovery)

This discovery discovers the IIS hosted WCF and WF services that are managed by AppFabric. It also discovers their IIS virtual structure (e.g. Web Site, Web Application).

Knowledge Base article:

Summary

This discovery discovers the IIS hosted WCF and WF services that are managed by AppFabric. It also discovers their IIS virtual structure (e.g. Web Site, Web Application).

Element properties:

TargetMicrosoft.ApplicationServer.ServerRole
EnabledTrue
Frequency14650
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:
Discovered relationships and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource System.CommandExecuterDiscoveryDataSource Microsoft.ApplicationServer.StoreReaderAccount

Source Code:

<Discovery ID="Microsoft.ApplicationServer.WebObjects.Discovery" Enabled="true" Target="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.ServerRole" ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSite">
<Property TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSite" PropertyID="SiteName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSites">
<Property TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSites" PropertyID="SitesName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplication">
<Property TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplication" PropertyID="ApplicationPath"/>
<Property TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplication" PropertyID="Site"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebService">
<Property TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebService" PropertyID="ServicePath"/>
<Property TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebService" PropertyID="Site"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.ServerRoleHostsSites"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSitesHostSite"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSiteContainsWebApplications"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSiteContainsWebServices"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplicationContainsWebApplication"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplicationContainsWebService"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WindowsComputerHostsWebApplication"/>
<DiscoveryRelationship TypeID="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WindowsComputerHostsWebService"/>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.StoreReaderAccount" TypeID="System!System.CommandExecuterDiscoveryDataSource">
<IntervalSeconds>14650</IntervalSeconds>
<ApplicationName>%windir%\system32\windowspowershell\v1.0\powershell.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>-Command ".\Create-WebObjects.ps1"</CommandLine>
<TimeoutSeconds>600</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>Create-WebObjects.ps1</Name>
<Contents><Script>



function Create-ObjectHierarchy
{
Param($serviceInfo, $discovery)
[string]$siteName = $serviceInfo.SiteName
[string]$appPath = $serviceInfo.ApplicationPath

$site = $null
$leafApplication = $null

if (($script:appInfoCache['/'] -eq $null) -or ($appPath.CompareTo("/") -eq 0))
{
$site = Create-Site -serviceInfo $serviceInfo -discovery $discovery
}

$leafApplication = Create-Application -serviceInfo $serviceInfo -discovery $discovery


#create service obj and create App to Service relation
$webService = $Discovery.CreateClassInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebService']$")
$webService.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebService']/ServicePath$", $serviceInfo.VirtualPath)
$webService.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebService']/Site$", $serviceInfo.SiteName)
$webService.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $serviceInfo.ServiceName)
$webService.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", '$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$')

$Discovery.AddInstance($webService)

$relation = $null
if($leafApplication -eq $null)
{
$relation = $Discovery.CreateRelationshipInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSiteContainsWebServices']$")
$relation.Source = $site
}
else
{
$relation = $Discovery.CreateRelationshipInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplicationContainsWebService']$")
$relation.Source = $leafApplication
}

$relation.Target = $webService
$Discovery.AddInstance($relation)

#$leafApplication
#$serviceInfo.VirtualPath

return

}

function Create-Site
{
Param($serviceInfo, $discovery)

$returnSite = $script:appInfoCache['/']
if ($returnSite -eq $null)
{
#Create site obj
# Create Sites node and Relation ServerRoleHostsSites
$webSite = $Discovery.CreateClassInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSite']$")
$webSite.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSite']/SiteName$", $serviceInfo.SiteName)
$webSite.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $serviceInfo.SiteName)
$webSite.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", '$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$')
$webSite.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSites']/SitesName$", 'AppFabric IIS Web Sites')

$Discovery.AddInstance($webSite)

#Add to cache and return
$script:appInfoCache.Add('/', $webSite)
$returnSite = $webSite
}

return $returnSite

}

function Create-Application
{
Param($serviceInfo)

#if this is a Site, return
if ($serviceInfo.ApplicationPath.CompareTo("/") -eq 0)
{
return $null
}

$returnApp = $script:appInfoCache[$serviceInfo.ApplicationPath]
if ($returnApp -eq $null)
{
[Array]$splitChar = '/'
$appPaths = $serviceInfo.ApplicationPath.Split($splitChar, 1)
$currentAppPath = [string]::Empty
$parent = $script:appInfoCache['/']
$isParentSite = $true
foreach($appPath in $appPaths)
{
$currentAppPath = $currentAppPath + '/' + $appPath
if ($script:appInfoCache[$currentAppPath] -eq $null)
{
#Create app obj and parent to this new object relation
$webApp = $Discovery.CreateClassInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplication']$")
$webApp.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplication']/ApplicationPath$", $serviceInfo.ApplicationPath)
$webApp.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplication']/Site$", $serviceInfo.SiteName)
$webApp.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $serviceInfo.ApplicationPath)
$webApp.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", '$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$')

$Discovery.AddInstance($webApp)
$relation = $null
if($isParentSite -eq $true)
{
$relation = $Discovery.CreateRelationshipInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSiteContainsWebApplications']$")
}
else
{
$relation = $Discovery.CreateRelationshipInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebApplicationContainsWebApplication']$")
}

$relation.Source = $parent
$relation.Target = $webApp
$Discovery.AddInstance($relation)

#Add to cache and continue
$script:appInfoCache.Add($currentAppPath, $webApp)

}

$parent = $script:appInfoCache[$currentAppPath]
$isParentSite = $false

#$returnApp = the newly created obj
$returnApp = $parent

}


}

return $returnApp

}
# Create a new discovery data packet -- this assumes that the client SDK is available, which it is on all OpsMgr agents
$oAPI = new-object -comObject "MOM.ScriptAPI"
$Discovery = $oAPI.CreateDiscoveryData(0, '$MPElement$', '$Target/Id$')

#$oAPI.LogScriptEvent("Create-WebObjects.ps1", 123, 4, "Init")

if ((Get-Command -Module ApplicationServer) -eq $null)
{
Import-Module ApplicationServer # Application Server Extensions for .NET 4
}

[Hashtable]$script:siteInfoCache = New-Object Hashtable
[Hashtable]$script:appInfoCache = New-Object Hashtable

$computerPrincipalName = '$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$'

# Create Sites node and Relation ServerRoleHostsSites
$webSites = $Discovery.CreateClassInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSites']$")
$webSites.AddProperty("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSites']/SitesName$", 'AppFabric IIS Web Sites')
$webSites.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerPrincipalName)
$webSites.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", 'AppFabric IIS Web Sites')
$Discovery.AddInstance($webSites)

$serverRole = $discovery.CreateClassInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.ServerRole']$")
$serverRole.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerPrincipalName)

$relation = $Discovery.CreateRelationshipInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.ServerRoleHostsSites']$")
$relation.Source = $serverRole
$relation.Target = $webSites
$Discovery.AddInstance($relation)

$allSitesAndApplicationServices = Get-ASApplication | Get-AsAppService | Group-Object SiteName #| Sort-Object $_.VirtualPath
foreach($siteInfoGroup in $allSitesAndApplicationServices)
{
$site = $siteInfoGroup.Name
$serviceInfoObjects = $siteInfoGroup.Group | Sort-Object ApplicationPath
foreach($serviceInfo in $serviceInfoObjects)
{


Create-ObjectHierarchy -serviceInfo $serviceInfo -discovery $Discovery
$webSite = $script:appInfoCache['/']
if ($webSite -ne $null)
{
#Create relation Sites host Site
$relation = $Discovery.CreateRelationshipInstance("$MPElement[Name='MicrosoftApplicationServerLibrary!Microsoft.ApplicationServer.WebSitesHostSite']$")
$relation.Source = $webSites
$relation.Target = $webSite
$Discovery.AddInstance($relation)

}

}


$script:appInfoCache.Clear()
}

# Return the discovery data by calling the variable
$oAPI.Return($Discovery)

</Script></Contents>
<Unicode>1</Unicode>
</File>
</Files>
</DataSource>
</Discovery>