From fdf5a30d4775de192cca934fe7ea7feee56d291a Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Tue, 18 Feb 2025 10:18:37 +0100 Subject: [PATCH] Add Export-AutopilotHash-ToEmail.ps1 --- Export-AutopilotHash-ToEmail.ps1 | 96 ++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 Export-AutopilotHash-ToEmail.ps1 diff --git a/Export-AutopilotHash-ToEmail.ps1 b/Export-AutopilotHash-ToEmail.ps1 new file mode 100644 index 0000000..dc6c567 --- /dev/null +++ b/Export-AutopilotHash-ToEmail.ps1 @@ -0,0 +1,96 @@ +# Configuration +$csvPath = "$env:TEMP\AutopilotHash.csv" +$autopilotScript = "$env:TEMP\Get-WindowsAutopilotInfo.ps1" + +# Microsoft 365 OAuth Configuration +$tenantId = "YOUR_TENANT_ID" +$clientId = "YOUR_CLIENT_ID" +$clientSecret = "YOUR_CLIENT_SECRET" # Store securely! +$fromEmail = "sender@example.com" +$toEmail = "recipient@example.com" + +# Retrieve the device serial number +$serialNumber = (Get-WmiObject -Class Win32_BIOS).SerialNumber +if (-not $serialNumber) { + $serialNumber = "Unknown_SerialNumber" +} + +# Email subject including the serial number +$subject = "Autopilot Hash Export - $serialNumber" +$body = "See the attached CSV file containing the Autopilot Hash for device $serialNumber." + +# Download Get-WindowsAutopilotInfo.ps1 from a trusted source +Write-Host "Downloading Get-WindowsAutopilotInfo.ps1..." +$downloadUrl = "https://gitea.oskamp.info/ivooskamp/Autopilot/raw/branch/main/Get-WindowsAutoPilotInfo.ps1" + +Try { + Invoke-WebRequest -Uri $downloadUrl -OutFile $autopilotScript -UseBasicParsing -ErrorAction Stop +} Catch { + Write-Host "Error: Failed to download Get-WindowsAutopilotInfo.ps1." + Exit 1 +} + +# Verify if the script was downloaded correctly +if (-not (Test-Path $autopilotScript)) { + Write-Host "Error: Get-WindowsAutopilotInfo.ps1 does not exist after download." + Exit 1 +} + +# Execute the script to collect the Autopilot hash +Write-Host "Collecting the Autopilot hash..." +Try { + & PowerShell -ExecutionPolicy Bypass -File $autopilotScript -OutputFile $csvPath -ErrorAction Stop +} Catch { + Write-Host "Error retrieving the Autopilot hash: $_" + Exit 1 +} + +# Check if the CSV file was created +if (-not (Test-Path $csvPath)) { + Write-Host "Error: CSV file was not created." + Exit 1 +} + +# Obtain Microsoft 365 OAuth Token +Write-Host "Retrieving Microsoft 365 OAuth token..." +$tokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" +$tokenBody = @{ + client_id = $clientId + scope = "https://graph.microsoft.com/.default" + grant_type = "client_credentials" + client_secret = $clientSecret +} + +$tokenResponse = Invoke-RestMethod -Method Post -Uri $tokenUrl -ContentType "application/x-www-form-urlencoded" -Body $tokenBody +$accessToken = $tokenResponse.access_token + +# Send email via Microsoft Graph API +$graphUrl = "https://graph.microsoft.com/v1.0/users/$fromEmail/sendMail" + +$emailJson = @{ + message = @{ + subject = $subject + body = @{ + contentType = "Text" + content = $body + } + toRecipients = @(@{ emailAddress = @{ address = $toEmail } }) + attachments = @(@{ + "@odata.type" = "#microsoft.graph.fileAttachment" + name = "AutopilotHash_$serialNumber.csv" + contentType = "text/csv" + contentBytes = [Convert]::ToBase64String([System.IO.File]::ReadAllBytes($csvPath)) + }) + } +} + +$emailJson = $emailJson | ConvertTo-Json -Depth 10 + +Write-Host "Sending email..." +Invoke-RestMethod -Uri $graphUrl -Headers @{Authorization = "Bearer $accessToken"; "Content-Type" = "application/json"} -Method Post -Body $emailJson + +Write-Host "Email sent to $toEmail" + +# Cleanup +Remove-Item -Path $csvPath -Force +Remove-Item -Path $autopilotScript -Force