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: Element properties: Object Discovery Details: Member Modules:
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>