Private/Get-IslDeviceFact.ps1
|
function Get-IslDeviceFact { <# .SYNOPSIS Reads the device facts the Win32 base requirements compare against. .DESCRIPTION Architecture (x86, x64, arm64 from the OS architecture), the Windows build number, free space on the system drive in MB, physical memory in MB, logical processor count and the CPU's rated speed in MHz. One place to mock in tests, since every value is machine-specific. .EXAMPLE Get-IslDeviceFact The facts of this device as an IntuneScriptLab.DeviceFact object. #> [CmdletBinding()] [OutputType('IntuneScriptLab.DeviceFact')] param() $osArchitecture = "$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)" $architecture = switch ($osArchitecture) { 'Arm64' { 'arm64' } 'X64' { 'x64' } default { 'x86' } } $systemDrive = if ($env:SystemDrive) { $env:SystemDrive } else { 'C:' } $drive = [System.IO.DriveInfo]::new($systemDrive) $computer = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction SilentlyContinue $processor = Get-CimInstance -ClassName Win32_Processor -ErrorAction SilentlyContinue | Select-Object -First 1 $build = [Environment]::OSVersion.Version.Build $versionKey = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' $currentBuild = Get-ItemProperty -Path $versionKey -Name CurrentBuildNumber -ErrorAction SilentlyContinue if ($currentBuild -and "$($currentBuild.CurrentBuildNumber)" -match '^\d+$') { $build = [int]$currentBuild.CurrentBuildNumber } [pscustomobject]@{ PSTypeName = 'IntuneScriptLab.DeviceFact' Architecture = $architecture Build = $build FreeDiskSpaceMB = [long][math]::Floor($drive.AvailableFreeSpace / 1MB) MemoryMB = if ($computer) { [long][math]::Floor($computer.TotalPhysicalMemory / 1MB) } else { 0 } Processors = [Environment]::ProcessorCount CpuSpeedMHz = if ($processor) { [int]$processor.MaxClockSpeed } else { 0 } } } |