Public/New-EntraDeviceAuth-Request.ps1
function New-EntraDeviceAuth-Request { <# .SYNOPSIS Creates a new device authentication request for an Entra-joined device. .DESCRIPTION This function generates a new device authentication request for an Entra-joined device by retrieving the necessary certificate information, creating a signature, and constructing the validation request. .NOTES Author: Florian Salzmann Contact: @FlorianSLZ Created: 2024-06-21 Updated: 2024-06-21 Version history: 1.0.0 - (2024-06-21) Function created #> param () try { $AzureADJoinInfoRegistryKeyPath = "HKLM:\SYSTEM\CurrentControlSet\Control\CloudDomainJoin\JoinInfo" # Check if the registry path for Azure AD Join info exists if (Test-Path -Path $AzureADJoinInfoRegistryKeyPath) { # Retrieve the certificate thumbprint from the registry $CertificateThumbprint = Get-ChildItem -Path $AzureADJoinInfoRegistryKeyPath | Select-Object -ExpandProperty "PSChildName" if ($CertificateThumbprint -ne $null) { # Retrieve the machine certificate based on the thumbprint from the registry key $AzureADJoinCertificate = Get-ChildItem -Path "Cert:\LocalMachine\My" -Recurse | Where-Object { $_.Thumbprint -eq $CertificateThumbprint } if ($AzureADJoinCertificate -ne $null) { # Extract the device identifier from the certificate's subject name $AzureADDeviceID = ($AzureADJoinCertificate | Select-Object -ExpandProperty "Subject") -replace "CN=", "" # Get the public key bytes from the certificate and convert to Base64 string [byte[]]$PublicKeyBytes = $AzureADJoinCertificate.GetPublicKey() $PublicKey = [System.Convert]::ToBase64String($PublicKeyBytes) }else{ Write-Error "No Entra Device Certificate found." } } else { Write-Error "No Entra Device Certificate Thumbprint found." } # Generate the signature using the certificate thumbprint and device ID $Signature = New-RSASignatureFromCertificate -Content $AzureADDeviceID -Thumbprint $CertificateThumbprint # Construct the validation request object with necessary details $ValidationRequest = [ordered]@{ DeviceName = $env:COMPUTERNAME DeviceID = $AzureADDeviceID Signature = $Signature Thumbprint = $CertificateThumbprint PublicKey = $PublicKey } # Return the validation request object return $ValidationRequest } else { Write-Error "Device is not Entra joined." } } catch { Write-Error "Error while processing device authentication request `n$_" } } |