Our computer naming convention includes a portion of the model number to make it easier to identify trends and those with old, or new, assets. Coming from a Dell shop where we did something similar, I was disappointed to learn that Lenovo machines didn’t populate the Model
details the same way. So instead of seeing something like ThinkPad W541, we were seeing something very cryptic: 20EFCTO1WW
Get your Decoder Ring
Thinking something was up with the built-in scripts or logic I ran the below on a Lenovo machine which confirmed it was what it was:
wmic path win32_computersystem get model
Model
20EFCTO1WW
For a while we kept a matrix of sorts that we’d feed into our CustomSettings.ini to ensure machines were named correctly. We expected this pain as models were phased out and new models came in, but it was also very frustrating as the details would change mid-stream for the same model. This led us to studying the Lenovo Product Specifications Reference or PSREF.
Not being keen on this, I learned somewhere (unsure of the actual source) that Lenovo stashes the bits we were after in Win32_ComputerSystemProduct
under Version
wmic path win32_computersystemproduct get version
Version
ThinkPad W541
Once confirmed across a few machines, I went right to work.
UserExit Script: GetAbbrModel.vbs
This is a modified version of the script we use in production but the result is the same: It gets the human-readable format of the model, trims the parts we don’t want and returns an abbreviated version of the model. So a ThinkPad W541 ends up being returned to MDT/SCCM as W54. You can modify to suit, like creating a new property/variable called RealModel
and assigning the script output to that or overwrite the existing Model
property via the script itself.
The script works on 99% of the machines in our environment but it does occasionally fail:
- some unexpected data is in there: sometimes it’s really bizzare or mirrors Model in Win32_ComputerSystem or Name in Win32_ComputerSystemProduct.
- most of the time it’s because the field is blank/null/empty and we typically see this on machines that were serviced, specifically a board replacement, and tech didn’t run the utility to set the bits in the BIOS. Accidents happen.
- it’s running on very hardware that should have been retired 🙂
Good Providence to you as you adjust it to suit your needs!
' //***************************************************************************
' //
' // Solution:Get Model Abbreviation for Microsoft Deployment
' // File: jgp_GetAbbrModel.vbs
' //
' // Purpose: Gets & sets the correct model abbreviation for use in computer name and other custom configurations
' //
' // ***** End Header *****
' //***************************************************************************
'//----------------------------------------------------------------------------
'//
'// Global constant and variable declarations
'//
'//----------------------------------------------------------------------------
Option Explicit
'//----------------------------------------------------------------------------
'// End declarations
'//----------------------------------------------------------------------------
'//----------------------------------------------------------------------------
'// Main routine
'//----------------------------------------------------------------------------
Function UserExit(sType, sWhen, sDetail, bSkip)
UserExit = Success
End Function
Function GetAbbrModel()
on error goto 0
Dim sMake : sMake = oEnvironment.Item("Make")
Dim sModel : sModel = oEnvironment.Item("Model")
Dim sAbbrModel : sAbbrModel = "UNK"
Select Case UCase(sMake)
Case UCase("Dell")
If InStr(1,sModel,"OptiPlex ",1) > 0 Then
sAbbrModel = Left(Replace(sModel,"ptiPlex ","",1,-1,1),3)
elseif InStr(1,sModel,"Latitude ",1) > 0 Then
sAbbrModel = Left(Replace(sModel,"Latitude ","",1,-1,1),3)
elseif InStr(1,sModel,"XPS",1) > 0 Then
sAbbrModel = Left(Replace(sModel,"PS","",1,-1,1),3)
end if
Case UCase("Lenovo")
Dim oCSP
For Each oCSP in GetObject("winmgmts:").ExecQuery("SELECT Version,Name FROM Win32_ComputerSystemProduct")
Dim sLenovoModel : sLenovoModel = oCSP.Version
Dim sLenovoProductType : sLenovoProductType = oCSP.Name
exit for
Next
If InStr(1,sLenovoModel,"ThinkCentre ",1) > 0 Then
sAbbrModel = Left(Replace(sLenovoModel,"ThinkCentre ","",1,-1,1),3)
elseif InStr(1,sLenovoModel,"ThinkStation ",1) > 0 Then
sAbbrModel = Left(Replace(sLenovoModel,"ThinkStation ","",1,-1,1),3)
elseif InStr(1,sLenovoModel,"ThinkPad ",1) > 0 Then
if Instr(1,sLenovoModel,"Carbon",1) > 0 Then
If InStr(1,sLenovoModel,"Carbon 4th",1) > 0 Then
sAbbrModel = Left(Replace(Replace(Replace(sLenovoModel,"ThinkPad ","",1,-1,1),"arbon 4th","")," ",""),3)
elseif InStr(1,sLenovoModel,"Carbon 3rd",1) > 0 Then
sAbbrModel = Left(Replace(Replace(Replace(sLenovoModel,"ThinkPad ","",1,-1,1),"arbon 3rd","")," ",""),3)
elseif InStr(1,sLenovoModel,"Carbon 2nd",1) > 0 Then
sAbbrModel = Left(Replace(Replace(Replace(sLenovoModel,"ThinkPad ","",1,-1,1),"arbon 2nd","")," ",""),3)
elseif InStr(1,sLenovoModel,"Carbon",1) > 0 Then
sAbbrModel = Left(Replace(Replace(Replace(sLenovoModel,"ThinkPad ","",1,-1,1),"arbon","")," ",""),3)
end if
else
sAbbrModel = Left(Replace(sLenovoModel,"ThinkPad ","",1,-1,1),3)
end if
else
' Alternatively you could build & maintain (yuck) a table of product types
Select Case UCase(Left(sLenovoProductType,4))
Case UCase("5032")
sAbbrModel = "M81"
case UCase("20EF")
sAbbrModel = "W54"
End Select
end if
Case UCase("innotek GmbH")
sAbbrModel = UCase(Left(sMake,1) & Mid(sMake,8,1) & Right(sMake,1))
Case UCase("VMware, Inc.")
sAbbrModel = UCase(Left(sMake,3))
Case UCase("Microsoft Corporation")
sAbbrModel = "HPV"
End Select
GetAbbrModel = sAbbrModel
End Function
Share this golden nugget:
Like this:
Like Loading...