26 December 2019

WMI Query for Dell Manufacture and First Power On Date

A recent project of mine was to obtain the Dell manufacture and ownership dates from all systems for depreciation and lifecycle purposes. This information is not readily available in SCCM and on the local machines. Luckily, the newest version of Dell Command | Configure now includes the manufacture date and first power on date. The first power on date, as referenced in DCC, is also the Ownership Date in the BIOS, as shown below.


To make this easy, I decided to write a PowerShell script that would utilize cctk.exe to query the BIOS for this information and then populate it in the WMI since the info never changes. The main reason I decided on WMI is that the Get-WMIObject has the -Computer allowing the information to be queried remotely. This information never changes, so it does not need to be populated in Configuration Manager on a reoccurring basis. I have another PowerShell script that I use with Orchestrator to generate an Excel spreadsheet report that contains this information from each system. The PowerShell script below was deployed out to all machines and then put in the build task sequence.

NOTE: In order for this script to work, the latest version of Dell Command | Configure will need to be installed. The version I have deployed out is 4.2.1. 

Also, thanks to Adam Bertram for the Invoke-Process used in this script.


You can download the script from my GitHub site located here

 <#  
      .SYNOPSIS  
           Dell Manufacture Information  
        
      .DESCRIPTION  
           This script is deployed out to machines so the manufacture and ownership dates are populated as a WMI entry. This allows for easy query of this information for depreciation and lifecycle purposes.  
        
      .NOTES  
           ===========================================================================  
           Created with:     SAPIEN Technologies, Inc., PowerShell Studio 2017 v5.4.142  
           Created on:       12/23/2019 8:31 AM  
           Created by:       Mick Pletcher  
           Filename:         SystemInformationWMI.ps1  
           ===========================================================================  
 #>  
   
 function Invoke-Process {  
      [CmdletBinding(SupportsShouldProcess)]  
      param  
      (  
           [Parameter(Mandatory)]  
           [ValidateNotNullOrEmpty()]  
           [string]$FilePath,  
           [Parameter()]  
           [ValidateNotNullOrEmpty()]  
           [string]$ArgumentList  
      )  
        
      $ErrorActionPreference = 'Stop'  
        
      try {  
           $stdOutTempFile = "$env:TEMP\$((New-Guid).Guid)"  
           $stdErrTempFile = "$env:TEMP\$((New-Guid).Guid)"  
             
           $startProcessParams = @{  
                FilePath                     = $FilePath  
                ArgumentList                = $ArgumentList  
                RedirectStandardError      = $stdErrTempFile  
                RedirectStandardOutput  = $stdOutTempFile  
                Wait                          = $true;  
                PassThru                     = $true;  
                NoNewWindow                  = $true;  
           }  
           if ($PSCmdlet.ShouldProcess("Process [$($FilePath)]", "Run with args: [$($ArgumentList)]")) {  
                $cmd = Start-Process @startProcessParams  
                $cmdOutput = Get-Content -Path $stdOutTempFile -Raw  
                $cmdError = Get-Content -Path $stdErrTempFile -Raw  
                if ($cmd.ExitCode -ne 0) {  
                     if ($cmdError) {  
                          throw $cmdError.Trim()  
                     }  
                     if ($cmdOutput) {  
                          throw $cmdOutput.Trim()  
                     }  
                } else {  
                     if ([string]::IsNullOrEmpty($cmdOutput) -eq $false) {  
                          Write-Output -InputObject $cmdOutput  
                     }  
                }  
           }  
      } catch {  
           $PSCmdlet.ThrowTerminatingError($_)  
      } finally {  
           Remove-Item -Path $stdOutTempFile, $stdErrTempFile -Force -ErrorAction Ignore  
      }  
 }  
   
 [string]$MFGDate = (((Invoke-Process -FilePath (${env:ProgramFiles(x86)} + '\Dell\Command Configure\X86_64\cctk.exe') -ArgumentList '--mfgdate').split('=')[1]).Trim())  
 [datetime]$MFGDate = [datetime]::ParseExact($MFGDate, 'yyyymmdd', $null)  
 [string]$FirstPowerOnDate = (((Invoke-Process -FilePath (${env:ProgramFiles(x86)} + '\Dell\Command Configure\X86_64\cctk.exe') -ArgumentList '--firstpowerondate').split('=')[1]).Trim())  
 [datetime]$FirstPowerOnDate = [datetime]::ParseExact($FirstPowerOnDate, 'yyyymmdd', $null)  
 [string]$SVCTag = (Invoke-Process -FilePath (${env:ProgramFiles(x86)} + '\Dell\Command Configure\X86_64\cctk.exe') -ArgumentList '--svctag').split('=')[1]  
 $newClass = New-Object System.Management.ManagementClass ('root\cimv2', [String]::Empty, $null)  
 $newClass["__CLASS"] = 'Dell_System_Info'  
 $newClass.Qualifiers.Add("Static", $true)  
 $newClass.Properties.Add("ServiceTag", [System.Management.CimType]::String, $false)  
 $newClass.Properties["ServiceTag"].Qualifiers.Add("Key", $true)  
 $newClass.Properties.Add("ManufactureDate", [System.Management.CimType]::DateTime, $false)  
 $newClass.Properties["ManufactureDate"].Qualifiers.Add("Key", $true)  
 $newClass.Properties.Add("FirstPowerOnDate", [System.Management.CimType]::DateTime, $false)  
 $newClass.Properties["FirstPowerOnDate"].Qualifiers.Add("Key", $true)  
 $newClass.Properties.Add("SystemName", [System.Management.CimType]::String, $false)  
 $newClass.Properties["SystemName"].Qualifiers.Add("Key", $true)  
 $newClass.Put()  
 $Properties = @{  
      ServiceTag = $SVCTag.Trim();`  
      ManufactureDate = $MFGDate;`  
      FirstPowerOnDate = $FirstPowerOnDate;`  
      SystemName = $env:COMPUTERNAME  
 }  
 $Properties  
 Get-CimInstance -ClassName 'Dell_System_Info' -Namespace 'root\cimv2' | Remove-CimInstance  
 New-CimInstance -ClassName 'Dell_System_Info' -Namespace 'root\cimv2' -Property $Properties  
   

Related Posts:

  • Last Server Reboot ReportingRecently, we needed a report of the last boot time of all servers. I wrote this PowerShell script that queries AD for a list of all windows servers and then does a WMI query on each server for the LastBootUpTime. It then calc… Read More
  • Automating Dell TPM ConfigurationOver the years, we have manually configured the TPM before imaging a system as part of our build process. Dell has since given the ability to automate the entire process after giving the option to automate clearing the TPM. T… Read More
  • Configure SQL Server Firewall Ports with PowerShell I recently had to rebuild the Configuration Manager server. As I was running the prerequisite tool, it showed it could not communicate with the SQL server that is separate from the Configuration Manager Server. The issu… Read More
  • Identify Machines a User is Logged Into using Carbon BlackIf you have Carbon Black in your environment, you can use it to identify which machines a user account is logged into. Carbon Black collects a vast amount of data on machines and reports it to the cloud database. The followin… Read More
  • Bitlocker Recovery Password AD Backup and CleanupThis PowerShell script not only backs up the Bitlocker recovery password to AD but also cleans out previous backups made that do not match the current password associated with the machine. The script retrieves the local … Read More

2 comments:

  1. Do you have a way to change one of the BIOS settings that show in this report without having to go into the BIOS on each laptop?

    ReplyDelete
  2. Hello Mick,

    At first, thx for the script!
    Running the script on different DELL machines (Optiplex, Precision, Latitude). All came back with a couple of wrong results:

    "Manufacture Date" is AFTER "date of first power on"

    FirstPowerOnDate : 14.01.2018 00:06:00
    ManufactureDate : 17.01.2018 00:05:00

    "Manufacture Date" is wrong: must be 17.05.2018 and NOT 17.01.2018!

    Can you pls fix the script?

    Thx and best regards

    Peter

    ReplyDelete