Identify Client Form Factor

From WPKG | Open Source Software Deployment and Distribution
Jump to: navigation, search

The following package identifies the client form factor and writes an entry into the Registry which can subsequently be read by other application install packages.

It relies on a vbs script which queries WMI to identify the hardware chassis type then writes the returned value to wherever you specify in the Registry.
I have added it to the Registry section which specifies Env Variables so you have the choice to query the variable %CHASSISTYPE% or directly query the registry key in a WPKG check condition.

You can use logical conditions to determine if an application install package targets a specific platform (laptop or desktop for example). Remember that logical conditions are counter-intuitive, if you want to install an application on a specific platform you check for what your target platform isn't.

For example:

	<check	type="logical" condition="or">
		<check type="uninstall" condition="exists" path="SonicWALL SSL-VPN NetExtender" />
		<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Desktop"/>
		<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Other"/>
		<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Unknown"/>
	</check>


Alternatively you can use an if statement in your install command to only install if the appropriate chassis type is detected, e.g.

<install cmd='%COMSPEC% /c if "%CHASSISTYPE%"=="Laptop" msiexec /qn /i ...

Of course be sure to modify the xml and vbs below to your needs.

Check Chassis Type

<?xml version="1.0" encoding="UTF-8"?>

<packages>
  <package
    id='chassistype'
    name='ChassisType'
    revision='1'
    priority='999'
    execute='once'
    reboot='false'>
 
	<check	type="logical" condition="or">
	<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Desktop"/>
	<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Other"/>
	<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Unknown"/>
	<check type="registry" condition="equals" path="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\CHASSISTYPE" value="Laptop"/>

	</check>
 
    <install cmd='cscript //B "%SOFTWARE%\system\identify_chassis_simple.vbs"' />
		 
    <upgrade cmd='cscript //B "%SOFTWARE%\system\identify_chassis_simple.vbs"' />
 
    <remove cmd='REG DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\" /v CHASSISTYPE /f' />

 
  </package>
</packages>


Now I have two different versions of the vbs script, the identify_chassis_simple.vbs script writes "desktop" or "laptop" for a number of different chassis type return codes. The identify_chassis.vbs script at the bottom has a lot more chassis types if you need that granularity in your application installs (I don't).

Identify Chassis Simple

strComputer = "."
const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "System\CurrentControlSet\Control\Session Manager\Environment"
strValueName = "ChassisType"
strChassisValue = ""

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
    & strComputer & "\root\default:StdRegProv")
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colChassis = objWMIService.ExecQuery _
    ("Select * from Win32_SystemEnclosure")
For Each objChassis in colChassis
    For  Each strChassisType in objChassis.ChassisTypes
        Select Case strChassisType
            Case 1
                strChassisValue = "Other"
            Case 2
                strChassisValue = "Unknown"
            Case 3
                strChassisValue = "Desktop"
            Case 4
                strChassisValue = "Desktop"
            Case 5
                strChassisValue = "Desktop"
            Case 6
                strChassisValue = "Desktop"
            Case 7
                strChassisValue = "Desktop"
            Case 8
                strChassisValue = "Laptop"
            Case 9
                strChassisValue = "Laptop"
            Case 10
                strChassisValue = "Laptop"
            Case 11
                strChassisValue = "Other"
            Case 12
                strChassisValue = "Laptop"
            Case 13
                strChassisValue = "Desktop"
            Case 14
                strChassisValue = "Laptop"
            Case 15
                strChassisValue = "Desktop"
            Case 16
                strChassisValue = "Desktop"
            Case 17
                strChassisValue = "Desktop"
            Case 18
                strChassisValue = "Other"
            Case 19
                strChassisValue = "Other"
            Case 20
                strChassisValue = "Other"
            Case 21
                strChassisValue = "Other"
            Case 22
                strChassisValue = "Other"
            Case 23
                strChassisValue = "Other"
            Case 24
                strChassisValue = "Desktop"
            Case Else
                strChassisValue = "Unknown"
            End Select
    Next
Next

RegResult = objReg.SetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strChassisValue)


Identify Chassis Full

strComputer = "."
const HKEY_LOCAL_MACHINE = &H80000002
strKeyPath = "System\CurrentControlSet\Control\Session Manager\Environment"
strValueName = "ChassisType"
strChassisValue = ""

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
    & strComputer & "\root\default:StdRegProv")
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colChassis = objWMIService.ExecQuery _
    ("Select * from Win32_SystemEnclosure")
For Each objChassis in colChassis
    For  Each strChassisType in objChassis.ChassisTypes
        Select Case strChassisType
            Case 1
                strChassisValue = "Other"
            Case 2
                strChassisValue = "Unknown"
            Case 3
                strChassisValue = "Desktop"
            Case 4
                strChassisValue = "Low Profile Desktop"
            Case 5
                strChassisValue = "Pizza Box"
            Case 6
                strChassisValue = "Mini Tower"
            Case 7
                strChassisValue = "Tower"
            Case 8
                strChassisValue = "Portable"
            Case 9
                strChassisValue = "Laptop"
            Case 10
                strChassisValue = "Notebook"
            Case 11
                strChassisValue = "Handheld"
            Case 12
                strChassisValue = "Docking Station"
            Case 13
                strChassisValue = "All-in-One"
            Case 14
                strChassisValue = "Sub-Notebook"
            Case 15
                strChassisValue = "Space Saving"
            Case 16
                strChassisValue = "Lunch Box"
            Case 17
                strChassisValue = "Main System Chassis"
            Case 18
                strChassisValue = "Expansion Chassis"
            Case 19
                strChassisValue = "Sub-Chassis"
            Case 20
                strChassisValue = "Bus Expansion Chassis"
            Case 21
                strChassisValue = "Peripheral Chassis"
            Case 22
                strChassisValue = "Storage Chassis"
            Case 23
                strChassisValue = "Rack Mount Chassis"
            Case 24
                strChassisValue = "Sealed-Case PC"
            Case Else
                strChassisValue = "Unknown"
            End Select
    Next
Next

RegResult = objReg.SetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strChassisValue)