Discovers Multi-Tenant RRAS Server

Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.Discovery.MultiTenantRRASServer (Discovery)

Discovers Multi-Tenant RRAS Server on Windows machine

Element properties:

TargetMicrosoft.Windows.Server.2012.R2.Computer
EnabledTrue
Frequency21600
RemotableFalse

Object Discovery Details:

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

Member Modules:

ID Module Type TypeId RunAs 
PSMultiTenantRRASServerDiscovery2 DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Default

Source Code:

<Discovery ID="Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.Discovery.MultiTenantRRASServer" Target="MWS2RD!Microsoft.Windows.Server.2012.R2.Computer" Enabled="true" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer">
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer" PropertyID="ServerName"/>
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer" PropertyID="Tenants"/>
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer" PropertyID="Capacity"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.MultiTenantRRASService">
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.MultiTenantRRASService" PropertyID="ServerName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.StandByRRASServerWatcher">
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.StandByRRASServerWatcher" PropertyID="ServerName"/>
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.StandByRRASServerWatcher" PropertyID="StandByServerName"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode">
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode" PropertyID="ServerName"/>
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode" PropertyID="StandByServerName"/>
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode" PropertyID="Status"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServerWatcher">
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServerWatcher" PropertyID="ServerName"/>
<Property TypeID="Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServerWatcher" PropertyID="Tenants"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="Windows!Microsoft.Windows.ComputerHostsComputerRole"/>
<DiscoveryRelationship TypeID="Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.MultiTenantRRASService.Contains.RemoteAccessServerWatcher"/>
<DiscoveryRelationship TypeID="Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.MultiTenantRRASService.Contains.StandByRRASServerWatcher"/>
<DiscoveryRelationship TypeID="Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.StandByRRASServerWatcher.Refers.RRASClusterNodes"/>
<DiscoveryRelationship TypeID="Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.RemoteAccessServerWatcher.Refers.RemoteAccess"/>
</DiscoveryTypes>
<DataSource ID="PSMultiTenantRRASServerDiscovery2" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>21600</IntervalSeconds>
<SyncTime/>
<ScriptName>DiscoverMutliTenantRRASAndBackupServer.ps1</ScriptName>
<ScriptBody><Script>
param($sourceId,$managedEntityId,$computerName)

# Setting Eventing for debugging purpose
$EventLog = new-object System.Diagnostics.EventLog('Application')
$EventLog.MachineName = "."
$EventLog.Source = "MultiTenantRRASServerDiscovery"

$api = new-object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)

$ab = [Security.Principal.WindowsIdentity]::GetCurrent()

function GetTenantNames
{
param($routingDomains)

$tenantNames = (@($routingDomains).RoutingDomain) -join ","
return $tenantNames
}

$ClusterService = "ClusSvc"
$RunningStatus = "Running"
$ERROR_SUCCESS = 0
$ERROR_FAILURE = 1
$RasClusterResource = "RAS Cluster Resource"
$RasNetworkNameResource = "Network Name"
$unknown = "UnKnownState"

function FuncCheckService{
param($ServiceName)
$service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if($service.Status -ne $RunningStatus)
{

return $ERROR_FAILURE
}
else
{
return $ERROR_SUCCESS
}
}

function CheckClusterResource{
param($ResourceType)
$isAvailable = Get-ClusterResource -ErrorAction SilentlyContinue | where ResourceType -EQ "RAS Cluster Resource"
if($isAvailable)
{
return $ERROR_SUCCESS
}
else
{
return $ERROR_FAILURE
}
}

function GetActiveNode{
param($ResourceType)
$resource = Get-ClusterResource -ErrorAction SilentlyContinue | where ResourceType -EQ $ResourceType
if($resource)
{
return $resource.OwnerNode
}
}

function GetVirtualServerName{
param($ResourceType)
$resource = Get-ClusterResource -ErrorAction SilentlyContinue | where ResourceType -EQ $ResourceType
if($resource)
{
return @(@($resource)[0].OwnerGroup | Get-ClusterResource | where ResourceType -EQ $RasNetworkNameResource)[0].Name
}
}

function GetpassiveNodes{
param($ResourceType)
$clusterNode = Get-ClusterNode
$passiveNodes = @()

$activeNode = GetActiveNode -ResourceType $RasClusterResource
foreach($item in $clusterNode)
{
if($item.Name -ne $activeNode.Name)
{
$passiveNodes += $item
}
}
return $passiveNodes;
}

function GetNodeStatus{
param($compName)

$clusterNodes = Get-ClusterNode

foreach ($clusterNode in $clusterNodes)
{
$Name = $clusterNode.Name + "." + (Get-WmiObject Win32_ComputerSystem).Domain
if($Name -eq $compName)
{
return $clusterNode.State.ToString()
}
}
return $unknown
}

try{
$RrasRole = Get-WindowsFeature "RemoteAccess"
$RrasMgmtPsTools = Get-WindowsFeature "RSAT-RemoteAccess-PowerShell"
if( ($RrasRole.Installed -eq $true) -AND ($RrasMgmtPsTools.Installed -eq $true))
{
$myRRAS = get-remoteaccess
$activeNodeName = $null
if ( $myRRAS.VpnMultiTenancyStatus -eq "Installed" )
{
$createServer = $true
$passiveNodes = $null
$standByServers = $null

$errorCode = FuncCheckService -ServiceName $ClusterService

if($errorCode -eq $ERROR_SUCCESS)
{
$errorCode = CheckClusterResource -ResourceType $RasClusterResource
if($errorCode -eq $ERROR_SUCCESS)
{
$createServer = $false
$passiveNodes = GetpassiveNodes -ResourceType $RasClusterResource
}

}

if($createServer -eq $true)
{
#Creating dummy node to show both active and passive nodes in a cluster
$haServer = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.MultiTenantRRASService']$")
$haServer.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "RRAS Service (" + $computerName + ")")
$haServer.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.MultiTenantRRASService']/ServerName$", $computerName)
$discoveryData.AddInstance($haServer)


#On a non-cluster node. Create the Multitenant RRAS Server object
$raServer = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer']$")
$raServer.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
$raServer.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "RRAS (" + $computerName + ")")
$raServer.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer']/ServerName$", $computerName)

$standByServers = $null
if($passiveNodes -ne $null)
{
$standByServers = (@($passiveNodes).Name) -join ","
}

$raServer.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer']/StandByServer$", $standByServers)
$raServer.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer']/Capacity$", $myRRAS.CapacityKbps)

$routingDomains = @(get-remoteaccessroutingdomain)
$tenantNames = $null
if($routingDomains.Count -gt 0)
{
$tenantNames = GetTenantNames -routingDomains $routingDomains
$raServer.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServer']/Tenants$", $tenantNames)
}

$discoveryData.AddInstance($raServer)

$remoteAccessServerWatcher = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServerWatcher']$")
$remoteAccessServerWatcher.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "RemoteAccess Server Watcher (" + $computerName + ")")
$remoteAccessServerWatcher.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServerWatcher']/ServerName$", $computerName)
$remoteAccessServerWatcher.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RemoteAccessServerWatcher']/Tenants$", $tenantNames)
$discoveryData.AddInstance($remoteAccessServerWatcher)

$rel_haServer_raWatcher = $discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.MultiTenantRRASService.Contains.RemoteAccessServerWatcher']$")
$rel_haServer_raWatcher.Source = $haServer
$rel_haServer_raWatcher.Target = $remoteAccessServerWatcher
$discoveryData.AddInstance($rel_haServer_raWatcher)

$rel_raServerWatcher_remoteAccess = $discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.RemoteAccessServerWatcher.Refers.RemoteAccess']$")
$rel_raServerWatcher_remoteAccess.Source = $remoteAccessServerWatcher
$rel_raServerWatcher_remoteAccess.Target = $raServer
$discoveryData.AddInstance($rel_raServerWatcher_remoteAccess)
}
else
{

$clusterNodeName = GetVirtualServerName -ResourceType $RasClusterResource
$clusterNodeFQDN = $clusterNodeName + "." + (Get-WmiObject Win32_ComputerSystem).Domain
$standbyServers = $null
$NodeStatus = $null
if($passiveNodes -ne $null)
{
$standbyServers = @($passiveNodes)[0].Name
}

if( $standbyServers -ne $null)
{
$NodeStatus = GetNodeStatus -compName $computerName
$standbyServers = $standbyServers + "." + (Get-WmiObject Win32_ComputerSystem).Domain

$temphaServer = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.MultiTenantRRASService']$")
$temphaServer.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.MultiTenantRRASService']/ServerName$", $clusterNodeFQDN)
$discoveryData.AddInstance($temphaServer)

$standByServerWatcher = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.StandByRRASServerWatcher']$")
$standByServerWatcher.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.StandByRRASServerWatcher']/ServerName$", $clusterNodeFQDN)
$discoveryData.AddInstance($standByServerWatcher)

$rel_temphaServer_backupWatcher = $discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.MultiTenantRRASService.Contains.StandByRRASServerWatcher']$")
$rel_temphaServer_backupWatcher.Source = $temphaServer
$rel_temphaServer_backupWatcher.Target = $standByServerWatcher
$discoveryData.AddInstance($rel_temphaServer_backupWatcher)

$rrasClusterNode = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode']$")
$rrasClusterNode.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
$rrasClusterNode.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "RRAS Cluster Node (" + $computerName + ")")
$rrasClusterNode.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode']/ServerName$", $computerName)
$rrasClusterNode.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode']/StandByServerName$", $standbyServers)
$rrasClusterNode.AddProperty("$MPElement[Name='Microsoft.Windows.RemoteAccess.Multitenant.2012.R2.Class.RRASClusterNode']/Status$", $NodeStatus)
$discoveryData.AddInstance($rrasClusterNode)

$rel_clusterNode_backupWatcher = $discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Windows.RemoteAccess.MultiTenant.2012.R2.StandByRRASServerWatcher.Refers.RRASClusterNodes']$")
$rel_clusterNode_backupWatcher.Source = $standByServerWatcher
$rel_clusterNode_backupWatcher.Target = $rrasClusterNode
$discoveryData.AddInstance($rel_clusterNode_backupWatcher)
}

}
}
}
}
catch{
$EventLog.WriteEntry("[MultiTenantRRASServerDiscovery] Error occured while running Discovery at (" + $computerName + ")" )
$EventLog.WriteEntry("[MultiTenantRRASServerDiscovery] Error Data: " + $_)
}


$discoveryData</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>sourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>managedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>computerName</Name>
<Value>$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>900</TimeoutSeconds>
</DataSource>
</Discovery>