VMPilotCollect.ps1

# VMPilotCollect.ps1 -- runs INSIDE the VM at SetupComplete.cmd (specialize pass).
# Offline collection: writes AutoPilot HWID CSV to C:\HWID then exits so the
# wrapping SetupComplete.cmd can call shutdown.
#
# Adds a "Group Tag" column only when -GroupTag is supplied non-empty.

[CmdletBinding()]
param(
    [string]$GroupTag = ''
)

try {
    if (-not (Test-Path 'C:\HWID')) { New-Item 'C:\HWID' -ItemType Directory -Force | Out-Null }

    $session = New-CimSession
    $serial  = (Get-CimInstance -CimSession $session -ClassName Win32_BIOS).SerialNumber

    $safeSerial = ($serial -replace '[\\/:*?"<>|\s]', '_').Trim('_')
    if ([string]::IsNullOrWhiteSpace($safeSerial)) { $safeSerial = $env:COMPUTERNAME }
    $csv = 'C:\HWID\AutoPilotHWID-' + $safeSerial + '.csv'

    $devDetail = Get-CimInstance -CimSession $session -Namespace root/cimv2/mdm/dmmap `
                                 -ClassName MDM_DevDetail_Ext01 `
                                 -Filter "InstanceID='Ext' AND ParentID='./DevDetail'"
    $hash = $devDetail.DeviceHardwareData

    $row = [ordered]@{
        'Device Serial Number' = $serial
        'Windows Product ID'   = ''
        'Hardware Hash'        = $hash
    }
    if (-not [string]::IsNullOrWhiteSpace($GroupTag)) {
        $row['Group Tag'] = $GroupTag.Trim()
    }

    [PSCustomObject]$row | Export-Csv -Path $csv -NoTypeInformation -Encoding ASCII
    Write-Host "Saved: $csv"
} catch {
    Write-Host "ERROR: $_"
    exit 1
}