82 lines
2.9 KiB
PowerShell
82 lines
2.9 KiB
PowerShell
param(
|
|
[string]$BackupPath = "\\kallilabcore\backups\windows-images\baerchen",
|
|
[string]$JobName = "baerchen-c-image",
|
|
[string]$LogRoot = "C:\ProgramData\Veeam\Endpoint"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
function Write-Section {
|
|
param([string]$Title)
|
|
Write-Host ""
|
|
Write-Host "== $Title =="
|
|
}
|
|
|
|
$result = [ordered]@{
|
|
ComputerName = $env:COMPUTERNAME
|
|
Timestamp = (Get-Date).ToString("s")
|
|
JobName = $JobName
|
|
BackupPath = $BackupPath
|
|
VeeamService = $null
|
|
BackupPathReachable = $false
|
|
BackupFiles = @()
|
|
LatestBackupFile = $null
|
|
LatestJobEvidence = @()
|
|
}
|
|
|
|
Write-Section "Veeam service"
|
|
$service = Get-Service -Name VeeamEndpointBackupSvc -ErrorAction SilentlyContinue
|
|
if ($service) {
|
|
$result.VeeamService = $service.Status.ToString()
|
|
$service | Select-Object Status,Name,DisplayName | Format-Table -AutoSize
|
|
} else {
|
|
$result.VeeamService = "missing"
|
|
Write-Warning "VeeamEndpointBackupSvc not found"
|
|
}
|
|
|
|
Write-Section "Backup target"
|
|
if (Test-Path -LiteralPath $BackupPath) {
|
|
$result.BackupPathReachable = $true
|
|
$files = Get-ChildItem -LiteralPath $BackupPath -File -Recurse |
|
|
Sort-Object LastWriteTime -Descending |
|
|
Select-Object FullName,Length,LastWriteTime
|
|
$result.BackupFiles = $files
|
|
$result.LatestBackupFile = $files | Select-Object -First 1
|
|
$files | Select-Object -First 20 | Format-Table -AutoSize
|
|
} else {
|
|
Write-Warning "Backup path is not reachable from this Windows session. This can be normal when Veeam uses stored job credentials and the interactive user has no active SMB session."
|
|
}
|
|
|
|
Write-Section "Veeam job evidence"
|
|
if (Test-Path -LiteralPath $LogRoot) {
|
|
$logFiles = @(
|
|
(Join-Path $LogRoot "Svc.VeeamEndpointBackup.log"),
|
|
(Join-Path $LogRoot "UI.BackupJobWizard.log"),
|
|
(Join-Path $LogRoot "UI.Tray-michi.log")
|
|
) | Where-Object { Test-Path -LiteralPath $_ }
|
|
|
|
$patterns = @(
|
|
[regex]::Escape("Job [$JobName] was started"),
|
|
'Session result: "Success", job type: "EndpointBackup"',
|
|
[regex]::Escape("Name: [$JobName]"),
|
|
'Result: \[Success\]',
|
|
'StorageEncryptionEnabled:\s+0',
|
|
[regex]::Escape("Starting endpoint backup, job name = $JobName")
|
|
) -join "|"
|
|
|
|
$evidence = Select-String -Path $logFiles -Pattern $patterns -CaseSensitive:$false -ErrorAction SilentlyContinue |
|
|
Sort-Object Path,LineNumber |
|
|
Select-Object -Last 30 @{Name = "File"; Expression = { Split-Path -Leaf $_.Path } },LineNumber,Line
|
|
$result.LatestJobEvidence = $evidence
|
|
$evidence | Format-List
|
|
|
|
if (-not ($evidence | Where-Object { $_.Line -match 'Result: \[Success\]|Session result: "Success"' })) {
|
|
Write-Warning "No successful EndpointBackup session was found in the selected Veeam logs."
|
|
}
|
|
} else {
|
|
Write-Warning "Veeam log root not found: $LogRoot"
|
|
}
|
|
|
|
Write-Section "Summary"
|
|
[pscustomobject]$result | Select-Object ComputerName,Timestamp,JobName,BackupPath,VeeamService,BackupPathReachable,LatestBackupFile | Format-List
|