DHCP 2012 Failover Server Relationships Discovery

Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher.Discovery (Discovery)

This discovery rule populates the DHCP 2012 Failover Server Relationships instances.

Knowledge Base article:

Summary

This Discovery Rule discovers and populates the DHCP 2012 Failover Server Relationships instances defined in Server that are running a Microsoft Windows DHCP Server 2012.

Element properties:

TargetMicrosoft.Windows.DHCPServer.2012.Server
EnabledTrue
Frequency86400
RemotableFalse

Object Discovery Details:

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

Member Modules:

ID Module Type TypeId RunAs 
DS4 DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider System.PrivilegedMonitoringAccount

Source Code:

<Discovery ID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher.Discovery" Enabled="true" Target="Microsoft.Windows.DHCPServer.2012.Server" ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher">
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="Name"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="LocalServer"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="PartnerServer"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="ScopeId"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="Mode"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="LoadBalancePercent"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="ServerRole"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="ReservePercent"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="MaxClientLeadTime"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="StateSwitchInterval"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="AutoStateTransition"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="EnableAuth"/>
<Property TypeID="Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher" PropertyID="OSCurrentVersion"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="Microsoft.Windows.DHCPServer.2012.References.FailoverServerWatcher"/>
</DiscoveryTypes>
<DataSource ID="DS4" RunAs="System!System.PrivilegedMonitoringAccount" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>86400</IntervalSeconds>
<SyncTime/>
<ScriptName>DiscoverDHCPFailoverServerWatcher2012</ScriptName>
<ScriptBody><Script>

param ([String] $ElementID, [String] $TargetID, [String] $PrincipalName)
$SCRIPT_NAME = "DiscoverDHCPFailoverServerWatcher2012"

$ErrorActionPreference = "Stop"

# Event type constants
$EVENT_TYPE_LOG = 0
$EVENT_TYPE_ERROR = 1
$EVENT_TYPE_WARNING = 2
$EVENT_TYPE_INFORMATION = 4

# Typed property bag constants
$PROPERTY_TYPE_ALERT = 0
$PROPERTY_TYPE_EVENT = 1
$PROPERTY_TYPE_PERFORMANCE = 2
$PROPERTY_TYPE_STATE = 3

# State type constants
$STATE_SUCCESS = "Success"
$STATE_WARNING = "Warning"
$STATE_ERROR = "Error"

$momAPI = new-object -comObject MOM.ScriptAPI


$TargetOSVersion = "6.2"

$ComputerName = "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$"
$SourceServerClass = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']$"
$TargetServerClass = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.Server']$"
$RelationshipClass = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.References.FailoverServerWatcher']$"
$Name = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/Name$"
$DisplayName = "$MPElement[Name='System!System.Entity']/DisplayName$"
$LocalServer = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/LocalServer$"
$PartnerServer = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/PartnerServer$"
$ScopeId = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/ScopeId$"
$Mode = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/Mode$"
$LoadBalancePercent = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/LoadBalancePercent$"
$ServerRole = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/ServerRole$"
$ReservePercent = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/ReservePercent$"
$MaxClientLeadTime = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/MaxClientLeadTime$"
$StateSwitchInterval = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/StateSwitchInterval$"
$AutoStateTransition = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/AutoStateTransition$"
$EnableAuth = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/EnableAuth$"
$OSCurrentVersion = "$MPElement[Name='Microsoft.Windows.DHCPServer.2012.FailoverServerWatcher']/OSCurrentVersion$"

$ComputerKey = "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$"
$ComputerName = "$MPElement[Name='DHCP!Microsoft.Windows.DHCPServer.Library.Server']/Name$"

Write-Host "$SCRIPT_NAME - Executing DHCP Failover Server Watcher Discovery Powershell Script"

$discoveryData = $momAPI.CreateDiscoveryData(0, $ElementID, $TargetID)
$ScopeIdSize=65536

$OS = Get-ItemProperty "hklm:\software\microsoft\windows nt\currentversion"

if ($OS.CurrentVersion -ne $TargetOSVersion)
{
Write-Host "$SCRIPT_NAME - No Target Operating System"
$discoveryData
exit
}
else
{
try
{
Write-Host "$SCRIPT_NAME - Target Server"

$DHCPFailoverWatchers = Get-DhcpServerv4Failover -ComputerName $PrincipalName
$DHCPFailoverWatcher = $null
$ObjDHCPFailoverWatcher = $null
$FailoverWatcherRelationship = $null
$TargetServer = $null

if ($DHCPFailoverWatchers -ne $null)
{
if($DHCPFailoverWatchers.Count -eq $null)
{
$FailoverCount = 1
}
else
{
$FailoverCount = $DHCPFailoverWatchers.Count
}

if ($FailoverCount -eq 0)
{
Write-Host "$SCRIPT_NAME - No DHCP Failover configured in this DHCP Server"
$discoveryData
exit
}
else
{
if ($FailoverCount -gt 0)
{

for ($itmFO=0; $itmFO -lt $FailoverCount; $itmFO++)
{

if($FailoverCount -eq 1)
{
$FailOvObj = $DHCPFailoverWatchers
}
else
{
$FailOvObj = $DHCPFailoverWatchers.Item($itmFO)
}

$ObjDHCPFailoverWatcher = $discoveryData.CreateClassInstance($SourceServerClass)
$ObjDHCPFailoverWatcher.AddProperty($Name, $FailOvObj.Name)
$ObjDHCPFailoverWatcher.AddProperty($DisplayName, $FailOvObj.Name)
$ObjDHCPFailoverWatcher.AddProperty($LocalServer, $PrincipalName)
$ObjDHCPFailoverWatcher.AddProperty($PartnerServer, $FailOvObj.PartnerServer)
$ObjDHCPFailoverWatcher.AddProperty($Mode, $FailOvObj.Mode)
$ObjDHCPFailoverWatcher.AddProperty($LoadBalancePercent, $FailOvObj.LoadBalancePercent)
$ObjDHCPFailoverWatcher.AddProperty($ServerRole, $FailOvObj.ServerRole)
$ObjDHCPFailoverWatcher.AddProperty($ReservePercent, $FailOvObj.ReservePercent)
$ObjDHCPFailoverWatcher.AddProperty($MaxClientLeadTime, $FailOvObj.MaxClientLeadTime.ToString())

if($FailOvObj.StateSwitchInterval -eq $null)
{
$StateSI = ""
}
else
{
$StateSI = $FailOvObj.StateSwitchInterval.ToString()
}

$ObjDHCPFailoverWatcher.AddProperty($StateSwitchInterval, $StateSI)

if ($FailOvObj.ScopeId -ne $null)
{
if ($FailOvObj.ScopeId -is [System.Array])
{
$addressList = $FailOvObj.ScopeId -join ', '
}
else
{
$addressList = $FailOvObj.ScopeId.ToString()
}
if($addressList.Length -gt $ScopeIdSize)
{
$lastIndex=($addressList.Substring(0,$ScopeIdSize).LastIndexOf(','));
$addressList=$addressList.Substring(0,$lastIndex)
}
}
$ObjDHCPFailoverWatcher.AddProperty($ScopeId, $addressList)

$ObjDHCPFailoverWatcher.AddProperty($AutoStateTransition, $FailOvObj.AutoStateTransition)
$ObjDHCPFailoverWatcher.AddProperty($EnableAuth, $FailOvObj.EnableAuth)
$ObjDHCPFailoverWatcher.AddProperty($OSCurrentVersion, $OS.CurrentVersion)
$discoveryData.AddInstance($ObjDHCPFailoverWatcher)

$TargetServer = $discoveryData.CreateClassInstance($TargetServerClass)
$TargetServer.AddProperty($ComputerKey, $FailOvObj.PartnerServer)
$TargetServer.AddProperty($ComputerName, $FailOvObj.PartnerServer)

$FailoverWatcherRelationship = $discoveryData.CreateRelationshipInstance($RelationshipClass)
$FailoverWatcherRelationship.Source = $ObjDHCPFailoverWatcher
$FailoverWatcherRelationship.Target = $TargetServer

$discoveryData.AddInstance($FailoverWatcherRelationship)

Write-Host "$SCRIPT_NAME - DHCP IPV4 Failover Watcher Added to Discovery data"
}
}
}
}
}

catch [System.Exception]
{
$Description = $_.ToString()
Write-Warning "$SCRIPT_NAME - $Description"
}

finally
{
$discoveryData
Write-Host "$SCRIPT_NAME - Discovery data returned"
}
}</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>ElementID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>TargetID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>PrincipalName</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>