go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/smbios/win.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package smbios 5 6 import ( 7 "encoding/json" 8 "io" 9 10 "go.mondoo.com/cnquery/providers/os/connection/shared" 11 "go.mondoo.com/cnquery/providers/os/resources/powershell" 12 ) 13 14 const smbiosWindowsScript = ` 15 $bios = Get-WmiObject -class Win32_Bios 16 $baseboard = Get-WmiObject Win32_BaseBoard 17 $chassis = Get-WmiObject Win32_SystemEnclosure 18 $sys = Get-WmiObject Win32_ComputerSystem 19 $sysProduct = Get-WmiObject Win32_ComputerSystemProduct 20 21 $smbios = New-Object -TypeName PSObject 22 $smbios | Add-Member -MemberType NoteProperty -Value $bios -Name Bios 23 $smbios | Add-Member -MemberType NoteProperty -Value $baseboard -Name BaseBoard 24 $smbios | Add-Member -MemberType NoteProperty -Value $chassis -Name Chassis 25 $smbios | Add-Member -MemberType NoteProperty -Value $sys -Name System 26 $smbios | Add-Member -MemberType NoteProperty -Value $sysProduct -Name SystemProduct 27 28 $smbios | ConvertTo-Json 29 ` 30 31 type smbiosWindows struct { 32 Bios smbiosWinBios `json:"Bios"` 33 BaseBoard smbiosBaseBoard `json:"BaseBoard"` 34 Chassis smbiosChassis `json:"Chassis"` 35 System smbiosSystem `json:"System"` 36 SystemProduct smbiosSystemProduct `json:"SystemProduct"` 37 } 38 39 type smbiosWinBios struct { 40 Manufacturer string `json:"Manufacturer"` 41 SMBIOSBIOSVersion string `json:"SMBIOSBIOSVersion"` 42 ReleaseDate string `json:"ReleaseDate"` 43 SerialNumber string `json:"SerialNumber"` 44 } 45 46 type smbiosBaseBoard struct { 47 Manufacturer string `json:"Manufacturer"` 48 Product string `json:"Product"` 49 Version string `json:"Version"` 50 SerialNumber string `json:"SerialNumber"` 51 } 52 53 type smbiosChassis struct { 54 Manufacturer string `json:"Manufacturer"` 55 Model *string `json:"Model"` 56 57 ChassisTypes []uint `json:"ChassisTypes"` 58 59 Version string `json:"Version"` 60 SerialNumber string `json:"SerialNumber"` 61 SMBIOSAssetTag string `json:"SMBIOSAssetTag"` 62 } 63 64 type smbiosSystem struct{} 65 66 type smbiosSystemProduct struct { 67 Vendor string `json:"Vendor"` 68 Name string `json:"Name"` 69 Version string `json:"Version"` 70 SKUNumber string `json:"SKUNumber"` 71 UUID string `json:"UUID"` 72 IdentifyingNumber string `json:"IdentifyingNumber"` 73 } 74 75 // see https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/sample-powershell-script-to-query-smbios-locally 76 // https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/smbios 77 type WindowsSmbiosManager struct { 78 provider shared.Connection 79 } 80 81 func (s *WindowsSmbiosManager) Name() string { 82 return "Windows Smbios Manager" 83 } 84 85 func (s *WindowsSmbiosManager) Info() (*SmBiosInfo, error) { 86 c, err := s.provider.RunCommand(powershell.Encode(smbiosWindowsScript)) 87 if err != nil { 88 return nil, err 89 } 90 91 winBios, err := ParseWindowsSmbiosInfo(c.Stdout) 92 if err != nil { 93 return nil, err 94 } 95 96 smInfo := SmBiosInfo{ 97 BIOS: BiosInfo{ 98 Vendor: winBios.Bios.Manufacturer, 99 Version: winBios.Bios.SMBIOSBIOSVersion, 100 ReleaseDate: winBios.Bios.ReleaseDate, 101 }, 102 SysInfo: SysInfo{ 103 Vendor: winBios.SystemProduct.Vendor, 104 Model: winBios.SystemProduct.Name, 105 Version: winBios.SystemProduct.Version, 106 SKU: winBios.SystemProduct.SKUNumber, 107 UUID: winBios.SystemProduct.UUID, 108 }, 109 BaseBoardInfo: BaseBoardInfo{ 110 Vendor: winBios.BaseBoard.Manufacturer, 111 Model: winBios.BaseBoard.Product, 112 SerialNumber: winBios.BaseBoard.SerialNumber, 113 Version: winBios.BaseBoard.Version, 114 }, 115 ChassisInfo: ChassisInfo{ 116 Vendor: winBios.Chassis.Manufacturer, 117 Model: toString(winBios.Chassis.Model), 118 Version: winBios.Chassis.Version, 119 SerialNumber: winBios.Chassis.SerialNumber, 120 }, 121 } 122 123 return &smInfo, nil 124 } 125 126 func toString(i *string) string { 127 if i == nil { 128 return "" 129 } 130 return *i 131 } 132 133 func ParseWindowsSmbiosInfo(r io.Reader) (smbiosWindows, error) { 134 var smbios smbiosWindows 135 data, err := io.ReadAll(r) 136 if err != nil { 137 return smbios, err 138 } 139 140 err = json.Unmarshal(data, &smbios) 141 if err != nil { 142 return smbios, err 143 } 144 145 return smbios, nil 146 }