Files
claudetools/clients/glaztech/Deploy-PDFFix-BulkRemote.ps1

208 lines
6.3 KiB
PowerShell

#requires -RunAsAdministrator
<#
.SYNOPSIS
Deploy PDF preview fix to multiple Glaztech computers remotely
.DESCRIPTION
Runs Fix-PDFPreview-Glaztech.ps1 on multiple remote computers via PowerShell remoting
or prepares for deployment via GuruRMM
.PARAMETER ComputerNames
Array of computer names to target
.PARAMETER Credential
PSCredential for remote access (optional, uses current user if not provided)
.PARAMETER UseGuruRMM
Export script as GuruRMM task instead of running directly
.EXAMPLE
.\Deploy-PDFFix-BulkRemote.ps1 -ComputerNames "PC001","PC002","PC003"
.EXAMPLE
.\Deploy-PDFFix-BulkRemote.ps1 -ComputerNames (Get-Content computers.txt)
.EXAMPLE
.\Deploy-PDFFix-BulkRemote.ps1 -UseGuruRMM
Generates GuruRMM deployment package
#>
param(
[string[]]$ComputerNames = @(),
[PSCredential]$Credential,
[switch]$UseGuruRMM,
[string[]]$ServerNames = @("192.168.8.62"),
[string[]]$AdditionalPaths = @()
)
$ScriptPath = Join-Path $PSScriptRoot "Fix-PDFPreview-Glaztech.ps1"
if (-not (Test-Path $ScriptPath)) {
Write-Host "[ERROR] Fix-PDFPreview-Glaztech.ps1 not found in script directory" -ForegroundColor Red
exit 1
}
if ($UseGuruRMM) {
Write-Host "[OK] Generating GuruRMM deployment package..." -ForegroundColor Green
Write-Host ""
$GuruRMMScript = @"
# Glaztech PDF Preview Fix - GuruRMM Deployment
# Auto-generated: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
`$ScriptContent = @'
$(Get-Content $ScriptPath -Raw)
'@
# Save script to temp location
`$TempScript = "`$env:TEMP\Fix-PDFPreview-Glaztech.ps1"
`$ScriptContent | Out-File -FilePath `$TempScript -Encoding UTF8 -Force
# Build parameters
`$Params = @{}
"@
if ($ServerNames.Count -gt 0) {
$ServerList = ($ServerNames | ForEach-Object { "`"$_`"" }) -join ","
$GuruRMMScript += @"
`$Params['ServerNames'] = @($ServerList)
"@
}
if ($AdditionalPaths.Count -gt 0) {
$PathList = ($AdditionalPaths | ForEach-Object { "`"$_`"" }) -join ","
$GuruRMMScript += @"
`$Params['UnblockPaths'] = @($PathList)
"@
}
$GuruRMMScript += @"
# Execute script (includes automatic Explorer restart)
& `$TempScript @Params
# Cleanup
Remove-Item `$TempScript -Force -ErrorAction SilentlyContinue
"@
$GuruRMMPath = Join-Path $PSScriptRoot "GuruRMM-Glaztech-PDF-Fix.ps1"
$GuruRMMScript | Out-File -FilePath $GuruRMMPath -Encoding UTF8 -Force
Write-Host "[SUCCESS] GuruRMM script generated: $GuruRMMPath" -ForegroundColor Green
Write-Host ""
Write-Host "To deploy via GuruRMM:" -ForegroundColor Cyan
Write-Host "1. Log into GuruRMM dashboard"
Write-Host "2. Create new PowerShell task"
Write-Host "3. Copy contents of: $GuruRMMPath"
Write-Host "4. Target: Glaztech Industries (Client ID: d857708c-5713-4ee5-a314-679f86d2f9f9)"
Write-Host "5. Execute on affected computers"
Write-Host ""
Write-Host "GuruRMM API Key: grmm_Qw64eawPBjnMdwN5UmDGWoPlqwvjM7lI" -ForegroundColor Yellow
exit 0
}
if ($ComputerNames.Count -eq 0) {
Write-Host "[ERROR] No computer names provided" -ForegroundColor Red
Write-Host ""
Write-Host "Usage examples:" -ForegroundColor Yellow
Write-Host " .\Deploy-PDFFix-BulkRemote.ps1 -ComputerNames 'PC001','PC002','PC003'"
Write-Host " .\Deploy-PDFFix-BulkRemote.ps1 -ComputerNames (Get-Content computers.txt)"
Write-Host " .\Deploy-PDFFix-BulkRemote.ps1 -UseGuruRMM"
exit 1
}
Write-Host "[OK] Deploying PDF fix to $($ComputerNames.Count) computers..." -ForegroundColor Green
Write-Host ""
$Results = @()
$ScriptContent = Get-Content $ScriptPath -Raw
foreach ($Computer in $ComputerNames) {
Write-Host "[$Computer] Connecting..." -ForegroundColor Cyan
try {
# Test connectivity
if (-not (Test-Connection -ComputerName $Computer -Count 1 -Quiet)) {
Write-Host "[$Computer] [ERROR] Cannot reach computer" -ForegroundColor Red
$Results += [PSCustomObject]@{
ComputerName = $Computer
Status = "Unreachable"
PDFsUnblocked = 0
ConfigChanges = 0
Error = "Cannot ping"
}
continue
}
# Build parameters
$RemoteParams = @{}
if ($ServerNames.Count -gt 0) { $RemoteParams['ServerNames'] = $ServerNames }
if ($AdditionalPaths.Count -gt 0) { $RemoteParams['UnblockPaths'] = $AdditionalPaths }
# Execute remotely
$InvokeParams = @{
ComputerName = $Computer
ScriptBlock = [ScriptBlock]::Create($ScriptContent)
ArgumentList = $RemoteParams
}
if ($Credential) {
$InvokeParams['Credential'] = $Credential
}
$Result = Invoke-Command @InvokeParams -ErrorAction Stop
Write-Host "[$Computer] [SUCCESS] PDFs: $($Result.PDFsUnblocked), Changes: $($Result.ConfigChanges)" -ForegroundColor Green
$Results += [PSCustomObject]@{
ComputerName = $Computer
Status = "Success"
PDFsUnblocked = $Result.PDFsUnblocked
ConfigChanges = $Result.ConfigChanges
Error = $null
}
# Note: Explorer restart is now handled by the main script automatically
} catch {
Write-Host "[$Computer] [ERROR] $($_.Exception.Message)" -ForegroundColor Red
$Results += [PSCustomObject]@{
ComputerName = $Computer
Status = "Failed"
PDFsUnblocked = 0
ConfigChanges = 0
Error = $_.Exception.Message
}
}
Write-Host ""
}
# Summary
Write-Host "========================================"
Write-Host "DEPLOYMENT SUMMARY"
Write-Host "========================================"
$Results | Format-Table -AutoSize
$SuccessCount = ($Results | Where-Object { $_.Status -eq "Success" }).Count
$FailureCount = ($Results | Where-Object { $_.Status -ne "Success" }).Count
Write-Host ""
Write-Host "Total Computers: $($Results.Count)"
Write-Host "Successful: $SuccessCount" -ForegroundColor Green
Write-Host "Failed: $FailureCount" -ForegroundColor $(if ($FailureCount -gt 0) { "Red" } else { "Green" })
# Export results
$ResultsPath = Join-Path $PSScriptRoot "deployment-results-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv"
$Results | Export-Csv -Path $ResultsPath -NoTypeInformation
Write-Host ""
Write-Host "Results exported to: $ResultsPath"