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  }