param( $serverString, $exportPassword, $importPath ) $servers = $serverString.Split(","); $exportCertificateZipPath = "C:/temp/certificateExport.zip"; $script = { $password = $using:exportPassword; $exportPath = $using:exportCertificateZipPath; # Create the cert temp cert export directory for each server. $tempPath = "C:/temp/certificateExport"; if(Test-Path $tempPath) { Remove-Item -Path $tempPath -Recurse -Force; } New-Item -Path $tempPath -ItemType Directory; # Export all certificates and compress them. try { Write-Host "Exporting Certificates to $tempPath"; Export-Certificates -exportPassword $password -exportPath $tempPath; $zipPath = "$tempPath/*"; Write-Host "Zipping certificates at $zipPath to archive $exportPath"; Compress-Archive -Path $zipPath -DestinationPath $exportPath -Force | Out-Null; } catch { throw $_; } finally { # Clean up exported certs. if(Test-Path $tempPath) { Remove-Item -Path $tempPath -Recurse -Force; } } } try { # Export all of the certificates on each server. Invoke-Command -ComputerName $servers -ScriptBlock $script; # Read all of the certificates back to the agent machine and unzip. $copyToAgentScript = { param($server) $certZipPath = Get-UncPath -filePath $using:exportCertificateZipPath -ComputerName $server; $serverImportDirectory = (Join-Path $using:importPath $server); $serverImportFile = (Join-Path $serverImportDirectory "certs.zip"); if(Test-Path $certZipPath) { if(!(Test-Path $serverImportDirectory)) { New-Item -Path $serverImportDirectory -ItemType Directory | Out-Null; } Write-Host "Copying $certZipPath to $serverImportFile"; Move-Item -Path $certZipPath -Destination $serverImportFile -Force | Out-Null; Write-Host "Expanding archive $serverImportfile in $serverImportDirectory" Expand-Archive -Path $serverImportFile -DestinationPath $serverImportDirectory -Force; Remove-Item -Path $serverImportFile -Force; } } Invoke-Parallel -objects $servers -script $copyToAgentScript; } finally { # Clean up the certificate export zip's on all of the servers if the process crashed. foreach($server in $servers) { $certZipPath = Get-UncPath -filePath $exportCertificateZipPath -ComputerName $server; if(Test-Path $certZipPath) { Write-Host "Cleaning up $certZipPath"; Remove-Item -Path $certZipPath; } } }