diff --git a/Lenovo-Asset-Tag-Writer-env-template.txt b/Lenovo-Asset-Tag-Writer-env-template.txt index e5c4b62..0718731 100644 --- a/Lenovo-Asset-Tag-Writer-env-template.txt +++ b/Lenovo-Asset-Tag-Writer-env-template.txt @@ -2,12 +2,10 @@ #e.g. https://snipe-it.contoso.com/api/v1/ SNIPEIT_URL= - #API Token generated from Snipe-IT -- instructions here: #https://snipe-it.readme.io/reference/generating-api-tokens SNIPEIT_TOKEN= - #The download location for AMIDEWINx64 and WINAIA -- should be a zip file. AMIDEWINx64_URL= WINAIA_URL= \ No newline at end of file diff --git a/Lenovo-Asset-Tag-Writer.ps1 b/Lenovo-Asset-Tag-Writer.ps1 index fe625d9..8402faf 100644 --- a/Lenovo-Asset-Tag-Writer.ps1 +++ b/Lenovo-Asset-Tag-Writer.ps1 @@ -5,10 +5,9 @@ Created by: Alexis Lazcano =========================================================================== .DESCRIPTION - Lenovo computers contain a BIOS property to store a device's asset tag. - Unfortunately, this field is not writeable without the use of a from Lenovo. - This script helps automate the process of obtaining the asset tag from Snipe-IT and - writing it to the BIOS for later retrieval through WMI. + Lenovo computers contain a BIOS property to store a device's asset tag accessible via WMI/CIM. + Get-CIMInstance -ClassName Win32_SystemEnclosure -NameSpace root\CIMV2 | Format-Table -Property SMBIOSAssetTag + Unfortunately, this field is not writeable without the use of a tool from Lenovo. This script helps automate the process of obtaining the asset tag from Snipe-IT and writing it to the BIOS for later retrieval through WMI. #> #Check if running as Administrator... @@ -20,23 +19,7 @@ if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]: exit } -#Load variables from .env file in to env:\ drive. -function Load-EnvFile -{ - #Exit with an error if there's not .env file in the current working directory. - if (!(Test-Path -Path .env)) { Write-Error ".env file does not exist in $MyInvocation.MyCommand.Path. Please double check it exists and is named properly."; Exit 404 } - Get-Content .env | foreach { - $variableKey, $variableValue = $_.split('=') - if ([string]::IsNullOrWhiteSpace($variableKey) -or $variableKey.Contains('#')) - { - continue - } - Set-Content env:\$variableKey $variableValue - } - -} - -Load-EnvFile +$VerbosePreference = 'SilentlyContinue' $ScriptRoot = "$env:PROGRAMFILES\SCMG\Scripts" $ScriptLogs = "$ScriptRoot\Logs" @@ -45,18 +28,36 @@ $ScriptTemp = "$ScriptRoot\Temp" if (!(Test-Path -Path $ScriptLogs)) { New-Item -Path $ScriptLogs -ItemType Directory -Force | Out-Null } if (!(Test-Path -Path $ScriptTemp)) { New-Item -Path $ScriptTemp -ItemType Directory -Force | Out-Null } +$ComputerSystemProduct = Get-CIMInstance -ClassName Win32_ComputerSystemProduct -NameSpace root\CIMV2 +$CurrentSMBIOSAssetTag = Get-CIMInstance -ClassName Win32_SystemEnclosure -NameSpace root\CIMV2 | Format-Table -Property SMBIOSAssetTag -function Get-AssetNumber +#Load variables from .env file in to env:\ drive. +function Load-EnvFile +{ + [CmdletBinding()] + Param () + #Exit with an error if there's not .env file in the current working directory. + if (!(Test-Path -Path .env)) { Write-Error ".env file does not exist in $((Get-Location).Path)\ `nPlease double check it exists and is named properly."; Exit 404 } + $EnvFile = Get-Content .env | where {!([string]::IsNullOrWhiteSpace($_)) -and ($_ -notlike "#*")} + foreach ($Line in $EnvFile) + { + $variableKey, $variableValue = $Line.split('=') + Write-Verbose "$variableKey will be set to $variableValue" + Set-Content env:\$variableKey $variableValue + } +} + +Load-EnvFile + +function Get-SnipeAssetNumber { param ( [Parameter(Mandatory = $true)] [String]$Serial ) - $baseURI = $env:SNIPEIT_URL $hardwareURI = $baseURI + "hardware" - $headers = @{ } $headers.Add("accept", "application/json") $headers.Add("Authorization", "Bearer $env:SNIPEIT_TOKEN") @@ -70,40 +71,62 @@ function Get-AssetNumber } } -Write-Host "Downloading AMIDEWINx64" -Invoke-WebRequest -Uri "$env:AMIDEWIN_URL" -OutFile "$ScriptTemp\AMIDEWINx64.zip" -try +function Get-BiosTool { - Expand-Archive -Path "$ScriptTemp\AMIDEWINx64.zip" -DestinationPath "$ScriptTemp" -Force -} -catch -{ - Write-Host "An error occurred:" - Write-Host $_ -} -finally -{ - Remove-Item "$ScriptTemp\AMIDEWINx64.zip" -Force -} + [CmdletBinding(ConfirmImpact = 'Medium')] + param + ( + [Parameter(Mandatory = $true, + Position = 1)] + [String]$DeviceType + ) + + switch ($DeviceType) { + Desktop { + Invoke-WebRequest -Uri "$env:AMIDEWINx64_URL" -OutFile "$ScriptTemp\AMIDEWINx64.zip" + try + { + Expand-Archive -Path "$ScriptTemp\AMIDEWINx64.zip" -DestinationPath "$ScriptTemp" -Force + } + catch + { + Write-Host "An error occurred:" + Write-Host $_ + } + finally + { + Remove-Item "$ScriptTemp\AMIDEWINx64.zip" -Force + } + } + Laptop { + # + } + default { + exit + } + } -$ComputerSystemProduct = Get-CIMInstance -ClassName Win32_ComputerSystemProduct -NameSpace root\CIMV2 -$CurrentSMBIOSAssetTag = Get-CIMInstance -ClassName Win32_SystemEnclosure -NameSpace root\CIMV2 | Format-Table -Property SMBIOSAssetTag +} If ($ComputerSystemProduct.Vendor -like "Lenovo") { + Get-BiosTool -DeviceType Desktop + $PSComputerInfo = @{ } $PSComputerInfo.Add("serial", $($ComputerSystemProduct.IdentifyingNumber)) $PSComputerInfo.Add("model_number", $($ComputerSystemProduct.Name)) $PSComputerInfo.Add("model_name", $($ComputerSystemProduct.Version)) - $SnipeAssetTag = Get-AssetNumber -Serial $PSComputerInfo.serial + $SnipeAssetTag = Get-SnipeAssetNumber -Serial $PSComputerInfo.serial Set-Location $ScriptTemp .\AMIDEWINx64\AMIDEWINx64.exe /CA "$SnipeAssetTag" Remove-Item $ScriptTemp\* -Recurse + + Set-Location -Path $(Split-Path $MyInvocation.MyCommand.Path -Parent) } else { @@ -113,8 +136,8 @@ else # SIG # Begin signature block # MIIvYQYJKoZIhvcNAQcCoIIvUjCCL04CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDw+YpSrIJcWYVE -# J2s8uvZ7sUTuDqxcPjAaSCMlFWDTHqCCKGYwggQyMIIDGqADAgECAgEBMA0GCSqG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBjs+JMqPrrbeXe +# t6xlvmH3J2Sz9PE5IwjBOfPiZ1qFfqCCKGYwggQyMIIDGqADAgECAgEBMA0GCSqG # SIb3DQEBBQUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNo # ZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1p # dGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2VydmljZXMwHhcNMDQwMTAx @@ -333,35 +356,35 @@ else # MYIGUTCCBk0CAQEwaDBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBM # aW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0Eg # UjM2AhAtmKdfiMvdO1IQbTd6fBa6MA0GCWCGSAFlAwQCAQUAoEwwGQYJKoZIhvcN -# AQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEILvjUGuwDeF+SJPc7jo7 -# aZWzCfaPf8kaf9ObGFMjJU4TMA0GCSqGSIb3DQEBAQUABIICAKavR/fgitIBACCs -# IoEGyR83mzm/o7FdhhMkL8cWL/7/i0mgtfJJHhyHGvMDfT8pXQa4tRj558BlCJD2 -# zjdNY9ga5jYAOehGAh6uBx8Eqokq48k2+cWSfBbn1AcyOawG2PUig3j126aNbtbl -# 9AzO6ZbGfwrHRjaCXkMllrhGZ+oYJyLZaZs3vY3F/2R1YPFw8oL9qIDGOGQq/ktE -# gOalV/3YKSIntzfPgsqGNvdN6RBLURX+FiSXWvB3qFnFoF4NgIvCpqMW8psLVU6L -# 6x7T6RK96jNNOaBT6HK8X3ACYiCmFzuIWizqYZxkX4OeJi3YfOy9xuFKuFJg48qB -# tAs+9jTO9j6p8aUHrLrO99Rsj3XNowhBem6GuFVjE1j1QzvLzzVvEWl3qN1bpqv5 -# 5n9iiDZ76sTWGHdWiyCwkN8BMLBwNlwuenbQQERQNpsbWn4zoieWiA7e8YL/GViU -# NHBJUsRP8HpiB6x01Ft83+BKRo+JX8+C2119bo8zvympY+LsA9kghU3iJM2Iqhkh -# NpJHhX/GyFOiXysLixsbbM/3LHpfH5CHXBVBGWHnpURnOALXAMpvS0eXhQHQhZ+V -# Nv2S4wWIkqKAHI25JxHoN2avCmOcTRmNjY8wlP+yhOp5VsTJS1fLYHR/1m/0XkNz -# bWTPwK6xjyco57oontN5+Zdx8yCboYIDbDCCA2gGCSqGSIb3DQEJBjGCA1kwggNV +# AQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEIFOdqQKPKOWFNMHwKbkP +# CK2ODm7gDc2gt+OYMrA4HNziMA0GCSqGSIb3DQEBAQUABIICAJX9FMRkuRNmHtPv +# yE0TLddNY70BlBqQDEU9Dtv5u4PlUbVZ2jZY2ELQPTAq1jjXyNqr1fXI9AVoUBuz +# TfTcalj+3DsYZVqaiiBlVdQ2DDrZJLv7Z3IAGAWl9NBlgjIlSP0PdGYZ7b0128iu +# RoCSvTl6GB3ptGSWQ6MYMc1pdYarv+Wi8OM73I1MU4qWOsH65Y2AgLGWKgEpueZt +# Y3rQ1bInMODFkk4FwFfZv/QCCEVJK7jEwzM7HnVfvWZiR3cV09MtTE81ZHs5ZKnR +# vWnxd2yFEH+ui+E7Omfhy/F3zp+D5g2agpSxGwmiKTi1ULW3fRImpy9vUuXwrLQJ +# idOMCbPtvqSAc6wKCR8jJDhj6GcNpRHX6l/DZbYoCq7S87KwV7AQfneDzz+utm4G +# ydRi3I8yZ6HRiLFrDVWgCHH9Ajp5/LXztOFNBuIJahwtiVzvRLlkY3nw8K4i0Ia6 +# /v4HArENnGYjeyz6g2of1i5m7vuOnHUbgeKTimeyelwpjDV8h6Lzup6tRd8zoc/A +# VG6ofWM3UPmBM1w7s4POWEcr52BLjdMQAd72mUGw5gsDqEY4q8lkrEFuyRcXYnhB +# xyOUMgVuAHLIbrRGPIKf/oSa0dgUaRCi4iwY58MiSmMuU4aKbqD/BENa/NpaunL+ +# W2KNmh2Oix9of2RitnSwKSiBfV4ioYIDbDCCA2gGCSqGSIb3DQEJBjGCA1kwggNV # AgEBMG8wWzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex # MTAvBgNVBAMTKEdsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gU0hBMzg0IC0g # RzQCEAEHZJsIsKf+fdZUqPL0KfYwCwYJYIZIAWUDBAIBoIIBPTAYBgkqhkiG9w0B -# CQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNDEyMTYxODEwNThaMCsG +# CQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNDEyMTYxOTM5NTFaMCsG # CSqGSIb3DQEJNDEeMBwwCwYJYIZIAWUDBAIBoQ0GCSqGSIb3DQEBCwUAMC8GCSqG -# SIb3DQEJBDEiBCA0kdGmz3U/huvbSSPNtuXDtio/vp/rPEMr30hJBEUdAjCBpAYL +# SIb3DQEJBDEiBCB1drKVrq/shE9wOdX/tsSZZr1iDENpJ7iz5i0Ui8cK/DCBpAYL # KoZIhvcNAQkQAgwxgZQwgZEwgY4wgYsEFETTk5zNG4h/hnrM2oHsrw9l/NJZMHMw # X6RdMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEw # LwYDVQQDEyhHbG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIFNIQTM4NCAtIEc0 -# AhABB2SbCLCn/n3WVKjy9Cn2MA0GCSqGSIb3DQEBCwUABIIBgCh6ecky2xVF2PkI -# 7HXhA1gxxVLeu/nJF0SPw+vgeKUM6a3gCevWN2SuTXmJSuz0fFPf4IrXCXECcRiA -# DfCk5ln7VFlq/BnlNEKUKgbiUwt/p383JCmvVGwhCKc/TpWS1knpGcYjhGlX0je1 -# inzClc3PRwDMnsNKoXYklPszV8C1PV/Ko2zHaA18q977h5HRLLUPmblnz0q/qtmV -# 82KJUgidw+z6PXFHAFurbgVTGQA/VyJp7rRHreJEdKluFkz3FVEFGZRIWdil0U+F -# JWvFBoFTdJ7NfZfoixj5p5zCC18XyXCFVaZE7oFOoHcoedKp8bDHrhSOntnObfv6 -# bwA5psV+g6YCz4WZRcYzEIyxMOVM+3sHGgDnjyHIch5wDwXlT5A2kzHiIvhvMipO -# GmyeG5htbJBo9tOmueYiw83tREb4YBNle6/+Dmo0b+bu2mUMvK+nuRfx946cesRZ -# l/QpxyxUcNFBt+341tZXUsOkONcqA+ptJuUIyHBLZmPqhmDK1g== +# AhABB2SbCLCn/n3WVKjy9Cn2MA0GCSqGSIb3DQEBCwUABIIBgGc8v3HxAEQng4Lw +# WN8KsDMCQW/CF+Ez3X+FLUMxajoNgKuAcRMjyLHPK3f0Nusb6iW1hDu0AnEz9NR0 +# gPZYGtBDz2NtKsSQqpNzs4NYNETmEEQ61GLB09X3iTgZgyZF1u/fkIK/nCL4k8bp +# nyo3Hxd04vIQgNJ3Q2m5D31V0yrVDvGkeFAUnecDQM1ik07l0zhZ/vpwtJiQ0g5F +# NnAqe0/Qmxjt7iqq7yS8PnaHpruhf0xlu59UU9/KtIT/RB0x+DX6nFXQid0Rhgfb +# HnP6RKV6P0jJwl7ZZwFcuXaGw5saniT+qIJOetA0cEPmqF7AmBYsPO52no3q3wG+ +# kSQXp1VC99NdFKQCC18BiJYhxdklst9Atvps//sWOFVySHM0sXpKBr1XNnVoyp18 +# ZSmNOEec8ee7bfBTOxeBqdYc1s7UeZedW89NOClebXXMn1hb/DKV6uqzHvoVOYOO +# BaXUTpxvq/tKiB/MABPjVDe5v4nCGoCO1SA1biZbfwZpVb24oA== # SIG # End signature block