Microsoft Windows Server DNS Forwarder Conditional Discovery

Microsoft.Windows.DNSServer.2016.Forwarder.Conditional.Discovery (Discovery)

Discovers Conditional Forwarders

Knowledge Base article:

Summary

Uses WMI to discover conditional forwarders.

Element properties:

TargetMicrosoft.Windows.DNSServer.2016.Server
EnabledTrue
Frequency14460
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Microsoft.Windows.DNSServer.2016.ActionAccount

Source Code:

<Discovery ID="Microsoft.Windows.DNSServer.2016.Forwarder.Conditional.Discovery" Enabled="true" Target="Microsoft.Windows.DNSServer.2016.Server" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress.Conditional.Forward">
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress" PropertyID="IPAddress"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress.Conditional.Reverse">
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress" PropertyID="IPAddress"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.DNSServer.2016.Forwarder.Conditional.Forward">
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder" PropertyID="DomainName"/>
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder" PropertyID="IsConditional"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder" PropertyID="ForwarderTimeout"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.DNSServer.2016.Forwarder.Conditional.Reverse">
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder" PropertyID="DomainName"/>
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder" PropertyID="IsConditional"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
<Property TypeID="Microsoft.Windows.DNSServer.2016.Forwarder" PropertyID="ForwarderTimeout"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="Microsoft.Windows.DNSServer.2016.ActionAccount" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>14460</IntervalSeconds>
<SyncTime/>
<ScriptName>Microsoft.Windows.Server.DNS.Forwarder.Conditional.Discovery.ps1</ScriptName>
<ScriptBody><Script> #Copyright (c) Microsoft Corporation. All rights reserved.

#*************************************************************************
# ScriptName: Microsoft.Windows.Server.DNS.Forwarder.Conditional.Discovery
#
# Purpose: DNS Forwarder Conditional Discovery
#
# File: Microsoft.Windows.Server.DNS.Forwarder.Conditional.Discovery.ps1
#*************************************************************************

param (
[parameter(Mandatory=$false)]
[String] $ElementID = "$MPElement$",
[parameter(Mandatory=$false)]
[String] $TargetID="$Target/Id$",
[parameter(Mandatory=$false)]
[String] $ServerName = "$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$"

)

Function Start-Initialization
{
Set-Variable momApi -value $null -Scope Script

Set-Variable EVENT_TYPE_LOG -value 0 -Scope Script -Option Constant
Set-Variable EVENT_TYPE_ERROR -value 1 -Scope Script -Option Constant
Set-Variable EVENT_TYPE_WARNING -value 2 -Scope Script -Option Constant
Set-Variable EVENT_TYPE_INFORMATION -value 4 -Scope Script -Option Constant

Set-Variable EventSuccess -value 5700 -Scope Script -Option Constant
Set-Variable EventError -value 5701 -Scope Script -Option Constant
Set-Variable EventWarn -value 5702 -Scope Script -Option Constant
Set-Variable EventInfo -value 5704 -Scope Script -Option Constant


Set-Variable discoveryData -value $null -Scope Script

Set-Variable DnsForwarderTypeName -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder.Conditional.Forward']$" -Scope Script
Set-Variable DnsReverseForwarderTypeName -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder.Conditional.Reverse']$" -Scope Script
Set-Variable DnsForwarderIpTypeName -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress.Conditional.Forward']$" -Scope Script
Set-Variable DnsReverseForwarderIpTypeName -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress.Conditional.Reverse']$" -Scope Script


Set-Variable DnsForwarderDomainProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder']/DomainName$" -Scope Script
Set-Variable DnsForwarderIsCondProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder']/IsConditional$" -Scope Script
Set-Variable DnsForwarderTimeoutProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder']/ForwarderTimeout$" -Scope Script
Set-Variable DnsForwarderIpProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Forwarder.IPAddress']/IPAddress$" -Scope Script
Set-Variable SysDisplayNameProp -value "$MPElement[Name='System!System.Entity']/DisplayName$" -Scope Script
Set-Variable DNSNameProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Server']/Name$" -Scope Script
Set-Variable CompNameProp -value "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$" -Scope Script
Set-Variable SCRIPT_NAME -value "Microsoft.Windows.Server.DNS.Forwarder.Conditional.Discovery.ps1" -Scope Script -Option Constant
Set-Variable DnsForwarderDisplayName -value "on" -Scope Script -Option Constant
Set-Variable DnsZoneSysDispNameMaxSize -value 256 -Scope Script -Option Constant

}

Function Set-EmptyDiscoveryData
{
$Script:discoveryData = $Script:momApi.CreateDiscoveryData(0, $Script:ElementID, $Script:TargetID )
$Script:discoveryData.IsSnapshot = $false
$Script:discoveryData
}

Function Start-SCOMobjectsInitialization
{
try
{
$Script:momApi = New-Object -ComObject Mom.ScriptAPI -ErrorAction Stop
$Script:discoveryData = $Script:momApi.CreateDiscoveryData(0, $Script:ElementID, $Script:TargetID )
$Script:discoveryData.IsSnapshot = $true
}
catch
{
if ($null -eq $Script:momApi)
{
exit -1
}
else
{
$ErrorMessage = Get-ErrorMessage -Exception $_.Exception
Set-Error -ScriptName $Script:SCRIPT_NAME -EventLevel $Script:EventError -EventType $Script:EVENT_TYPE_ERROR -ErrorMessage $ErrorMessage
exit
}

}

}

Function Get-ErrorMessage($Exception)
{
$Error = $Exception.Message
$ErrorMessage = @"
Module: $Script:SCRIPT_NAME

Error(s) was(were) occurred:
State:
The configuration properties are :
ServerName = $Script:ServerName
DiscoverySourceObjectId = $Script:ElementID
DiscoverySourceManagedEntityId = $Script:TargetID
Error(s):
$Error

"@

return $ErrorMessage
}



Function Start-Discovery
{

try
{
$Forwarders = Get-DnsServerZone | where {$_.ZoneType -eq "Forwarder"}

foreach ($Forwarder in $Forwarders)
{
if ($true -eq $Forwarder.IsReverseLookupZone)
{
$ForwarderInstance = $Script:discoveryData.CreateClassInstance($Script:DnsReverseForwarderTypeName)
}
else
{
$ForwarderInstance = $Script:discoveryData.CreateClassInstance($Script:DnsForwarderTypeName)

}

$SysDispName = $Forwarder.ZoneName + " $Script:DnsForwarderDisplayName $Script:ServerName"
if ($Script:DnsZoneSysDispNameMaxSize -lt $SysDispName.Length)
{
$SysDispName = $SysDispName.Substring(0,$Script:DnsZoneSysDispNameMaxSize)
}

$ForwarderInstance.AddProperty($Script:CompNameProp,$Script:ServerName)
$ForwarderInstance.AddProperty($Script:DNSNameProp, $Script:ServerName)
$ForwarderInstance.AddProperty($Script:DnsForwarderDomainProp,$Forwarder.ZoneName)
$ForwarderInstance.AddProperty($Script:DnsForwarderIsCondProp,$true)
$ForwarderInstance.AddProperty($Script:DnsForwarderTimeoutProp,$Forwarder.ForwarderTimeout)
$ForwarderInstance.AddProperty($Script:SysDisplayNameProp,$SysDispName)
$Script:discoveryData.AddInstance($ForwarderInstance)


foreach ($address in $Forwarder.MasterServers)
{
if ($true -eq $Forwarder.IsReverseLookupZone)
{
$ForwarderIpInstance = $Script:discoveryData.CreateClassInstance($Script:DnsReverseForwarderIpTypeName)
}
else
{
$ForwarderIpInstance = $Script:discoveryData.CreateClassInstance($Script:DnsForwarderIpTypeName)

}


$ForwarderIpInstance.AddProperty($Script:CompNameProp,$Script:ServerName)
$ForwarderIpInstance.AddProperty($Script:DNSNameProp, $Script:ServerName)
$ForwarderIpInstance.AddProperty($Script:DnsForwarderDomainProp,$Forwarder.ZoneName)
$ForwarderIpInstance.AddProperty($Script:DnsForwarderIpProp,$address.IPAddressToString)
$Script:discoveryData.AddInstance($ForwarderIpInstance)
}

}

$Script:discoveryData
}
catch
{
$ErrorMessage = Get-ErrorMessage -Exception $_.Exception
Set-Error -ScriptName $Script:SCRIPT_NAME -EventLevel $Script:EventError -EventType $Script:EVENT_TYPE_ERROR -ErrorMessage $ErrorMessage

Set-EmptyDiscoveryData
}
}

Function Set-Error([String]$ErrorMessage,$EventLevel,$EventType,[String]$ScriptName)
{
if ($null -eq $Script:momApi)
{
return
}

try
{
$Script:momApi.LogScriptEvent($ScriptName,$EventLevel,$EventType,$ErrorMessage)

}
catch
{
}

}

Function Import-CmdLets ()
{
try
{
$dnsmodule = Get-Module -Name "DnsServer"
if ($null -eq $dnsmodule)
{
Import-Module DnsServer
}
}
catch [System.IO.FileNotFoundException]
{
$ErrorMessage = "Dns cmdlets doesn't exist."
Set-Error -ScriptName $Script:SCRIPT_NAME -EventLevel $Script:EventError -EventType $Script:EVENT_TYPE_ERROR -ErrorMessage $ErrorMessage
exit
}
catch
{
$ErrorMessage = Get-ErrorMessage -Exception $_.Exception
Set-Error -ScriptName $Script:SCRIPT_NAME -EventLevel $Script:EventError -EventType $Script:EVENT_TYPE_ERROR -ErrorMessage $ErrorMessage
exit
}
}

$ErrorActionPreference = "Stop"

$Script:ElementID = $ElementID
$Script:TargetID = $TargetID
$Script:ServerName = $ServerName

Start-Initialization
Start-SCOMobjectsInitialization
Import-CmdLets
Start-Discovery
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>ElementID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>TargetID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>ServerName</Name>
<Value>$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>