LW.Microsoft.Windows.Server.BaseOS.Discovery.DataSource (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsSystem.PrivilegedMonitoringAccount
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
Scheduler DataSource System.Discovery.Scheduler Default
PowerShellDiscoveryProbe ProbeAction Microsoft.Windows.PowerShellDiscoveryProbe Default

Overrideable Parameters:

IDParameterTypeSelector
IntervalSecondsint$Config/IntervalSeconds$
TimeoutSecondsint$Config/TimeoutSeconds$

Source Code:

<DataSourceModuleType ID="LW.Microsoft.Windows.Server.BaseOS.Discovery.DataSource" Accessibility="Public" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:unsignedInt"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="ComputerPrincipalName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:unsignedInt"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler">
<Scheduler>
<SimpleReccuringSchedule>
<Interval Unit="Seconds">$Config/IntervalSeconds$</Interval>
</SimpleReccuringSchedule>
<ExcludeDates/>
</Scheduler>
</DataSource>
<ProbeAction ID="PowerShellDiscoveryProbe" TypeID="Windows!Microsoft.Windows.PowerShellDiscoveryProbe">
<ScriptName>"Lightweight generic server OS discovery script"</ScriptName>
<ScriptBody><Script>
param ([String] $sourceID, [String] $managedEntityID, [String] $computerName)
#Copyright (c) Microsoft Corporation. All rights reserved.
#*************************************************************************
#Author - Arpit Mittal
#ScriptName: "ServerOSVersions.ps1"$
#Purpose: This script will discover all OS versions from 2008R2 to 2016.
#*************************************************************************

$versionTable = @{}
$classMPElementTable = @{}
$classCategoryTable = @{}

#Get-WindowsFeature Discoveries
#2016
$versionTable.Add("10.0","LW.Microsoft.BaseOS.2016")
$classMPElementTable.Add("LW.Microsoft.BaseOS.2016","`$MPElement[Name='LW.Microsoft.BaseOS.2016']$")
$classCategoryTable.Add("LW.Microsoft.BaseOS.2016","Core OS 2016")

#Core OS
$classMPElementTable.Add("LW.Microsoft.Core.OS","`$MPElement[Name='LW.Microsoft.Core.OS']$")
$classCategoryTable.Add("LW.Microsoft.Core.OS","Core OS")

#2012R2
$versionTable.Add("6.3","LW.Microsoft.BaseOS.2012R2")
$classMPElementTable.Add("LW.Microsoft.BaseOS.2012R2","`$MPElement[Name='LW.Microsoft.BaseOS.2012R2']$")
$classCategoryTable.Add("LW.Microsoft.BaseOS.2012R2","Base OS 2012R2")

#2012
$versionTable.Add("6.2","LW.Microsoft.BaseOS.2012")
$classMPElementTable.Add("LW.Microsoft.BaseOS.2012","`$MPElement[Name='LW.Microsoft.BaseOS.2012']$")
$classCategoryTable.Add("LW.Microsoft.BaseOS.2012","Base OS 2012")

#2008R2
$versionTable.Add("6.1","LW.Microsoft.BaseOS.2008R2")
$classMPElementTable.Add("LW.Microsoft.BaseOS.2008R2","`$MPElement[Name='LW.Microsoft.BaseOS.2008R2']$")
$classCategoryTable.Add("LW.Microsoft.BaseOS.2008R2","Base OS 2008R2")

function LogWrite
{
Param([string]$logString)
$script:logMessage += $logString
}

$GuestOS = ''
$wmiOS = (Get-WmiObject -Class Win32_OperatingSystem).caption
if (-not ([string]::IsNullOrEmpty($wmiOS)))
{
$GuestOS = $wmiOS
}

function createInstances
{
Param($className, $computerName, $classMPElementTable, $classCategoryTable, $discoveryData)

LogWrite "`nCreating class instance for class $className"

$instance = $discoveryData.CreateClassInstance($classMPElementTable.Item($className))
$instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
$instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $computerName)

if($className -eq 'LW.Microsoft.Core.OS')
{
$instance.AddProperty("$MPElement[Name='LW.Base.Microsoft.Windows.ComputerRole.Category']/CategoryName$", $classCategoryTable.Item($className))
$instance.AddProperty("$MPElement[Name='LW.Base.Microsoft.Windows.ComputerRole.Category']/GuestOS$", $GuestOS)
}
else
{
$instance.AddProperty("$MPElement[Name='LW.Base.Microsoft.Windows.Server.BaseOS.Category']/CategoryName$", $classCategoryTable.Item($className))
$instance.AddProperty("$MPElement[Name='LW.Base.Microsoft.Windows.Server.BaseOS.Category']/GuestOS$", $GuestOS)
}

$discoveryData.AddInstance($instance)
$discoveryData
}

#scriptStartTime will help in calculating script run time
$scriptStartTime = Get-Date
$script:logMessage = ''

LogWrite "`nServerOSVersions::Starting ServerOSVersions script."

if(($SourceId -eq $null) -or ($ManagedEntityId -eq $null) -or ($computerName -eq $null))
{
LogWrite "`nServerOSVersions::SourceId, ManagedEntityId or Computer name is null. Exiting script."
Exit -1
}

#Create discovery property bag only once as we can't return multiple property bags
$api = new-object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)

$a = gwmi -Class win32_operatingsystem

if($a.Version -match '10.0')
{
$className = $versionTable.Item('10.0')
$discoveryData = createInstances $className $computerName $classMPElementTable $classCategoryTable $discoveryData
}
elseif($a.Version -match '6.3')
{
$className = $versionTable.Item('6.3')
$discoveryData = createInstances $className $computerName $classMPElementTable $classCategoryTable $discoveryData
}
elseif($a.Version -match '6.2')
{
$className = $versionTable.Item('6.2')
$discoveryData = createInstances $className $computerName $classMPElementTable $classCategoryTable $discoveryData
}
elseif($a.Version -match '6.1')
{
$className = $versionTable.Item('6.1')
$discoveryData = createInstances $className $computerName $classMPElementTable $classCategoryTable $discoveryData
}

if(($a.Version -match '6.1') -or ($a.Version -match '6.2') -or ($a.Version -match '6.3'))
{
$className = "LW.Microsoft.Core.OS"
$discoveryData = createInstances $className $computerName $classMPElementTable $classCategoryTable $discoveryData
}

$scriptEndTime = Get-Date
$totalScriptRunTime = ($scriptEndTime - $scriptStartTime) | select-object TotalSeconds
$totalScriptRunTime = $totalScriptRunTime.TotalSeconds
LogWrite "`n Total time taken to run the script $totalScriptRunTime"

#Log an event after running the script
$api.LogScriptEvent("ServerOSVersions.ps1", 5000, 0, $script:logMessage)

#Return discovery property bag
$discoveryData</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>sourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>managedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>computerName</Name>
<Value>$Config/ComputerPrincipalName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>false</StrictErrorHandling>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="PowerShellDiscoveryProbe">
<Node ID="Scheduler"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>