From ed7140e52c080102ec6f493986790e3106d0e2c4 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Fri, 29 Nov 2024 11:21:17 +0100 Subject: [PATCH] Add Get-WindowsAutoPilotInfo.ps1 --- Get-WindowsAutoPilotInfo.ps1 | 190 +++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 Get-WindowsAutoPilotInfo.ps1 diff --git a/Get-WindowsAutoPilotInfo.ps1 b/Get-WindowsAutoPilotInfo.ps1 new file mode 100644 index 0000000..133a057 --- /dev/null +++ b/Get-WindowsAutoPilotInfo.ps1 @@ -0,0 +1,190 @@ +<#PSScriptInfo + +.VERSION 1.3 + +.GUID ebf446a3-3362-4774-83c0-b7299410b63f + +.AUTHOR Michael Niehaus + +.COMPANYNAME Microsoft + +.COPYRIGHT + +.TAGS Windows AutoPilot + +.LICENSEURI + +.PROJECTURI + +.ICONURI + +.EXTERNALMODULEDEPENDENCIES + +.REQUIREDSCRIPTS + +.EXTERNALSCRIPTDEPENDENCIES + +.RELEASENOTES +Version 1.0: Original published version. +Version 1.1: Added -Append switch. +Version 1.2: Added -Credential switch. +Version 1.3: Added -Partner switch. + +#> + +<# +.SYNOPSIS +Retrieves the Windows AutoPilot deployment details from one or more computers +.DESCRIPTION +This script uses WMI to retrieve properties needed by the Microsoft Store for Business to support Windows AutoPilot deployment. +.PARAMETER Name +The names of the computers. These can be provided via the pipeline (property name Name or one of the available aliases, DNSHostName, ComputerName, and Computer). +.PARAMETER OutputFile +The name of the CSV file to be created with the details for the computers. If not specified, the details will be returned to the PowerShell +pipeline. +.PARAMETER Append +Switch to specify that new computer details should be appended to the specified output file, instead of overwriting the existing file. +.PARAMETER Credential +Credentials that should be used when connecting to a remote computer (not supported when gathering details from the local computer). +.PARAMETER Partner +Switch to specify that the created CSV file should use the schema for Partner Center (using serial number, make, and model). +.EXAMPLE +.\Get-WindowsAutoPilotInfo.ps1 -ComputerName MYCOMPUTER -OutputFile .\MyComputer.csv +.EXAMPLE +.\Get-WindowsAutoPilotInfo.ps1 -ComputerName MYCOMPUTER -OutputFile .\MyComputer.csv -Append +.EXAMPLE +.\Get-WindowsAutoPilotInfo.ps1 -ComputerName MYCOMPUTER1,MYCOMPUTER2 -OutputFile .\MyComputers.csv +.EXAMPLE +Get-ADComputer -Filter * | .\GetWindowsAutoPilotInfo.ps1 -OutputFile .\MyComputers.csv +.EXAMPLE +Get-CMCollectionMember -CollectionName "All Systems" | .\GetWindowsAutoPilotInfo.ps1 -OutputFile .\MyComputers.csv +.EXAMPLE +.\Get-WindowsAutoPilotInfo.ps1 -ComputerName MYCOMPUTER1,MYCOMPUTER2 -OutputFile .\MyComputers.csv -Partner + +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$False,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True,Position=0)][alias("DNSHostName","ComputerName","Computer")] [String[]] $Name = @($env:ComputerName), + [Parameter(Mandatory=$False)] [String] $OutputFile = "", + [Parameter(Mandatory=$False)] [Switch] $Append = $false, + [Parameter(Mandatory=$False)] [System.Management.Automation.PSCredential] $Credential = $null, + [Parameter(Mandatory=$False)] [Switch] $Partner = $false, + [Parameter(Mandatory=$False)] [Switch] $Force = $false +) + +Begin +{ + # Initialize empty list + $computers = @() +} + +Process +{ + foreach ($comp in $Name) + { + $bad = $false + + # Get the common properties. + Write-Verbose "Checking $comp" + $serial = (Get-WmiObject -ComputerName $comp -Credential $Credential -Class Win32_BIOS).SerialNumber + + # Get the hash (if available) + $devDetail = (Get-WMIObject -ComputerName $comp -Credential $Credential -Namespace root/cimv2/mdm/dmmap -Class MDM_DevDetail_Ext01 -Filter "InstanceID='Ext' AND ParentID='./DevDetail'") + if ($devDetail -and (-not $Force)) + { + $hash = $devDetail.DeviceHardwareData + } + else + { + $bad = $true + $hash = "" + } + + # If the hash isn't available, get the make and model + if ($bad -or $Force) + { + $cs = Get-WmiObject -ComputerName $comp -Credential $Credential -Class Win32_ComputerSystem + $make = $cs.Manufacturer.Trim() + $model = $cs.Model.Trim() + if ($Partner) + { + $bad = $false + } + } + else + { + $make = "" + $model = "" + } + + # Getting the PKID is generally problematic for anyone other than OEMs, so let's skip it here + $product = "" + + # Depending on the format requested, create the necessary object + if ($Partner) + { + # Create a pipeline object + $c = New-Object psobject -Property @{ + "Device Serial Number" = $serial + "Windows Product ID" = $product + "Hardware Hash" = $hash + "Manufacturer name" = $make + "Device model" = $model + } + # From spec: + # "Manufacturer Name" = $make + # "Device Name" = $model + + } + else + { + # Create a pipeline object + $c = New-Object psobject -Property @{ + "Device Serial Number" = $serial + "Windows Product ID" = $product + "Hardware Hash" = $hash + } + } + + # Write the object to the pipeline or array + if ($bad) + { + # Report an error when the hash isn't available + Write-Error -Message "Unable to retrieve device hardware data (hash) from computer $comp" -Category DeviceError + } + elseif ($OutputFile -eq "") + { + $c + } + else + { + $computers += $c + } + + } +} + +End +{ + if ($OutputFile -ne "") + { + if ($Append) + { + if (Test-Path $OutputFile) + { + $computers += Import-CSV -Path $OutputFile + } + } + if ($Partner) + { + $computers | Select "Device Serial Number", "Windows Product ID", "Hardware Hash", "Manufacturer name", "Device model" | ConvertTo-CSV -NoTypeInformation | % {$_ -replace '"',''} | Out-File $OutputFile + # From spec: + # $computers | Select "Device Serial Number", "Windows Product ID", "Hardware Hash", "Manufacturer Name", "Device Name" | ConvertTo-CSV -NoTypeInformation | % {$_ -replace '"',''} | Out-File $OutputFile + } + else + { + $computers | Select "Device Serial Number", "Windows Product ID", "Hardware Hash" | ConvertTo-CSV -NoTypeInformation | % {$_ -replace '"',''} | Out-File $OutputFile + } + } +} \ No newline at end of file