Microsoft Windows Server DNS WINS Discovery
Microsoft.Windows.DNSServer.2016.WINS.Discovery (Discovery)
Discovers WINS integrated zones
Knowledge Base article:
Element properties:
Object Discovery Details:
Member Modules:
Source Code:
<Discovery ID="Microsoft.Windows.DNSServer.2016.WINS.Discovery" Enabled="true" Target="Microsoft.Windows.DNSServer.2016.Zone" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Windows.DNSServer.2016.Zone.WINSConnector">
<Property TypeID="Microsoft.Windows.DNSServer.2016.Zone.WINSConnector" PropertyID="IPAddress"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
<DiscoveryClass TypeID="Microsoft.Windows.DNSServer.2016.Zone.WINSRConnector">
<Property TypeID="Microsoft.Windows.DNSServer.2016.Zone.WINSRConnector" PropertyID="ResultDomain"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" RunAs="Microsoft.Windows.DNSServer.2016.ActionAccount" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>14760</IntervalSeconds>
<SyncTime/>
<ScriptName>Microsoft.Windows.Server.DNS.WINS.Discovery.ps1</ScriptName>
<ScriptBody><Script>#Copyright (c) Microsoft Corporation. All rights reserved.
#*************************************************************************
# ScriptName: Microsoft.Windows.Server.DNS.WINS.Discovery
#
# Purpose: DNS Server WINS Discovery
#
# File: Microsoft.Windows.Server.DNS.WINS.Discovery.ps1
#*************************************************************************
param (
[parameter(Mandatory=$false)]
[String] $ElementID = "$MPElement$",
[parameter(Mandatory=$false)]
[String] $TargetID="$Target/Id$",
[parameter(Mandatory=$false)]
[String] $ServerName = "$Target/Host/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$",
[parameter(Mandatory=$false)]
[String] $ZoneName = "$Target/Property[Type='Microsoft.Windows.DNSServer.2016.Zone']/ZoneName$",
[parameter(Mandatory=$false)]
[String] $IsReverseZone = "$Target/Property[Type='Microsoft.Windows.DNSServer.2016.Zone']/IsReverseZone$"
)
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 DNSWmiWINSRType -Value "WINSR" -Scope Script -Option Constant
Set-Variable DNSWmiWINSType -Value "WINS" -Scope Script -Option Constant
Set-Variable WINSRTypeName -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Zone.WINSRConnector']$" -Scope Script
Set-Variable WINSRConnectorProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Zone.WINSRConnector']/ResultDomain$" -Scope Script
Set-Variable WINSConnectorProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Zone.WINSConnector']/IPAddress$" -Scope Script
Set-Variable WINSTypeName -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Zone.WINSConnector']$" -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 ZoneNameProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Zone']/ZoneName$" -Scope Script
Set-Variable ZoneHostProp -value "$MPElement[Name='Microsoft.Windows.DNSServer.2016.Zone']/HostName$" -Scope Script
Set-Variable SCRIPT_NAME -value "Microsoft.Windows.Server.DNS.WINS.Discovery.ps1" -Scope Script -Option Constant
Set-Variable Delimiter -value " " -Scope Script -Option Constant
Set-Variable WinsServersMaxSize -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 -ne $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 Convert-ToBoolean([string] $sBool)
{
[bool] $result = $false
[bool] $iresult = $false
if ($false -eq [string]::IsNullOrEmpty($sBool) )
{
$result = $sBool.Equals("true",[System.StringComparison]::InvariantCultureIgnoreCase)
$iresult = $sBool.Equals("1",[System.StringComparison]::InvariantCultureIgnoreCase)
$result = $result -or $iresult
}
return $result
}
Function Start-Discovery
{
$IsReverseZoneFlag = Convert-ToBoolean -sBool $Script:IsReverseZone
if ($true -eq $IsReverseZoneFlag)
{
$RType = $Script:DNSWmiWINSRType
}
else
{
$RType = $Script:DNSWmiWINSType
}
try
{
$RecordData = Get-DnsServerResourceRecord -ZoneName $Script:ZoneName -RRType $RType
foreach ($RRecord in $RecordData)
{
if ($true -eq $IsReverseZoneFlag)
{
$ResultDomain = $RRecord.RecordData.ResultDomain
if ([String]::IsNullOrEmpty($ResultDomain))
{
continue
}
if($ResultDomain.Length -le 1)
{
continue
}
$ResultDomain = $ResultDomain.Substring(0,$ResultDomain.Length - 1)
$WinsConnectorInstance = $Script:discoveryData.CreateClassInstance($Script:WINSRTypeName)
$WinsConnectorInstance.AddProperty($Script:CompNameProp,$Script:ServerName )
$WinsConnectorInstance.AddProperty($Script:DNSNameProp, $Script:ServerName)
$WinsConnectorInstance.AddProperty($Script:ZoneNameProp,$Script:ZoneName)
$WinsConnectorInstance.AddProperty($Script:ZoneHostProp,$Script:ServerName)
$WinsConnectorInstance.AddProperty($Script:WINSRConnectorProp,$ResultDomain)
$Script:discoveryData.AddInstance($WinsConnectorInstance)
}
else
{
$WinsServers = Get-WinsServers -WinsServers $RRecord.RecordData.WinsServers -separator $Script:Delimiter -MaxSize $Script:WinsServersMaxSize
$WinsConnectorInstance = $Script:discoveryData.CreateClassInstance($Script:WINSTypeName)
$WinsConnectorInstance.AddProperty($Script:CompNameProp,$Script:ServerName )
$WinsConnectorInstance.AddProperty($Script:DNSNameProp, $Script:ServerName)
$WinsConnectorInstance.AddProperty($Script:ZoneNameProp,$Script:ZoneName)
$WinsConnectorInstance.AddProperty($Script:ZoneHostProp,$Script:ServerName)
$WinsConnectorInstance.AddProperty($Script:WINSConnectorProp,$WinsServers)
$Script:discoveryData.AddInstance($WinsConnectorInstance)
}
}
$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 Get-WinsServers($WinsServers,[String]$separator,$MaxSize)
{
$ResultString = [String]::Empty
if ($null -eq $WinsServers)
{
return $ResultString;
}
if ([String]::IsNullOrEmpty($separator))
{
$separator = $Script:Delimiter
}
if ($null -eq $MaxSize)
{
$MaxSize = $Script:WinsServersMaxSize
}
if($null -eq $WinsServers.Count)
{
$ArraySize = 1
}
else
{
$ArraySize = $WinsServers.Count
}
try
{
$IpStringArr = @(1..$ArraySize)
$ResultLength = 0
$index = 0
foreach ($WinsServer in $WinsServers)
{
if ( -Not [String]::IsNullOrEmpty($WinsServer.IPAddressToString) )
{
if (0 -eq $index)
{
$delta = $MaxSize - $ResultLength
}
else
{
$delta = $MaxSize - $ResultLength - $separator.Length
}
if($delta -lt $WinsServer.IPAddressToString.Length)
{
continue
}
$IpStringArr[$index] = $WinsServer.IPAddressToString
$ResultLength = $ResultLength + $WinsServer.IPAddressToString.Length
if ($index -gt 0)
{
$ResultLength = $ResultLength + $separator.Length
}
$index = $index + 1
}
}
if ($index -ne 0)
{
$ResultIpArr = @(1..$index)
[array]::Copy($IpStringArr,$ResultIpArr,$index)
$ResultString = [String]::Join($separator,$ResultIpArr)
}
}
catch
{
$ResultString = [String]::Empty
$ErrorMessage = Get-ErrorMessage -Exception $_.Exception
Set-Error -ScriptName $Script:SCRIPT_NAME -EventLevel $Script:EventWarn -EventType $Script:EVENT_TYPE_WARNING -ErrorMessage $ErrorMessage
}
return $ResultString
}
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
$Script:ZoneName = $ZoneName
$Script:IsReverseZone = $IsReverseZone
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/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$</Value>
</Parameter>
<Parameter>
<Name>ZoneName</Name>
<Value>$Target/Property[Type='Microsoft.Windows.DNSServer.2016.Zone']/ZoneName$</Value>
</Parameter>
<Parameter>
<Name>IsReverseZone</Name>
<Value>$Target/Property[Type='Microsoft.Windows.DNSServer.2016.Zone']/IsReverseZone$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>