Microsoft Windows Server DNS Monitoring Control Zone WA

Microsoft.Windows.DNSServer.2016.ControlZone.WA (WriteActionModuleType)

Script Write Action that performs multiple zone control actions

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
InputTypeSystem.BaseData
OutputTypeSystem.CommandOutput

Member Modules:

ID Module Type TypeId RunAs 
WA WriteAction Microsoft.Windows.PSScriptWriteAction Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
Timeoutint$Config/Timeout$Zone Transfer LatencyStandard Zone transfer  latency is 15 seconds. It requires changing the latency for some zones

Source Code:

<WriteActionModuleType ID="Microsoft.Windows.DNSServer.2016.ControlZone.WA" Accessibility="Public" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Server" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Zone" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Action" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="Timeout" type="xsd:int"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="Timeout" Selector="$Config/Timeout$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="WA" TypeID="Microsoft.Windows.PSScriptWriteAction">
<ScriptName>Microsoft.Windows.Server.DNS.ControlZone.WA.ps1</ScriptName>
<Arguments>"-ServerName $Config/Server$ -ZoneName $Config/Zone$ -Command $Config/Action$ -Timeout '$Config/Timeout$'"</Arguments>
<ScriptBody><Script>#Copyright (c) Microsoft Corporation. All rights reserved.
#*************************************************************************
# ScriptName: Microsoft.Windows.Server.DNS.ControlZone.WA
#
# Purpose: DNS Server DNS Control Zone Write Action
#
# File: Microsoft.Windows.Server.DNS.ControlZone.WA.ps1
#*************************************************************************

param (
[parameter(Mandatory=$false)]
[string]$ServerName = [string]::Empty,
[parameter(Mandatory=$false)]
[string]$ZoneName = [string]::Empty,

[parameter(Mandatory=$false)]
[string]$Command = [string]::Empty,

[parameter(Mandatory=$false)]
[int]$Timeout= 15

)

Function Start-Initialization
{
Set-Variable DnsWmiNamespace -value "root\MicrosoftDNS" -Scope Script -Option Constant
Set-Variable DnsWmiClass -value "MicrosoftDNS_Zone" -Scope Script -Option Constant

Set-Variable ErrorDnsWmiClass -value "Unable to identify specified zone." -Scope Script -Option Constant
Set-Variable ErrorDnsZoneNotFound -value "Zone not found." -Scope Script -Option Constant
Set-Variable ErrorBadArguments -value "Bad command specified." -Scope Script -Option Constant

Set-Variable SCRIPT_NAME -value "Microsoft.Windows.DNSServer.2016.ControlZone.WA.ps1" -Scope Script -Option Constant
}


Function Write-ErrorOutput([string]$strMessageArg = [string]::Empty, [string]$ErrorDescription = [string]::Empty, [bool]$IsInfo = $false,$ErrorNumber = $null)
{
$sErrorDescription = "Error: "
$double = 0

if ($false -eq $IsInfo)
{
Write-Host "$Script:SCRIPT_NAME completed with an error."
Write-Host "$strMessageArg"
}
else
{
Write-Host "$Script:SCRIPT_NAME completed successfully."
}

Write-Host "Server: $Script:ServerName"
Write-Host "Zone: $Script:ZoneName"
Write-Host "Command: $Script:Command"

if ( $false -eq [string]::IsNullOrEmpty($ErrorDescription) -and $false -eq $IsInfo)
{

if([double]::TryParse($ErrorNumber,[ref]$double))
{
$sErrorDescription = $ErrorDescription + "0x" + $ErrorNumber.ToString("x") + " - "
}

$sErrorDescription = $sErrorDescription + $ErrorDescription
Write-Host $sErrorDescription
}
}

Function Start-ZoneControl
{
if ($true -eq [string]::IsNullOrEmpty($Script:ZoneName) )
{
Write-ErrorOutput -strMessageArg $Script:ErrorBadArguments
return
}

if ($true -eq [string]::IsNullOrEmpty($Script:ServerName) )
{
$Script:ServerName = "."
}

$ZoneFilter = "Name='$Script:ZoneName'"
try
{
Import-CmdLets
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -ComputerName $Script:ServerName -SessionOption $cimSessionOption
$dnsZones = Get-CimInstance -CimSession $cimsession -Class $Script:DnsWmiClass -Namespace $Script:DnsWmiNameSpace -Filter $ZoneFilter -ErrorAction Stop
}
catch
{
$dnsZones = Get-WMIObject -Class $Script:DnsWmiClass -Namespace $Script:DnsWmiNameSpace -ComputerName $Script:ServerName -Filter $ZoneFilter -ErrorAction Stop
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}

try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
foreach ($dnsZone in $dnsZones)
{
switch ($Script:Command)
{
pause {Invoke-CimMethod -CimSession $cimsession -InputObject $dnsZone -MethodName "PauseZone" -ErrorAction Stop;break}
resume {Invoke-CimMethod -CimSession $cimsession -InputObject $dnsZone -MethodName "ResumeZone" -ErrorAction Stop;break}
reload {Invoke-CimMethod -CimSession $cimsession -InputObject $dnsZone -MethodName "ReloadZone" -ErrorAction Stop;break}
refresh {
if (2 -eq $dnsZone.ZoneType )
{
sleep -Seconds $Script:Timeout
Invoke-CimMethod -CimSession $cimsession -InputObject $dnsZone -MethodName "ForceRefresh" -ErrorAction Stop
}
else
{
Write-Host "This command only valid to run on Secondary Zone."
}

;break
}
update {
if (0 -eq $dnsZone.ZoneType )
{
Invoke-CimMethod -CimSession $cimsession -InputObject $dnsZone -MethodName "UpdateFromDS" -ErrorAction Stop
}
else
{
Write-Host "This command only valid to run on Active Directory Integrated Zone."
}
;break
}
default {Write-ErrorOutput -strMessageArg $Script:ErrorBadArguments ; exit 0}
}
}

}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
if ($null -eq $dnsZones)
{
Write-ErrorOutput -strMessageArg $Script:ErrorDnsZoneNotFound

}
else
{
Write-ErrorOutput -IsInfo $true
}
}
catch
{
$ErrorNumber = $_.Exception.HResult
Write-ErrorOutput -strMessageArg $Script:ErrorDnsWmiClass -ErrorDescription $_.Exception.Message -ErrorNumber $ErrorNumber
}

}

Function Import-CmdLets ()
{
try
{
$module = Get-Module -Name "CimCmdlets"
if ($null -eq $module)
{
Import-Module CimCmdlets
}
}
catch [System.IO.FileNotFoundException]
{
$ErrorMessage = "Cim cmdlets doesn't exist."
Write-ErrorOutput -strMessageArg $Script:ErrorDnsWmiClass -ErrorDescription $ErrorMessage
exit
}
catch
{
$ErrorMessage = $_.Exception.Message
Write-ErrorOutput -strMessageArg $Script:ErrorDnsWmiClass -ErrorDescription $ErrorMessage
exit
}
}



$Script:Command = $Command
$Script:ServerName = $ServerName
$Script:ZoneName = $ZoneName
$Script:Timeout = $Timeout

Start-Initialization
Import-CmdLets
Start-ZoneControl
</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="WA"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.CommandOutput</OutputType>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>