Microsoft Windows Server 2016 and above BPA Monitoring Task Module Type

Microsoft.Windows.Server.10.0.Monitoring.BPA.Task.ModuleType (ProbeActionModuleType)

This module type is used to show Best Practices Analyzer compliance results.

Element properties:

TypeProbeActionModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeMicrosoft.Windows.SerializedObjectData

Member Modules:

ID Module Type TypeId RunAs 
PA ProbeAction Microsoft.Windows.Server.10.0.BPA.PowerShellPropertyBagProbe Default
PassThrough ProbeAction System.PassThroughProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IncludeCompliantbool$Config/IncludeCompliant$Include Compliant rules.This parameter defines whether to show compliant BPA rules or not.

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.Server.10.0.Monitoring.BPA.Task.ModuleType" Accessibility="Internal" Batching="false" PassThrough="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IncludeCompliant" type="xsd:boolean"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IncludeCompliant" Selector="$Config/IncludeCompliant$" ParameterType="bool"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<ProbeAction ID="PassThrough" TypeID="System!System.PassThroughProbe"/>
<ProbeAction ID="PA" TypeID="Microsoft.Windows.Server.10.0.BPA.PowerShellPropertyBagProbe">
<ScriptName>Microsoft.Windows.Server.10.0.Monitoring.BPA.ShowBPAresults.Script.ps1</ScriptName>
<PSparam>
Param($IncludeCompliant)
</PSparam>
<ScriptBody><Script>function WriteBPAResult
{
param ([Microsoft.BestPractices.CoreInterface.Result]$BPAResult, [boolean]$IncludeAll)

$Delimiter = New-Object String("-",12)
if ($BPAResult.Problem -eq $null)
{
if ($IncludeAll)
{
Write-Host $(-Join("Title : ", $BPAResult.Title))
Write-Host $(-Join("Compliance : ", $BPAResult.Compliance))
Write-Host $Delimiter
}
}
else
{
Write-Host $(-Join("Title : ", $BPAResult.Title))
Write-Host $(-Join("Problem : ", $BPAResult.Problem))
Write-Host $(-Join("Impact : ", $BPAResult.Impact))
Write-Host $(-Join("Resolution : ", $BPAResult.Resolution))
Write-Host $Delimiter
}
}

function WriteModelResults
{
param ([string]$BPAModel, [boolean]$IncludeAll)
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$BPAResults = Get-BPAResult -ModelId $BPAModel -ErrorAction SilentlyContinue

if (0 -ne $error.Count -and $null -eq $BPAResults)
{

if ($BpaCategoryError -ieq $error[0].CategoryInfo.Category)
{
Write-Host $BpaScanNotRun
Write-Host $BpaScanMonitor
}
else
{
$msg = $error[0].Exception.Message
$msg = $BpaErrorResults -f $msg
Write-Host $msg
}

return
}


if ($null -eq $BPAResults )
{
Write-Host $BpaEmptyResults
return

}

$NotCompliantResults = $BPAResults | Where-Object {$_.Problem -ne $null}

[boolean] $IsModelCompliant = [boolean]($NotCompliantResults -eq $null)

if ($false -eq $IsModelCompliant -or $true -eq $IncludeAll)
{
Write-Host "Server Role: " $BPAModel
$RoleSeparator = New-Object String("=", [int] (14 + $BPAModel.Id.Length))
Write-Host $RoleSeparator
}

foreach ($BPAResult in $BPAResults)
{
WriteBPAResult -BPAResult $BPAResult -IncludeAll $IncludeAll
}

}



Function Run-BPAResult()
{
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()

$BpaModels = New-Object System.Collections.ArrayList($null)
$ImportedAssemblies = New-Object System.Collections.ArrayList($null)

if (0 -ne $error.Count)
{
Write-Host $BpaInitFailed
return
}

$iResult = Check-BpaRequirement -ModelsToRun $BpaModels -ImportedAssemblies $ImportedAssemblies

if ($BpaSuccess -ne $iResult)
{
if ($BpaModelLoadProblem -eq $iResult)
{
Unload-Modules -ImportedAssemblies $ImportedAssemblies
}

return
}

$IncludeAll = Convert-ToBoolean -sBool $IncludeCompliant

foreach ($BPAModel in $BPAModels)
{
WriteModelResults -BPAModel $BPAModel -IncludeAll $IncludeAll
}

Unload-Modules -ImportedAssemblies $ImportedAssemblies
}

Run-BPAResult</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>IncludeCompliant</Name>
<Value>$Config/IncludeCompliant$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="PA">
<Node ID="PassThrough"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Windows!Microsoft.Windows.SerializedObjectData</OutputType>
<TriggerOnly>true</TriggerOnly>
</ProbeActionModuleType>