Hardware Hashes für Autopilot Registrierung zentral erfassen
Windows Autopilot bietet die Möglichkeit, neue Geräte in Intune automatisch einzurichten und konfigurieren zu lassen. Hierdurch lassen sich die manuellen Schritte beim Onboarding neuer Geräte auf ein Minimum reduzieren oder sogar vollständig vermeiden. Ein in Autopilot registriertes Endgerät lässt sich zudem zentral aus der Ferne zurücksetzen.
Einleitung
Um ein Gerät für die Verwendung mit Autopilot zu registrieren, muss die eindeutige ID (der Hardwarehash) des Gerätes vorab bekannt sein. Der Hardwarehash ist auf jedem Windows Computer hinterlegt und kann z. B. mittels einer WMI-Abfrage ermittelt werden. Möglicherweise kann bereits der Hardwarelieferant die Hashes in Form einer CSV-Datei zusammen mit neu erworbenen Geräten übermitteln oder gar die Registrierung in Intune direkt vornehmen. In manchen Fällen ist es jedoch so, dass Endgeräte bereits in Umlauf sind, die im Laufe der Zeit manuell in Intune eingebucht worden sind. In diesem Fall kann das nachträgliche Ermitteln der Hashes zur Herausforderung werden. Das hier beschriebene Verfahren zeigt eine Möglichkeit auf, die Hashes von bereits in Intune sichtbaren Endgeräten zentral einzusammeln und für die Autopilotregistrierung zu nutzen.
Konzept
Das Einsammeln der Hardwarehashes erfolgt hier über die Installation eines Intune Application Packages. Dabei handelt es sich nicht um eine Installation im eigentlichen Sinne, da keine Dateien auf dem Endgerät installiert werden. Stattdessen ermittelt das Installationsprogramm auf dem Endgerät die Seriennummer sowie den Hardware-Hash und legt diese Daten in Form einer CSV-Datei in einem Dateishare innerhalb eines Azure Storage Accounts zentral ab.
Das Speichern der Hashwerte erfolgt in Form von .csv Dateien, wobei für jedes Gerät eine neue Datei angelegt wird, um den konkurrierenden Zugriff auf eine einzelne Datei zu vermeiden. Die einzelnen Dateien können später jedoch sehr einfach zu einer einzelnen Datei zusammengeführt werden.
Für den Zugriff auf den Azure Storage Share verwendet die Hardware Hash Collector App einen SAS Token, der über die Installationskommandozeile an das App Package übergeben wird.
Umsetzung
In diesem Abschnitt soll die Umsetzung der angedachten Lösung erläutert werden.
Storage Account
Zum Speichern der Hardwarehashes wird ein Azure Storage Account benötigt, der über das Azure Portal mit diesen Schritten angelegt werden kann:
- Storage accounts | Create
- Subscription | Resource group | Region wählen
- Beliebigen, eindeutigen Storage acount name vergeben
- Kostengünstigste Redundancy wählen
- Review
- Create
- Go to resource

File Share anlegen
Innerhalb des Storage Accounts muss nun ein File Share mit diesen Schritten erzeugt werden:
- File shares

- File share
- Eindeutigen Name vergeben und kostengünstigen Tier wählen
- Create
- Properties des gerade angelegten File Share auswählen

- Nun die URL in die Zwischenablage kopieren und zur späteren Verwendung sichern

SAS-Token erzeugen
Für den Zugriff auf den FileShare wird eine Shared Access Signature (SAS) benötigt, die wie folgt angelegt werden kann:
- Shared access signature wählen

- Alle Allowed resource types auswählen
- Sinnvolles expiry date wählen
- Generate SAS and connection string

- Generiertes SAS token in die Zwischenablage kopieren und sichern, da es später benötigt wird

Intune Application Package
Das eigentliche Ermitteln und Speichern des Hardwarehash geschieht mit Hilfe einer Application, die über Intune bereitgestellt und verteilt wird. Dabei handelt es sich nicht im engeren Sinne um eine Application, die auf dem Endgerät tatsächlich installiert wird, vielmehr besteht das Package aus einem Installationsskript, das einmalig ausgeführt wird. Zur Laufzeit des Skripts wird der Hashwert des Gerätes exportiert und zentral gespeichert. Zusätzlich wird ein Wert in der Windows Registry des Endgeräts angelegt, der für die erforderliche DetectionRule des Intune Application Package verwendet wird.
Vorbereiten der Intune Application
Wesentlicher Inhalt des Application Package ist ein PowerShell Skript namens Export-Hash.ps1, dessen Skriptcode hier aufgeführt ist.
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true)]
[string]$TargetURL,
[Parameter(Mandatory=$true)]
[string]$SasToken
)
# Collect data
$computer = New-Object PSObject
$win32Bios = Get-CimInstance -Class Win32_BIOS
$devDetail = Get-CimInstance -Namespace root/cimv2/mdm/dmmap -Class MDM_DevDetail_Ext01 -Filter „InstanceID=’Ext‘ AND ParentID=‘./DevDetail'“
$hash = „“
if ($devDetail)
{
$hash = $devDetail.DeviceHardwareData
}
$computer | Add-Member -MemberType NoteProperty -Name „Device Serial Number“ -Value $win32Bios.SerialNumber
$computer | Add-Member -MemberType NoteProperty -Name „Windows Product ID“ -Value „“
$computer | Add-Member -MemberType NoteProperty -Name „Hardware Hash“ -Value $hash
# Write data to CSV file
$tempFolderPathName = Join-Path $env:TEMP -ChildPath „CollectAutoPilotInfo“
If(-not (Test-Path -Path $tempFolderPathName))
{
New-Item -Path $tempFolderPathName -ItemType Directory
}
$dataFileName = Join-Path -Path $tempFolderPathName -ChildPath „$($env:COMPUTERNAME).csv“
$computer | ConvertTo-Csv -NoTypeInformation -Delimiter „,“ | % {$_.Replace(‚“‚,“)} | Out-File $dataFileName -Force
# Upload CSV file
$url = $TargetUrl
If(-not ($SasToken.StartsWith(„?“)))
{
$url += „?“
}
$url += $SasToken
Start-Process -FilePath „azcopy.exe“ -ArgumentList „copy $dataFileName `“$url`““
# Register successful application deployment for detection method to work.
$appRegistryKey = „HKLM:\SOFTWARE\Iteracon\Apps\HardwareHashCollector“
If(-not (Test-Path -Path $appRegistryKey))
{
New-Item -Path $appRegistryKey -Force
}
New-ItemProperty -Path $appRegistryKey -Name „Version“ -Value „1.0“ -Force
Zur Laufzeit des Skripts wird zusätzlich AzCopy von Microsoft benötigt, das zusammen mit der oben dargestellten Skriptdatei in das Intune Application Package aufgenommen wird. Mehr zu AzCopy und der Möglichkeit zum Download des Tools findet man hier: https://learn.microsoft.com/de-de/azure/storage/common/storage-use-azcopy-v10.
Die Skriptdatei Export-Hash.ps1 sowie AzCopy.exe wird mit Hilfe des Microsoft Win32 Content Prep Tool zu einer .intunewin Datei konvertiert. Die Vorgehensweise hierzu wird als bekannt vorausgesetzt und hier nicht näher erläutert. Ausführliche Informationen zu diesem Thema findet man jedoch hier: https://learn.microsoft.com/de-de/mem/intune/apps/apps-win32-prepare .
Intune Package erstellen
Die Vorgehensweise des Anlegens eines Intune Win32 Application Package wird ebenfalls als bekannt angenommen, nähere Informationen dazu sind hier zu finden: https://learn.microsoft.com/de-de/mem/intune/apps/apps-win32-add.
Beim Anlegen der Application sind folgende Parameter zu berücksichtigen. Die Werte für <File Share URL> und <SAS Token> bei der Konstruktion des Install Command sind dabei durch die entsprechenden Werte zu ersetzen, die sich beim Anlegen des Storage Account und des File Share ergeben haben, siehe oben. Die beiden Werte müssen jeweils in doppelte Anführungszeichen gesetzt werden.
App Information | |
Name | Hardware Hash Collector |
Version | 1.0 |
Publisher | ITERACON |
Program | |
Install command | PowerShell.exe -ExecutionPolicy Bypass -File .\Export-Hash.ps1 -TargetURL „<File Share URL>“ -SasToken „<SAS Token>“ |
Uninstall command | – |
Install behavior | System |
Detection Rules | |
Rules format | Manually configure detection rules |
Rule Type | Registry |
Key Path | HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\iteracon\Apps\HardwareHashCollector |
Value Name | Version |
Detection method | Version comparison |
Operator | Greater than or equal to |
Value | 1.0 |
Die so erstellte Application wird nun allen Geräten als required zugewiesen und damit die Verteilung gestartet. Nach und nach werden dann die Hardwarehashes in Form von .csv Dateien in dem zuvor bereitgestellten Azure Storage File Share abgelegt, von wo aus sie auf einen Adminrechner heruntergeladen werden können. Dies kann z. B. mit dem Microsoft Azure Storage Explorer erfolgen:

Die eingesammelten .csv Dateien können entweder einzeln in Intune importiert, besser jedoch mit Hilfe dieser beiden PowerShell Befehle zu einer einzelnen Datei zusammengeführt und dann importiert werden:
MD .\Merged
Get-ChildItem -Filter *.csv | Select -ExpandProperty FullName | Import-Csv | Export-Csv .\Merged\Autopilot.csv -NoTypeInformation -Append


