Microsoft Windows Server 2016 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.PowerShellTriggerOnlyProbe 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="PA" TypeID="Windows!Microsoft.Windows.PowerShellTriggerOnlyProbe">
<ScriptName>Microsoft.Windows.Server.10.0.Monitoring.BPA.ShowBPAresults.Script.ps1</ScriptName>
<ScriptBody><Script>
Param($IncludeCompliant)

function SafeImportModule
{
param ($ModuleName = $ModuleName)

$LOCAL_SYSTEM_SRC = "SafetyImportModule"
$LOCAL_SYSTEM_ID = 104
$NestedModulesMarker = "NestedModules*"
$AssemblyMarker = "dll"
$LoadedAssemblies = @()

$Module = Get-Module -ListAvailable | Where-Object {$_.Name -eq $ModuleName}
if ($Module -ne $null)
{
$NestedModulesString = cat $Module.Path | Where-object {$_ -like $NestedModulesMarker}
$AssemblyCollection = $NestedModulesString.Split((",","'"),[System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object {$_.Contains($AssemblyMarker)}

foreach ($AssemblyName in $AssemblyCollection)
{
$AssemblyFullPath = Join-Path $Module.ModuleBase $AssemblyName
try
{
$Assembly = [System.Reflection.Assembly]::LoadFile($AssemblyFullPath)
Import-Module -Assembly $Assembly
$LoadedAssemblies += $Assembly.Location
}
catch [System.IO.FileLoadException]
{
$momAPI.LogScriptEvent($LOCAL_SYSTEM_SRC, $LOCAL_SYSTEM_ID, $EVENT_TYPE_ERROR, $SCRIPT_NAME + "Could not load {0}" -f $AssemblyFullPath)
exit
}
catch [System.IO.FileNotFoundException]
{
$momAPI.LogScriptEvent($LOCAL_SYSTEM_SRC, $LOCAL_SYSTEM_ID, $EVENT_TYPE_ERROR, $SCRIPT_NAME + "File {0} Not Found" -f $AssemblyFullPath)
exit
}

}
}
return $LoadedAssemblies
}

function RemoveImportedAssembly
{
param ($AssemblyName = $AssemblyName)
$Modules = Get-Module
foreach($Module in $Modules)
{
if ($Module.Path -eq $AssemblyName)
{
Remove-Module $Module
}
}
}

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 ([Microsoft.BestPractices.CoreInterface.Model]$BPAModel, [boolean]$IncludeAll)

$BPAResults = Get-BPAResult $BPAModel.Id
if ($BPAResults -ne $null)
{
$NotCompliantResults = $BPAResults | Where-Object {$_.Problem -ne $null}

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

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

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

}

}


$BPAModuleName = "BestPractices"
$IncludeAll = [boolean]::Parse($IncludeCompliant)

[Array] $ImportedAssemblies = SafeImportModule($BPAModuleName)

$BPAModels = Get-BPAModel

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

foreach ($ImportedAssembly in $ImportedAssemblies)
{
RemoveImportedAssembly($ImportedAssembly)
}
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>IncludeCompliant</Name>
<Value>$Config/IncludeCompliant$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="PA"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Windows!Microsoft.Windows.SerializedObjectData</OutputType>
<TriggerOnly>true</TriggerOnly>
</ProbeActionModuleType>