Lenovo.ThinkServer.BMC.Discover (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
OutputTypeSystem.Discovery.Data

Member Modules:

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

Overrideable Parameters:

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

Source Code:

<DataSourceModuleType ID="Lenovo.ThinkServer.BMC.Discover" Accessibility="Public" Batching="false">
<!--Lenovo.ThinkServer.BMC.Discover no longer used-->
<Configuration>
<IncludeSchemaTypes>
<SchemaType>System!System.ExpressionEvaluatorSchema</SchemaType>
</IncludeSchemaTypes>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:int"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SyncTime" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:int"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Expression" type="ExpressionType"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation>
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="System!System.Discovery.Scheduler">
<Scheduler>
<SimpleReccuringSchedule>
<Interval>$Config/IntervalSeconds$</Interval>
<SyncTime>$Config/SyncTime$</SyncTime>
</SimpleReccuringSchedule>
<ExcludeDates/>
</Scheduler>
</DataSource>
<ProbeAction ID="PSScript" TypeID="Windows!Microsoft.Windows.PowerShellDiscoveryProbe">
<ScriptName>Lenovo.ThinkServer.BMC.ps1</ScriptName>
<ScriptBody><Script>
param($sourceId,$managedEntityId)


function Get-RegistryValue($key, $value)
{
(Get-ItemProperty $key $value).$value
}

function WriteLog($str, $RegDebug, $debugLevel)
{
if ($RegDebug -gt $debugLevel)
{
#Write-Host $str
if ([System.Diagnostics.EventLog]::SourceExists("Lenovo.EventLogSource") -eq $false)
{
[System.Diagnostics.EventLog]::CreateEventSource("Lenovo.EventLogSource", "Operations Manager")
}
if ($str -eq $null)
{
$str = "null"
}
Write-EventLog -LogName 'Operations Manager' -Source 'Lenovo.EventLogSource' -EventId 3003 -EntryType Information -Message $str
}
}

$RegDebug = Get-RegistryValue 'HKLM:\SOFTWARE\Lenovo\Lenovo SCOM MP\Debug' 'Level'
if($RegDebug -eq $null)
{
$RegDebug = '0'
}
$RegDebug = [Convert]::ToInt32($RegDebug,10)

$logstring = "RegDebug = " + $RegDebug
WriteLog $logstring $RegDebug 5

$paramStr='sourceId={0},managedEntityId={1}' -f $sourceId,$managedEntityId
WriteLog $paramStr $RegDebug 5

# multitool language support for 'Supported','Not supported','Passed','Failed'. if those strings can be got translated, using below code to support their localization.
$langPool = @{
'en-US' = @{
'Supported' = 'Supported';
'Not supported' = 'Not supported';
'Passed' = 'Passed';
'Failed' = 'Failed';
};
'zh-TW' = @{
'Supported' = '&#x652F;&#x63F4;';
'Not supported' = '&#x4E0D;&#x652F;&#x63F4;';
'Passed' = '&#x901A;&#x904E;';
'Failed' = '&#x5931;&#x6557;';
};
'de-DE' = @{
'Supported' = 'Unterst&#xFC;tzt';
'Not supported' = 'Nicht unterst&#xFC;tzt';
'Passed' = 'Bestanden';
'Failed' = 'Fehler';
};
'es-ES' = @{
'Supported' = 'Compatible';
'Not supported' = 'No soportado';
'Passed' = 'Correcto';
'Failed' = 'Error';
};
'fr-FR' = @{
'Supported' = 'Pris en charge';
'Not supported' = 'Non pris en charge';
'Passed' = 'R&#xE9;ussite';
'Failed' = 'Echec';
};
'it-IT' = @{
'Supported' = 'Supportato';
'Not supported' = 'Non supportato';
'Passed' = 'Riuscito';
'Failed' = 'Non riuscito';
};
'ja-JP' = @{
'Supported' = '&#x30B5;&#x30DD;&#x30FC;&#x30C8;&#x5BFE;&#x8C61;';
'Not supported' = '&#x30B5;&#x30DD;&#x30FC;&#x30C8;&#x5BFE;&#x8C61;&#x5916;';
'Passed' = '&#x5408;&#x683C;';
'Failed' = '&#x4E0D;&#x5408;&#x683C;';
};
'ko-KR' = @{
'Supported' = '&#xC9C0;&#xC6D0;&#xB428;';
'Not supported' = '&#xC9C0;&#xC6D0;&#xB418;&#xC9C0; &#xC54A;&#xC74C;';
'Passed' = '&#xD1B5;&#xACFC;&#xB428;';
'Failed' = '&#xC2E4;&#xD328;';
};
'pt-BR' = @{
'Supported' = 'Suportados';
'Not supported' = 'N&#xE3;o suportada';
'Passed' = 'Aprovado';
'Failed' = 'Falhou';
};
'ru-RU' = @{
'Supported' = '&#x41F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;';
'Not supported' = '&#x41D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;';
'Passed' = '&#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x43E;';
'Failed' = '&#x41E;&#x442;&#x43A;&#x430;&#x437;';
};
'zh-CN' = @{
'Supported' = '&#x53D7;&#x652F;&#x6301;';
'Not supported' = '&#x4E0D;&#x53D7;&#x652F;&#x6301;';
'Passed' = '&#x5DF2;&#x901A;&#x8FC7;';
'Failed' = '&#x5931;&#x8D25;';
};
};
$OSLanguage = ((Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2).MUILanguages)[-1]
if(!$langPool.Contains("$OSLanguage"))
{
$OSLanguage = "en-US"
}
$mri = $langPool["$OSLanguage"]
try{
$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)
WriteLog "Get BMC Info from DB" $RegDebug 5
try{
# by default, SecurityProtocol is sslv3 and tls
# add 768 (tls11) and 3072(tls12) for case if web server only supports tls11 or tls12 protocol
# not use [System.Net.SecurityProtocolType]::Tls11/Tls12 directly because it only exists in .Net 4.5 or later
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 768 -bor 3072
}catch{}
$protocol = [System.Net.ServicePointManager]::SecurityProtocol
$logstring = "SupportSecurityProtocol: " + $protocol
WriteLog $logstring $RegDebug 5

$hwmp_path = Get-RegistryValue 'HKLM:\SOFTWARE\Lenovo\Systems Management Integrations\Lenovo HW Mgmt Pack for OpsMgr' 'Path'
$dllname = $hwmp_path + '\ScomAuthentication.dll'
[void][reflection.assembly]::LoadFile($dllname)
$dll_func = New-Object ScomAuthentication.ScomAuth
$token = $dll_func.GetToken()
$service_port = Get-RegistryValue 'HKLM:\SOFTWARE\Wow6432Node\Lenovo\UnifiedService' 'Port'
$logstring = "service_port= " + $service_port
if($service_port -eq $null)
{
$service_port = Get-RegistryValue 'HKLM:\SOFTWARE\Wow6432Node\Lenovo.\UnifiedService' 'Port'
}
WriteLog $logstring $RegDebug 5
#invoke webrequest to exchange with server and get cookie info
$url = "https://localhost:" + $service_port + "/session/?operation=exchange&amp;token=" + $token
Invoke-WebRequest -Uri $url -UseBasicParsing -SessionVariable fb | ConvertFrom-Json
$csk = $fb.Cookies[0].GetCookies("https://localhost:"+ $service_port)
$fb.Headers.Add("x-csrf-token",$csk[1].Value)
$page = 0
$page_size = 10
do
{
$page = $page +1
$logstring = "Get " + $page + " page , evey page contains " + $page_size +" info"
WriteLog $logstring $RegDebug 5

add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
#invoke webrequest with cookie to get server info
$url = "https://localhost:" + $service_port + "/endpoints/?operation=show_all&amp;include_type=ThinkServer&amp;page=" + $page+ "&amp;page_size=" + $page_size
WriteLog $url $RegDebug 5
$bmcresponse = Invoke-WebRequest -Uri $url -UseBasicParsing -WebSession $fb | ConvertFrom-Json

if($bmcresponse.return_data -eq ""){
return true;
}

$bmclist = $bmcresponse.return_data.endpoints
$next_page = $bmcresponse.return_data.next_page
$bmc_count = $bmcresponse.return_data.returned_number

$count = 0
foreach ($item in $bmclist)
{
WriteLog "enter one bmc" $RegDebug 5
if($count -le $bmc_count)
{
$count++;
}
else
{
WriteLog $item $RegDebug 5
WriteLog "break" $RegDebug 5
break;
}

$status_Auth = $mri["Passed"]
$status_RAS = $mri["Not supported"]
$item_Fan = $item.Fan
$item_NumericSensor = $item.NumericSensor
$item_PhysicalMemory = $item.PhysicalMemory
$item_Processor = $item.Processor
$item_SoftwareIndentity = $item.SoftwareIndentity
$item_BMC = $item.IMM
$item_RAS = $item.RecordLog
$item_OShost = $item.oshost
$item_RAID = $item.RAID
$item_PCI = $item.Pci
$item_NIC = $item.Nic
$bmc_HostName = $item_BMC.hostname
$OS_HostName = $item_OShost.inbound_computername
$bmc_IP = $item_BMC.ipaddress



if ($bmc_HostName)
{
$bmc_HostName = $bmc_HostName.Trim()
}
if ($OS_HostName)
{
$OS_HostName = $OS_HostName.Trim()
}
if ($bmc_IP)
{
$bmc_IP = $bmc_IP.Trim()
}

$bmc_DisplayName = $item_BMC.uuid
if ($OS_HostName)
{
$bmc_DisplayName = $OS_HostName
}
elseif ($bmc_HostName)
{
$bmc_DisplayName = $bmc_HostName
}
elseif ($bmc_IP)
{
$bmc_DisplayName = $bmc_IP
}



#********************************************************************
#create BMC instance
#********************************************************************
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Lenovo.ThinkServer.BMC']$")
$instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$",$bmc_DisplayName)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/UUID$", $item_BMC.uuid)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/Enable_power_poll$", $item_BMC.enable_power_poll)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/Manufacturer$", $item_BMC.manufacturer)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/Model$", $item_BMC.model)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/PartNumber$", $item_BMC.partnumber)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/SerialNumber$", $item_BMC.serialnumber)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/NumberOfPowerTransitions$", $item_BMC.number_of_power_transitions)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/NumberOfReboots$", $item_BMC.number_of_reboots)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/BMCLastDicoveryDate$", $item_BMC.imm_last_discovery_date)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/BMCIP$", $item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/BMCDesiredCategory$",$item_RAS.desired_categories)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/BMCSupportedCategory$",$item_RAS.supported_categories)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/BMCRASSupportedStatus$",$status_RAS)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/InbandComputerName$",$item_OShost.inbound_computername)

$discoveryData.AddInstance($instance)


#********************************************************************
#create RAID instance
#********************************************************************
foreach ($item in $item_RAID)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.RAID']$")

$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/UniqueId$",$bmc_DisplayName+"_"+$item.Name+$item.ElementName)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/Model$",$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/Manufacturer$",$item.Manufacturer)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/SerialNumber$",$item.SerialNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/PartNumber$",$item.PartNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/Firmware$",$item.VersionString)

$PhyDriveDisp = ""
foreach ($phydrive in $item.PhysicalDrive)
{
$PhyDriveDisp = $PhyDriveDisp + "ElementName: " + $phydrive.ElementName
$PhyDriveDisp = $PhyDriveDisp + "; DefaultBlockSize: " + $phydrive.DefaultBlockSize
$PhyDriveDisp = $PhyDriveDisp + "; MaxMediaSize: " + $phydrive.MaxMediaSize
$PhyDriveDisp = $PhyDriveDisp + ";"
}
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/PhyDrive$",$PhyDriveDisp)

$LogDriveDisp = ""
foreach ($logdrive in $item.LogicalDrive)
{
$LogDriveDisp = $LogDriveDisp + "PoolID: " + $logdrive.PoolID
$LogDriveDisp = $LogDriveDisp + "; RAIDLevel: " + $logdrive.RAIDLevel
$LogDriveDisp = $LogDriveDisp + "; TotalManagedSpace: " + $logdrive.TotalManagedSpace
$LogDriveDisp = $LogDriveDisp + "; Logical Volume { "
foreach ($logvolume in $logdrive.LogicalVolume)
{
$LogDriveDisp = $LogDriveDisp + "VolumeID: " + $logvolume.VolumeID
$LogDriveDisp = $LogDriveDisp + "; Bootable: " + $logvolume.Bootable
$LogDriveDisp = $LogDriveDisp + "; BlockSize: " + $logvolume.BlockSize
$LogDriveDisp = $LogDriveDisp + "; BlockNum: " + $logvolume.BlockNum
$LogDriveDisp = $LogDriveDisp + "; "
}
$LogDriveDisp = $LogDriveDisp + "}; "
}
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/LogDrive$",$LogDriveDisp)

$BatteryDisp = ""
foreach ($battery in $item.Battery)
{
$BatteryDisp = $BatteryDisp + "SerialNO: " + $battery.SerialNO
$BatteryDisp = $BatteryDisp + "; Chemistry: " + $battery.Chemistry
$BatteryDisp = $BatteryDisp + "; RemainingCap: " + $battery.RemainingCap
$BatteryDisp = $BatteryDisp + "; FullChargeCap: " + $battery.FullChargeCap
$BatteryDisp = $BatteryDisp + "; DesignCap: " + $battery.DesignCap
$BatteryDisp = $BatteryDisp + "; "
}
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.RAID']/Battery$",$BatteryDisp)

$discoveryData.AddInstance($instance)
}

#********************************************************************
#create PCI instance
#********************************************************************
foreach ($item in $item_PCI)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.PCI']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/UniqueId$",$bmc_DisplayName+"_"+$item.Name+"_"+$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/Model$",$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/Manufacturer$",$item.Manufacturer)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/SerialNumber$",$item.SerialNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/PartNumber$",$item.PartNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/BusNumber$",$item.BusNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/DeviceNumber$",$item.DeviceNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/Slot$",$item.Slot)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PCI']/Firmware$",$item.VersionString)

$discoveryData.AddInstance($instance)
}

#********************************************************************
#create Ethernet and Port instance
#********************************************************************
foreach ($item in $item_NIC)
{
if($item.Type -eq 1)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.FC']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/UniqueId$",$bmc_DisplayName+"_"+$item.Name+"_"+$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Model$",$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Manufacturer$",$item.Manufacturer)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/SerialNumber$",$item.SerialNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/PartNumber$",$item.PartNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/BusNumber$",$item.BusNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/DeviceNumber$",$item.DeviceNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Slot$",$item.Slot)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Firmware$",$item.VersionString)

$PortDisp = ""
foreach ($port in $item.Port)
{
$PortDisp = $PortDisp + "Name: " + $port.Name
$PortDisp = $PortDisp + "; LinkTechnology: " + $port.LinkTechnology
$PortDisp = $PortDisp + "; PermanentAddress: " + $port.PermanentAddress
$PortDisp = $PortDisp + "; NetworkAddress: " + $port.NetworkAddress
$PortDisp = $PortDisp + "; Speed: " + $port.Speed
$PortDisp = $PortDisp + "; NIC Type: " + $port.NICType
$PortDisp = $PortDisp + "; "
}
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Port$",$portDisp)
}
elseif($item.Type -eq 2)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.IB']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/UniqueId$",$bmc_DisplayName+"_"+$item.Name+"_"+$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Model$",$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Manufacturer$",$item.Manufacturer)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/SerialNumber$",$item.SerialNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/PartNumber$",$item.PartNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/BusNumber$",$item.BusNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/DeviceNumber$",$item.DeviceNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Slot$",$item.Slot)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Firmware$",$item.VersionString)

$PortDisp = ""
foreach ($port in $item.Port)
{
$PortDisp = $PortDisp + "Name: " + $port.Name
$PortDisp = $PortDisp + "; LinkTechnology: " + $port.LinkTechnology
$PortDisp = $PortDisp + "; PermanentAddress: " + $port.PermanentAddress
$PortDisp = $PortDisp + "; NetworkAddress: " + $port.NetworkAddress
$PortDisp = $PortDisp + "; Speed: " + $port.Speed
$PortDisp = $PortDisp + "; NIC Type: " + $port.NICType
$PortDisp = $PortDisp + "; "
}
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Port$",$portDisp)
}
else
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.Ethernet']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/UniqueId$",$bmc_DisplayName+"_"+$item.Name+"_"+$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Model$",$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Manufacturer$",$item.Manufacturer)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/SerialNumber$",$item.SerialNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/PartNumber$",$item.PartNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/BusNumber$",$item.BusNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/DeviceNumber$",$item.DeviceNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Slot$",$item.Slot)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Firmware$",$item.VersionString)

$PortDisp = ""
foreach ($port in $item.Port)
{
$PortDisp = $PortDisp + "Name: " + $port.Name
$PortDisp = $PortDisp + "; LinkTechnology: " + $port.LinkTechnology
$PortDisp = $PortDisp + "; PermanentAddress: " + $port.PermanentAddress
$PortDisp = $PortDisp + "; NetworkAddress: " + $port.NetworkAddress
$PortDisp = $PortDisp + "; Speed: " + $port.Speed
$PortDisp = $PortDisp + "; NIC Type: " + $port.NICType
$PortDisp = $PortDisp + "; "
}
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NIC']/Port$",$portDisp)
}

$discoveryData.AddInstance($instance)


#********************************************************************
#create Port instance
#********************************************************************
foreach ($port in $item.Port)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.Port']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/UniqueId$",$bmc_DisplayName+"_"+$item.Name+"_"+$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/Name$",$port.Name)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/LinkTechnology$",$port.LinkTechnology)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/PermanentAddress$",$port.PermanentAddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/NetworkAddress$",$port.NetworkAddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/Speed$",$port.Speed)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Port']/NICType$",$port.NICType)
$discoveryData.AddInstance($instance)
}
}

#********************************************************************
#create Fan instance
#********************************************************************
foreach($item in $item_Fan)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.Fan']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Fan']/UniqueId$",$bmc_DisplayName+"_"+$item.Caption)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Fan']/Caption$",$item.Caption)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Fan']/Description$",$item.Description)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Fan']/EnableState$",$item.EnableState)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Fan']/HealthState$",$item.HealthState)
$discoveryData.AddInstance($instance)
}

#********************************************************************
#create NumericSensor instance
#********************************************************************
foreach($item in $item_NumericSensor)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/UniqueId$",$bmc_DisplayName+"_"+$item.ElementName)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/Caption$",$item.Caption)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/ElementName$",$item.ElementName)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/Description$",$item.Description)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/CurrentState$",$item.CurrentState)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/BaseUnits$",$item.BaseUnits)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.NumericSensor']/CurrentReading$",$item.CurrentReading)
$discoveryData.AddInstance($instance)
}

#********************************************************************
#create PhysicalMemory instance
#********************************************************************
foreach($item in $item_PhysicalMemory)
{
$NumList = $item.BankLabel -split " "
$NumTmp = [Convert]::ToInt32($NumList[1],10)
$Number = "{0:X2}" -f $NumTmp
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/UUID$",$item_BMC.uuid)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/UniqueId$",$bmc_DisplayName+"_"+$Number+"_"+$item.Description)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/Capacity$",$item.Capacity)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/Identifier$",$Number)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/BankLabel$",$item.BankLabel)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/Description$",$item.Description)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/IsSpeedInMhz$",$item.IsSpeedInMhz)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/Manufacturer$",$item.Manufacturer)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/MemoryType$",$item.MemoryType)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/Model$",$item.Model)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/PartNumber$",$item.PartNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/SerialNumber$",$item.SerialNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.PhysicalMemory']/Speed$",$item.Speed)
$discoveryData.AddInstance($instance)
}

#********************************************************************
#create Processor instance
#********************************************************************
foreach($item in $item_Processor)
{
$CPUNumber = 1
$CPUNumList = $item.Caption -split " "
if ($CPUNumList.count -gt 1)
{
$CPUNumTmp = [Convert]::ToInt32($CPUNumList[1],10)
$CPUNumber = "{0:X2}" -f $CPUNumTmp
}
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.Processor']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.BaseSubModule']/BMCIP$",$item_BMC.ipaddress)
$instance.AddProperty("$MPElement[Name='Lenovo.ThinkServer.BMC']/UUID$",$item_BMC.uuid)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/Caption$",$item.Caption)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/Identifier$",$CPUNumber)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/UniqueId$",$bmc_DisplayName+"_"+$item.Caption+$item.ElementName)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/CPUStatus$",$item.CPUStatus)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/CurrentClockSpeed$",$item.CurrentClockSpeed)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/Name$",$item.Name)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/ExternalBusClockSpeed$",$item.ExternalBusClockSpeed)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/Family$",$item.Family)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/MaxClockSpeed$",$item.MaxClockSpeed)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/NumberOfEnabledCores$",$item.NumberOfEnabledCores)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.Processor']/OtherFamilyDescription$",$item.OtherFamilyDescription)
$discoveryData.AddInstance($instance)
}

#********************************************************************
#create SoftwareIndentity instance
#********************************************************************
foreach($item in $item_SoftwareIndentity)
{
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']$")
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/UniqueId$",$bmc_DisplayName+"_"+$item.ElementName)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/Classifications$",$item.Classifications)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/ElementName$",$item.ElementName)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/IdentityInfoType$",$item.IdentityInfoType)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/IdentityInfoValue$",$item.IdentityInfoValue)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/MajorVersion$",$item.MajorVersion)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/MinorVersion$",$item.MinorVersion)
$instance.AddProperty("$MPElement[Name='Class_ThinkServer.BMC.SoftwareIndentity']/VersionString$",$item.VersionString)
$discoveryData.AddInstance($instance)
}
}
}while($next_page -eq "True")

$discoveryData
WriteLog 'BMC discovery done' $RegDebug 5
}
catch {
WriteLog 'error happened' $RegDebug 5
$msg=$error[0]
WriteLog $msg $RegDebug 5
}
finally{
$url = "https://localhost:" + $service_port + "/session/?operation=logout"
Invoke-WebRequest -Uri $url -UseBasicParsing -WebSession $fb | ConvertFrom-Json
WriteLog 'finally' $RegDebug 5
}
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>sourceId</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>managedEntityId</Name>
<Value>$Target/Id$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="PSScript">
<Node ID="DS"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>