Lenovo ThinkServer WinComputer Discovery Provider

ThinkServer.WinComputer.DiscoveryProvider (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
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:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Lenovo ThinkServer WinComputer Discovery Provider Interval Seconds
TimeoutSecondsint$Config/TimeoutSeconds$Lenovo ThinkServer WinComputer Discovery Provider Timeout Seconds

Source Code:

<DataSourceModuleType ID="ThinkServer.WinComputer.DiscoveryProvider" Accessibility="Internal">
<Configuration>
<xsd:element name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="Computer" type="xsd:string"/>
<xsd:element name="SyncTime" type="xsd:string"/>
<xsd:element name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" ParameterType="int" Selector="$Config/IntervalSeconds$"/>
<OverrideableParameter ID="TimeoutSeconds" ParameterType="int" Selector="$Config/TimeoutSeconds$"/>
</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.WinComputer.ps1</ScriptName>
<ScriptBody><Script>
param($sourceId,$managedEntityId,$computerName)

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")
}
Write-EventLog -LogName 'Operations Manager' -Source 'Lenovo.EventLogSource' -EventId 115 -EntryType Information -Message $str
}
}

function IsLenovoHardware($hardware)
{
$result = $False

if ($hardware.Vendor -imatch "Lenovo")
{
$result = $True
}
elseif ($hardware.Vendor -imatch "Lnvo")
{
$result = $True
}
elseif ($hardware.Vendor -imatch "Lvo")
{
$result = $True
}
elseif ($hardware.Vendor -imatch "Leno")
{
$result = $True
}
else
{
$result = $False
}

return $result
}

function IsPureBMCServer($ProductName)
{
$result = $False
if ($ProductName -imatch "ThinkServer")
{
$result = $True
}
elseif ($ProductName -imatch "SR635")
{
$result = $True
}
elseif ($ProductName -imatch "SR655")
{
$result = $True
}
return $result
}

function get-BmcMediaChannelLan ($computerName) {
process {

[byte]$mediaTypeLan = 0x04
[byte[]]$dataContainer = @(0)

$obj = Get-WmiObject -Namespace root\WMI -Class MICROSOFT_IPMI -ComputerName $computerName
if($obj -is [ARRAY]){
$oIPMI = $obj[0]
}
else{
$oIPMI = $obj
}
$oInputParam = $oIPMI.GetMethodParameters("RequestResponse")
$oInputParam.Command = 0x42
$oInputParam.Lun = 0x00
$oInputParam.NetworkFunction = 0x06
$oInputParam.ResponderAddress = 0x20

[Int16]$iLanForLoopVar = 1
[byte]$ChannelMax = 0x0b
for(; $iLanForLoopVar -le $ChannelMax; $iLanForLoopVar++) {
$dataContainer = @($iLanForLoopVar)
$oInputParam.RequestData = $dataContainer
$oInputParam.RequestDataSize = $dataContainer.length
$oReturnVal = $oIPMI.PSBase.InvokeMethod("RequestResponse", $oInputParam, (New-Object System.Management.InvokeMethodOptions))

if ($oReturnVal.ResponseData[2] -eq $mediaTypeLan) {
return $iLanForLoopVar
}
}

return -1
}
}

function get-BmcIp ($computerName) {
process {
[byte]$channel = get-BmcMediaChannelLan($computerName)
if ($channel -lt 0) {
return ""
}

[byte]$parameterIp = 3
[byte]$parameterSelector = $parameterIp

$obj=Get-WmiObject -Namespace root\WMI -Class MICROSOFT_IPMI -ComputerName $computerName
if($obj -is [ARRAY]){
$oIPMI = $obj[0]
}
else{
$oIPMI = $obj
}
$oInputParam = $oIPMI.GetMethodParameters("RequestResponse")
$oInputParam.Command = 0x02
$oInputParam.Lun = 0x00
$oInputParam.NetworkFunction = 0x0c
$oInputParam.ResponderAddress = 0x20
[byte[]]$dataContainer = @($channel, $parameterSelector, 0, 0)
$oInputParam.RequestData = $dataContainer
$oInputParam.RequestDataSize = $dataContainer.length

$oReturnVal = $oIPMI.PSBase.InvokeMethod("RequestResponse", $oInputParam, (New-Object System.Management.InvokeMethodOptions))
return "{0}.{1}.{2}.{3}" -f $oReturnVal.ResponseData[2], $oReturnVal.ResponseData[3], $oReturnVal.ResponseData[4], $oReturnVal.ResponseData[5]

}
}

$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},computerName={2}' -f $sourceId,$managedEntityId,$computerName
WriteLog $paramStr $RegDebug 5

$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)
$winInstances = Get-WmiObject -Namespace root\cimv2 -Class Win32_ComputerSystemProduct
foreach ($item in $winInstances)
{
$isLenovo = IsLenovoHardware($item)
if ($isLenovo)
{
if (IsPureBMCServer($item.Name))
{
$logstring = "It's a pure BMC Server."
WriteLog $logstring $RegDebug 5
$instance = $discoveryData.CreateClassInstance("$MPElement[Name='ThinkServer.WinComputer']$")
$sModelName = $item.Name
$sMachType = $sModelName -replace "ThinkServer"
$sMachType = $sMachType -replace " ",""

$instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $computerName)
$instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
$serialNumber = $item.IdentifyingNumber
$systemUUID = $item.UUID
$systemUUID = $systemUUID -replace "-"
$sMTandSN = $sMachType + "-" + $serialNumber
$instance.AddProperty("$MPElement[Name='ThinkServer.WinComputer']/SystemUUID$", $systemUUID)
$instance.AddProperty("$MPElement[Name='ThinkServer.WinComputer']/MTAndSN$", $sMTandSN)
$instance.AddProperty("$MPElement[Name='ThinkServer.WinComputer']/PlatformCategory$", "ThinkServer")
$instance.AddProperty("$MPElement[Name='ThinkServer.WinComputer']/ProductFamily$", $sMachType)
$instance.AddProperty("$MPElement[Name='ThinkServer.WinComputer']/Licensed$", "Not required")

$computerName = "localhost"
$bmcIP = get-BmcIp($computerName)
$logstring = "Ip is " + $bmcIP
WriteLog $logstring $RegDebug 5
$instance.AddProperty("$MPElement[Name='ThinkServer.WinComputer']/BMCIPAddress$", $bmcIP)
$discoveryData.AddInstance($instance)
}
}
}
$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/Computer$</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>