<ProbeActionModuleType ID="Community.DataOnDemand.Probe.ResolveAddress" Accessibility="Public" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Addresses" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Format" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:int"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="Addresses" Selector="$Config/Addresses$" ParameterType="string"/>
<OverrideableParameter ID="Format" Selector="$Config/Format$" ParameterType="string"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation>
<Composite>
<MemberModules>
<ProbeAction ID="Probe" TypeID="Windows!Microsoft.Windows.PowerShellTriggerOnlyProbe">
<ScriptName>Resolve-Address.ps1</ScriptName>
<ScriptBody><Script><#
.SYNOPSIS
DNS-resolve the supplied IP addresses or hostnames.
.DESCRIPTION
This script calls the .NET System.Net.Dns.GetHostEntry() method
to resolve the IP addresses or hostname supplied.
.PARAMETER Addresses
The IP addresses or hostnames to resolve (comma-separated list).
.PARAMETER Format
Permitted values: text, csv, json, list
.NOTES
Output is sent to Write-Host to simplify consumption of output
when run as a SCOM agent task.
Copyright 2016 Squared Up Limited, All Rights Reserved.
#>
[CmdletBinding()]
Param(
[string]$Addresses,
# Create a dictionary and start asynchronously requesting records.
$requests = @{}
foreach ($target in $Addresses.split(@(',',' '), [System.StringSplitOptions]::RemoveEmptyEntries))
{
$target = $target.trim()
if (!$requests.ContainsKey($target))
{
$requests[$target] = [System.Net.Dns]::BeginGetHostEntry($target, $null, $null)
}
}
# parse output of any completed requests, and wait for others.
$output = @()
do
{
$keys = @() + $requests.Keys
foreach ($target in $keys)
{
$request = $requests[$target]
if ($request.IsCompleted)
{
try
{
$ip = $null
$result = [System.Net.Dns]::EndGetHostEntry($request)
if ($result)
{
$isIPAddress = [System.Net.IPAddress]::TryParse($target, [ref]$ip)
if ($isIPAddress -and $result.Hostname -ne $result.AddressList[0].tostring())
{
$output += New-Object PSObject -Property @{ IpAddress = $ip.tostring();HostName = $result.HostName }
}
elseif (!$isIpAddress -and $result.AddressList.count -gt 0)
{
$output += New-Object PSObject -Property @{ IpAddress = $result.AddressList[0].ToString();HostName = $target }
}
}
}
catch
{
Write-Verbose "$target not found in DNS or stale records present" -Verbose:$VerbosePreference
}
finally
{
$requests.Remove($target)
}
}
else
{
Write-Verbose -Message "Waiting for $($target)" -Verbose:$VerbosePreference
Start-Sleep -Milliseconds 500
}
}
} while ($keys.count -gt 0)
# Done. (do not remove blank line following this comment as it can cause problems when script is sent to SCOM agent!) </Script></ScriptBody>
<Parameters>
<Parameter>
<Name>Addresses</Name>
<Value>$Config/Addresses$</Value>
</Parameter>
<Parameter>
<Name>Format</Name>
<Value>$Config/Format$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="Probe"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Windows!Microsoft.Windows.SerializedObjectData</OutputType>
<TriggerOnly>true</TriggerOnly>
</ProbeActionModuleType>