Lenovo WinComputer - Provider di rilevamento

IBM.WinComputer.DiscoveryProvider (DataSourceModuleType)

Lenovo WinComputer - Provider di rilevamento

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource IBM.WinComputer.DiscoveryBase.Repository Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Lenovo WinComputer - Secondi intervallo provider di rilevamento
TimeoutSecondsint$Config/TimeoutSeconds$Lenovo WinComputer - Secondi timeout provider di rilevamento

Source Code:

<DataSourceModuleType ID="IBM.WinComputer.DiscoveryProvider" Accessibility="Internal">
<Configuration>
<xsd:element name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="Computer" 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="IBM.WinComputer.DiscoveryBase.Repository">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime/>
<ScriptName>IBMWinComputerDiscovery.vbs</ScriptName>
<Arguments>"$MPElement$" "$Target/Id$" "$Config/Computer$" "$Target/ManagementGroup/Name$"</Arguments>
<ScriptBody><Script>

Dim oArgs
Set oArgs = WScript.Arguments
if oArgs.Count &lt; 4 Then
Wscript.Quit -1
End If

Dim sourceID, managedEntityID, targetComputerPrincipalName, managementGroupName

sourceID = oArgs(0)
managedEntityID = oArgs(1)
targetComputerPrincipalName = oArgs(2)
managementGroupName = oArgs(3)

Call LogDebugString("sourceID:" &amp; sourceID, INFO_LEVEL_FUNCTION)
Call LogDebugString("managedEntityID:" &amp; managedEntityID, INFO_LEVEL_FUNCTION)
Call LogDebugString("targetComputerPrincipalName:" &amp; targetComputerPrincipalName, INFO_LEVEL_FUNCTION)
Call LogDebugString("managementGroupName:" &amp; managementGroupName, INFO_LEVEL_FUNCTION)

SetLocale("en-us")
EventID = 101

Call LogDebugString("IBMWinComputerDiscovery.vbs " &amp; sourceID &amp; " " &amp; _
managedEntityID &amp; " " &amp; _
targetComputerPrincipalName &amp; " " &amp; _
managementGroupName, INFO_LEVEL_DETAIL)
Dim CreateSuccess

Call IBMWinComputerDiscovery()


Sub IBMWinComputerDiscovery()

Dim oBag

'Set oAPI = SCOMCreateObject("MOM.ScriptAPI")

Call LogDebugString("Entering IBMWinComputerDiscovery (of MgmtGrp:'" &amp; managementGroupName &amp; "')", INFO_LEVEL_FUNCTION)

Set oDiscoveryData = oAPI.CreateDiscoveryData(0, sourceID, managedEntityID)

If (GetIBMWinComputerInstance() &gt; 0) Then
Call LogDebugString("Created IBM.WinComputer instance", INFO_LEVEL_DETAIL)

End If

Call oAPI.Return(oDiscoveryData)
Call LogDebugString("End of IBMWinComputerDiscovery", INFO_LEVEL_FUNCTION)

End Sub


Function GetIBMWinComputerInstance()

Call LogDebugString("Entering GetIBMWinComputerInstance()", INFO_LEVEL_FUNCTION)
Dim oObjectItem, oSystemInstanceCollection, iResult

'Create server instance
iResult = GetWMIObjectCollection(CIMV2_NAMESPACE, SYSTEM_PRODUCT_CIMV2_CLASS, oSystemInstanceCollection)
If (iResult &gt; 0) Then
GetIBMWinComputerInstance = 0
For Each oObjectItem in oSystemInstanceCollection
If (IsIBMHardware(oObjectItem) &gt; 0) Then
If (Instr(oObjectItem.Name, THINKSERVER) = 0) Then
Call CreateIBMWinComputerInstance(oObjectItem)
GetIBMWinComputerInstance = GetIBMWinComputerInstance + 1
End If
End If
Next
Call LogDebugString("Finished parse system instance", INFO_LEVEL_DETAIL)
Else
GetIBMWinComputerInstance = -1
Call LogDebugString("Can not get system collection instance", WARNING_LEVEL_DEV)
End If
Call LogDebugString("End of GetIBMWinComputerInstance()", INFO_LEVEL_FUNCTION)
End Function


Function IsIBMHardware(ByVal oObjectItem)

' Create regular expression for Lenovo with leading or tailing non-alpha numeric single character as option.
dim regEx
set regEx = New RegExp
regEx.IgnoreCase = false

Call LogDebugString("Entering IsIBMHardware", INFO_LEVEL_FUNCTION)
IsIBMHardware = -1

' For readable code, explicitly shows regular expression rule. Not useing shorthand like \w.
' Use possitive if-else logic for readability.
regEx.Pattern = "^[^a-zA-Z0-9]?[Ii][Bb][Mm][a-zA-Z0-9 ]?$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If

If IsIBMHardware = -1 Then
regEx.Pattern = "^[^a-zA-Z0-9]?[Ii][Bb][Mm] [Cc][Oo][Rr][Pp]\.?[a-zA-Z0-9]*$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If
End if

If IsIBMHardware = -1 Then
regEx.Pattern = "^[^a-zA-Z0-9]?[Ll][Ee][Nn][Oo][Vv][Oo][a-zA-Z0-9 ]?$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If
End If

If IsIBMHardware = -1 Then
regEx.Pattern = "^[^a-zA-Z0-9]?[Ll][Ee][Nn][Oo][Vv][Oo] [Cc][Oo][Rr][Pp]\.?[a-zA-Z0-9]*$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If
End if

If IsIBMHardware = -1 Then
regEx.Pattern = "^[^a-zA-Z0-9]?[Ll][Nn][Vv][Oo][a-zA-Z0-9 ]?$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If
End If

If IsIBMHardware = -1 Then
regEx.Pattern = "^[^a-zA-Z0-9]?[Ll][Vv][Oo][a-zA-Z0-9 ]?$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If
End If

If IsIBMHardware = -1 Then
regEx.Pattern = "^[^a-zA-Z0-9]?[Ll][Ee][Nn][Oo][a-zA-Z0-9 ]?$"
If (regEx.Test(oObjectItem.Vendor)) Then
IsIBMHardware = 1
End If
End If

If IsIBMHardware = -1 Then
Call LogDebugString("Not from IBM. It's the hardware of " + oObjectItem.Vendor, WARNING_LEVEL_DEV)
End If

End Function


Sub CreateIBMWinComputerInstance(ByVal oObjectItem)

Call LogDebugString("Entering CreateIBMWinComputerInstance", INFO_LEVEL_FUNCTION)
Dim oIBMWinComputerInstance

'Using oObjectItem.Name would work for cases such as "Lenovo System x3650 -[797971A]-" Valiant, 7979,7971 by linlin
'Use machine type instead; now done inside UpdateIBMWinComputerProperty().
'[obsolete] oPlatformCategory = GetPlatformCategory(oObjectItem.Name)
Set oIBMWinComputerInstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='IBM.WinComputer']$")

Call UpdateIBMWinComputerProperty(oIBMWinComputerInstance, oObjectItem)
Call oDiscoveryData.AddInstance(oIBMWinComputerInstance)
Call LogDebugString("End of CreateIBMWinComputerInstance()", INFO_LEVEL_FUNCTION)
End Sub


Sub UpdateIBMWinComputerProperty(ByRef oIBMWinComputerInstance, ByVal oSystemProductInstance)

Dim sSrvUpdt, sSuRegPath, sSuTmp, iSuTbl

' Director Core Services Services Update
dim ibmDirCoreSvcsSuKeyTable
ibmDirCoreSvcsSuKeyTable = Array( _
Array("\IBM\Director\DirectorPE\Patches\dir5.20.03su1-Core", "su1" ),_
Array("\IBM\Director\DirectorPE\Patches\dir5.20.03su2-Core", "su2" ),_
Array("\IBM\Director\DirectorPE\Patches\dir5.20.03su3-Core", "su3" ),_
Array("\IBM\Director\DirectorPE\Patches\dir5.20.03su4-Core", "su4" ),_
Array("\IBM\Director\DirectorPE\Patches\dir5.20.03su5-Core", "su5" ))
const IBM_DIR_SUKEY = 0
const IBM_DIR_SU_NAME = 1

' Create regular expression for Service Update checking
dim regEx
set regEx = New RegExp
regEx.Pattern = "su *[1-9]"
regEx.IgnoreCase = True

Call LogDebugString("Entering UpdateIBMWinComputerProperty", INFO_LEVEL_FUNCTION)
Dim oPropertyValue, iResult

Dim oSystemInstance, oSystemCollection, oDAInstance, oDACollection, sAgentVer, sModelNameValue, sServeRAIDController, sMegaRAIDController,sIntegratedRAIDController, oSerialNumber, oSystemUUID

sModelNameValue = oSystemProductInstance.Name
sServeRAIDController = "None"
sMegaRAIDController = "None"
sIntegratedRAIDController = "None"

Dim iBeginPos, iEndPos, sTemp, sMachType, sModelNumber, sName, searchChar
searchChar = "["
iBeginPos = 0
iEndPos = 0
sMachType = UNKNOWN
sModelNumber = UNKNOWN
sName = UNKNOWN

iBeginPos = Instr(sModelNameValue, searchChar)
If iBeginPos &lt;&gt; 0 Then
'new BIOS definition following the "&lt;product-famly&gt; -[&lt;m/t&gt;&lt;model#&gt;]-" format
iBeginPos = iBeginPos + 1
searchChar = "]"
iEndPos = Instr(sModelNameValue, searchChar)
If iEndPos &lt;&gt;0 Then
sTemp = Mid(sModelNameValue, iBeginPos, iEndPos-iBeginPos)
If (Len(sTemp) &gt; 4) Then
sMachType = Mid(sTemp, 1, 4)
sModelNumber = Mid(sTemp, 4+1, Len(sTemp)-4)
ElseIf (Len(sTemp) = 4) Then
If IsNumeric(sTemp) And InStr(sTemp,".")=0 Then
sMachType = Mid(sTemp, 1, 4)
End If
End If
'remove the " -[xxxxxxx]-" characters and keep the "Lenovo System x3755" e.g. as the server's family
sName = Mid(sModelNameValue, 1, iBeginPos-3)
Else
sTemp = Mid(sModelNameValue, iBeginPos)
If (Len(sTemp) &gt; 4) Then
sMachType = Mid(sTemp, 1, 4)
sModelNumber = Mid(sTemp, 4+1, Len(sTemp)-4)
ElseIf (Len(sTemp) = 4) Then
If IsNumeric(sTemp) And InStr(sTemp,".")=0 Then
sMachType = Mid(sTemp, 1, 4)
End If
End If
sName = Mid(sModelNameValue, 1, iBeginPos-3)
End If
ElseIf Instr(sModelNameValue, THINKSERVER) &lt;&gt; 0 Then
sMachType = sModelNameValue
sName = sModelNameValue
Else
'old BIOS definition following the "&lt;m/t&gt;&lt;model#&gt;" format
If (Len(sModelNameValue) = 7) Then
sMachType = Mid(sModelNameValue, 1, 4)
sModelNumber = Mid(sModelNameValue, 4+1, Len(sModelNameValue)-4)
'use the &lt;m/t&gt;&lt;model#&gt; as the server's family
sName = sModelNameValue
End If
End If

sAgentVer = empty
Dim oReg
Set oReg = GetObject("winmgmts://localhost/root/default:StdRegProv")
If (oReg is nothing) Then
sAgentVer = "Failed to access registry"
Else
const SW_KEY = "SOFTWARE"
const SW_KEY32on64 = "SOFTWARE\Wow6432Node"
const IBM_DIR_CORE_SVCS_SWKEY = "\IBM\IBM Director Core Services\CurrentVersion"
Call oReg.GetStringValue(HKEY_LOCAL_MACHINE, SW_KEY &amp; IBM_DIR_CORE_SVCS_SWKEY, "Version", sAgentVer)
If (IsEmpty(sAgentVer)) Or IsNull(sAgentVer) Then
Call oReg.GetStringValue(HKEY_LOCAL_MACHINE, SW_KEY32on64 &amp; IBM_DIR_CORE_SVCS_SWKEY, "Version", sAgentVer)
End If
'For director platform agent 6.1.1 and later
Dim couldBeDenali
If (IsEmpty(sAgentVer)) Or IsNull(sAgentVer) Then
couldBeDenali = 1
Call oReg.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\ibm\director\platform\currentversion", "Version", sAgentVer)
'[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\IBM\Director\Platform\CurrentVersion]
If (IsEmpty(sAgentVer)) Or IsNull(sAgentVer) Then
Call oReg.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Wow6432Node\ibm\director\platform\currentversion", "Version", sAgentVer)
End If
Else
couldBeDenali = 0
' Check Dir 5.x lestest service update.
sSrvUpdt = ""
for iSuTbl = 0 To UBound(ibmDirCoreSvcsSuKeyTable)
sSuTmp = ""
sSuRegPath = SW_KEY &amp; ibmDirCoreSvcsSuKeyTable(iSuTbl)(IBM_DIR_SUKEY)
Call oReg.GetStringValue( HKEY_LOCAL_MACHINE, sSuRegPath, "peFix", sSuTmp)
if ((isEmpty(sSuTmp)) Or isNull(sSuTmp)) then
sSuRegPath = SW_KEY32on64 &amp; ibmDirCoreSvcsSuKeyTable(iSuTbl)(IBM_DIR_SUKEY)
Call oReg.GetStringValue( HKEY_LOCAL_MACHINE, sSuRegPath, "peFix", sSuTmp)
if ((not(isEmpty(sSuTmp))) and (not(isNull(sSuTmp)))) then
sSrvUpdt = ibmDirCoreSvcsSuKeyTable(iSuTbl)(IBM_DIR_SU_NAME)
end if
else
sSrvUpdt = ibmDirCoreSvcsSuKeyTable(iSuTbl)(IBM_DIR_SU_NAME)
end if
next
End If
If (IsEmpty(sAgentVer)) Or IsNull(sAgentVer) Then
sAgentVer = "Not-installed"
Else
' SU data can be :
' case 1: in the seperate registry
' case 2: in the version number string
if ( not(isEmpty(sSrvUpdt))) then

if ( inStr(sAgentVer, "su") or inStr(sAgentVer, "SU") ) then

' Make replacement. ( Case 1 )
sAgentVer = regEx.Replace(sAgentVer, sSrvUpdt)

else
' Append SU. ( Case 2 )
sAgentVer = sAgentVer &amp; " " &amp; sSrvUpdt
end if
end if
If (couldBeDenali &gt; 0) Then
sAgentVer = sAgentVer + " (Director Platform Agent)"
Else
sAgentVer = sAgentVer + " (Director Core Services)"
End If
End If
End If
' Getting agent's version from its own namespace may not work if the agent itself is not functional,
' so, look it up from the registry, instead. It will be less problematic.
' iResult = GetWMIObjectCollection(IBMSD_NAMESPACE, DA_IBMSD_CLASS, oDACollection)
' If (iResult &gt; 0) Then
' For Each oDAInstance in oDACollection
' sAgentVer = oDAInstance.Version ' ??? Will need check specifically for "Director Core Services"
' Next
' Else
' Call LogDebugString("Can not update DA properties", INFO_LEVEL)
' End If


Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", targetComputerPrincipalName)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", targetComputerPrincipalName)

'Update SerialNumber and SystemUUID
oSerialNumber = UNKNOWN
oSystemUUID = UNKNOWN

ON ERROR RESUME NEXT ' Skip errors below, some of which may not always exist
oSerialNumber = oSystemProductInstance.IdentifyingNumber
oSystemUUID = oSystemProductInstance.UUID
ON ERROR GOTO 0 ' Break on errors here on.
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/SystemUUID$", oSystemUUID)

'Update MTAndSN
oPropertyValue = CStr(sMachType) + "-" + CStr(oSerialNumber)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/MTAndSN$", oPropertyValue)

'Update ModelNumber
oPropertyValue = sModelNumber
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/ModelNumber$", oPropertyValue)

'Update PlatformCategory
' -- Now use machine type to classify; for cases, such as "Lenovo System x3650 -[797971A]-" Valiant, 7979,7971 by linlin
oPropertyValue = GetPlatformCategory(sMachType)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PlatformCategory$", oPropertyValue)

'Update ProductFamily
'For parameters passing defect, use double quotation to resolve this problem
oPropertyValue = sName
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/ProductFamily$", oPropertyValue)

'Update PlatformAgentInfo
oPropertyValue = sAgentVer ' sAgentVer is already cooked above
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PlatformAgentInfo$", oPropertyValue)

'Update BMCDetected
iResult = BMCPresented()
If iResult = 3 Then
oPropertyValue = "SMBIOS"
ElseIf iResult = 1 Then
oPropertyValue = "ACPI"
ElseIf iResult = 2 Then
oPropertyValue = "SMBIOS"
Else
oPropertyValue = "None"
End If
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/BMCDetected$", oPropertyValue)

'Update RSAIIDetected
If RSAPresented() &gt; 0 Then
oPropertyValue = "Yes"
Else
oPropertyValue = "None"
End If
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/RSAIIDetected$", oPropertyValue)

'Update RAIDControllers
oPropertyValue = "None"
If ServeRAIDPresented(sServeRAIDController) &gt; 0 Then
oPropertyValue = sServeRAIDController
End If
If MegaRAIDPresented(sMegaRAIDController) &gt; 0 Then
If Instr(oPropertyValue, "None") &lt;&gt; 0 Then
oPropertyValue = sMegaRAIDController
Else
oPropertyValue = oPropertyValue + "," + sMegaRAIDController
End If
End If
If IntegratedRAIDPresented(sIntegratedRAIDController) &gt; 0 Then
If Instr(oPropertyValue, "None") &lt;&gt; 0 Then
oPropertyValue = sIntegratedRAIDController
Else
oPropertyValue = oPropertyValue + "," + sIntegratedRAIDController
End If
End If
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/RAIDControllers$", oPropertyValue)
'Update Licensed property
Dim sFeatureId, nRt, level,toke
sFeatureId = ""
level = "None"
toke = ""




oPropertyValue = GetIMMIPV4Address()

Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/IMMIPV4Address$", oPropertyValue)

' PXB080239 Harvest Threshold/Capping properties.
'get current values of power threshold and power capping
'ref objects to get those values from CIM Provider classes
Dim oPowerMaxValue, oPowerMinValue, oPowerCapValue, oCappingEnabledValue, oCappingCapableValue, szPowerManagementProvider
Dim oPowerThresholdWarningValue, oPowerThresholdCriticalValue
Dim oPcapCollection, oPcapInstance
Dim oPthresholdCollection, oPthresholdInstance

' Read Lenovo Power CIM Provider version
' [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\IBM\Systems Management Integrations\ Lenovo Power CIM Provider]
' "PackageVersion"="3.1.3"
' [HKEY_LOCAL_MACHINE\SOFTWARE\IBM\Systems Management Integrations\ Lenovo Power CIM Provider]
' "PackageVersion"="3.1.3"

const IBM_PWR_MGMNT_PROVIDER_NOT_INSTALL = "Not installed"
' oReg is set by Director version checking.
If (oReg is nothing) Then
szPowerManagementProvider = IBM_PWR_MGMNT_PROVIDER_NOT_INSTALL
Call LogDebugString("Failed to access Windows Registry for Power CIM Provider Package Version.", WARNING_LEVEL_DEV)
Else
const IBM_SMI_PWR_CIM_SWKEY = "\IBM\Systems Management Integrations\IBM Power CIM Provider"

' Read Power CIM Provider version from WOW registry path. If Power CIM provider version is not availalbe,
' try to read from non-WOW registry path.
szPowerManagementProvider = Null
Call oReg.GetStringValue(HKEY_LOCAL_MACHINE, SW_KEY32on64 &amp; IBM_SMI_PWR_CIM_SWKEY, "PackageVersion", szPowerManagementProvider)
If (IsEmpty(szPowerManagementProvider)) Or IsNull(szPowerManagementProvider) Then
Call oReg.GetStringValue(HKEY_LOCAL_MACHINE, SW_KEY &amp; IBM_SMI_PWR_CIM_SWKEY, "PackageVersion", szPowerManagementProvider)
If (IsEmpty(szPowerManagementProvider)) Or IsNull(szPowerManagementProvider) Then
szPowerManagementProvider = IBM_PWR_MGMNT_PROVIDER_NOT_INSTALL
End If
End If
End If

' Post debug level log to Ops Mgr Windows event log.
If inStr(szPowerManagementProvider, IBM_PWR_MGMNT_PROVIDER_NOT_INSTALL) Then
Call LogDebugString("Power CIM Provider Package Version is not in Windows Registry.", INFO_LEVEL)
Else
Call LogDebugString("Power CIM Provider Package Version: " &amp; szPowerManagementProvider, INFO_LEVEL)
End if

' Set 0 to properties for all Power CIM Provider
oPowerThresholdWarningValue = 0
oPowerThresholdCriticalValue = 0
oPowerMaxValue = 0
oPowerMinValue = 0
oPowerCapValue = 0
oCappingCapableValue = "False"
oCappingEnabledValue = "False"

If ( 1 &lt;&gt; inStr(szPowerManagementProvider, IBM_PWR_MGMNT_PROVIDER_NOT_INSTALL) ) Then

Call LogDebugString("Getting power threshold and capping information from CIM Provider", INFO_LEVEL_FUNCTION)

'get threshold information
iResult = GetWMIObjectCollection(IBMSD_NAMESPACE, "IBMPSG_AveragePowerUsageSensor", oPthresholdCollection)
If (iResult &gt; 0) Then

' Only one set of property in the collection.
For Each oPthresholdInstance in oPthresholdCollection
oPowerThresholdWarningValue = oPthresholdInstance.LowerThresholdNonCritical
oPowerThresholdCriticalValue = oPthresholdInstance.LowerThresholdCritical
Next

Call LogDebugString("PowerThresholdWarning=" &amp; oPowerThresholdWarningValue &amp; _
" and PowerThresholdCritical=" &amp; oPowerThresholdCriticalValue, INFO_LEVEL_FUNCTION)
else
Call LogDebugString("Failed to get the object of IBMPSG_AveragePowerUsageSensor.", INFO_LEVEL_FUNCTION)
End If

'get power capping information
iResult = GetWMIObjectCollection(IBMSD_NAMESPACE, "IBMPSG_PowerCappingInformation", oPcapCollection)
If (iResult &gt; 0) Then

' Only one set of property in the collection.
For Each oPcapInstance in oPcapCollection
oPowerMaxValue = oPcapInstance.Pmax
oPowerMinValue = oPcapInstance.Pmin
oPowerCapValue = oPcapInstance.Pcap
oCappingCapableValue = oPcapInstance.CappingCapable
oCappingEnabledValue = oPcapInstance.CappingEnabled
Next

Call LogDebugString("PowerMax = " &amp; oPowerMaxValue &amp; ", PowerMin = " &amp; oPowerMinValue &amp; ", PowerCap = " &amp; oPowerCapValue &amp; _
", CappingEnabled = " &amp; oCappingEnabledValue &amp; ", CappingCapable = " &amp; oCappingCapableValue, INFO_LEVEL_FUNCTION)
else
Call LogDebugString("Failed to get the object of IBMPSG_PowerCappingInformation.", INFO_LEVEL_FUNCTION)
End If
End If

Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PowerManagementProvider$", szPowerManagementProvider)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PowerThresholdWarning$", oPowerThresholdWarningValue)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PowerThresholdCritical$", oPowerThresholdCriticalValue)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PowerMax$", oPowerMaxValue)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PowerMin$", oPowerMinValue)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/PowerCap$", oPowerCapValue)


'Getting FirmwareType
Dim FirmwareType
Call GetBIOSType(FirmwareType, sMachType)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/FirmwareType$", FirmwareType)

'Add by Ling Mo 2012/05/21
'If the firmware type is not UEFI, then program will set the cappable and enable to false ,regardless its default value.
If Not(FirmwareType = "UEFI") Then
oCappingCapableValue = "False"
oCappingEnabledValue = "False"
End If

Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/CappingEnabled$", oCappingEnabledValue)
Call oIBMWinComputerInstance.AddProperty("$MPElement[Name='IBM.WinComputer']/CappingCapable$", oCappingCapableValue)

Call LogDebugString("End of UpdateIBMWinComputerProperty()", INFO_LEVEL_FUNCTION)

End Sub


Function GetPlatformCategory(ByVal sMachineType)

Call LogDebugString("Entering GetPlatformCategory", INFO_LEVEL_FUNCTION)
GetPlatformCategory = UNCLASSIFIED_PLATFORM
Dim I
If Instr(sMachineType, THINKSERVER)&lt;&gt;0 Then
GetPlatformCategory = THINKSERVER
Else
For I = 0 To UBound(HardwareCapacityTable)
If InStr(sMachineType, HardwareCapacityTable(I)(MACHINE_TYPE)) &lt;&gt; 0 Then
GetPlatformCategory = HardwareCapacityTable(I)(PLATFORM_CATEGORY)
Exit Function
End If
Next
End If

End Function

Sub GetBIOSType(ByRef sBIOSType, ByVal sMachineType)
sBIOSType = UNKNOWN
Dim I
For I = 0 To UBound(HardwareCapacityTable)
If InStr(sMachineType, HardwareCapacityTable(I)(MACHINE_TYPE)) &lt;&gt; 0 Then
sBIOSType = HardwareCapacityTable(I)(BIOS_TYPE)
Exit Sub
End If
Next

End Sub

Function VersionCompare(byval a, byval b)
Dim Arr1,Arr2, length,i
On Error Resume Next
Arr1 = Split(a,".", -1,1)
Arr2 = Split(b,".",-1,1)
length = UBound(Arr2)
if UBound(Arr1)&gt; UBound(Arr2) then
length = UBound(Arr1)
ReDim Preserve Arr2(length)
end If

For i = 0 To length
If Arr1(i)="" Then
Arr1(i) ="0"
End If
If Arr2(i)="" Then
Arr2(i) ="0"
End If
If CInt(Arr1(i))&gt; CInt(Arr2(i)) Then
VersionCompare =1
Exit Function
ElseIf CInt(Arr1(i))&lt; CInt(Arr2(i)) Then
VersionCompare = -1
Exit Function
End If
Next
VersionCompare = 0

End Function
</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>