103 lines
3.4 KiB
PowerShell
103 lines
3.4 KiB
PowerShell
# Microsoft Defender maintenance (update signatures, repair, show status)
|
||
# Host: console
|
||
# Options: Update signatures; Repair definitions and update; Show Defender status
|
||
|
||
param([string]$choice)
|
||
|
||
function Get-MpCmdPath {
|
||
$candidates = @(
|
||
"$env:ProgramFiles\Windows Defender\MpCmdRun.exe",
|
||
"$env:ProgramFiles\Microsoft Defender\MpCmdRun.exe"
|
||
)
|
||
foreach ($p in $candidates) { if (Test-Path $p) { return $p } }
|
||
return $null
|
||
}
|
||
|
||
function Is-Admin {
|
||
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||
$pr = New-Object Security.Principal.WindowsPrincipal($id)
|
||
return $pr.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||
}
|
||
|
||
function Show-Status {
|
||
try {
|
||
$s = Get-MpComputerStatus
|
||
Write-Output "=== Microsoft Defender Status ==="
|
||
Write-Output ("Engine version: {0}" -f $s.AMEngineVersion)
|
||
Write-Output ("Platform version: {0}" -f $s.AMProductVersion)
|
||
Write-Output ("AV signature version: {0}" -f $s.AntivirusSignatureVersion)
|
||
Write-Output ("AV signature last update: {0}" -f $s.AntivirusSignatureLastUpdated)
|
||
Write-Output ("AS signature version: {0}" -f $s.AntispywareSignatureVersion)
|
||
Write-Output ("Real-time protection: {0}" -f $s.RealTimeProtectionEnabled)
|
||
Write-Output ("NIS enabled: {0}" -f $s.NISEnabled)
|
||
Write-Output ("Service enabled: {0}" -f $s.AMServiceEnabled)
|
||
} catch {
|
||
Write-Output "✘ Failed to read Defender status: $($_.Exception.Message)"
|
||
}
|
||
}
|
||
|
||
switch ($choice) {
|
||
|
||
"Update signatures" {
|
||
if (-not (Is-Admin)) {
|
||
Write-Output "ℹ Tip: Run as Administrator for the most reliable results."
|
||
}
|
||
|
||
try {
|
||
# Primary: PowerShell cmdlet
|
||
Update-MpSignature -ErrorAction Stop
|
||
Write-Output "✔ Signatures updated via Update-MpSignature."
|
||
} catch {
|
||
# Fallback: MpCmdRun
|
||
$mp = Get-MpCmdPath
|
||
if ($mp) {
|
||
Write-Output "↻ Falling back to MpCmdRun.exe ..."
|
||
& $mp -SignatureUpdate | Out-String | Write-Output
|
||
} else {
|
||
Write-Output "✘ MpCmdRun.exe not found and Update-MpSignature failed."
|
||
}
|
||
}
|
||
|
||
Show-Status
|
||
}
|
||
|
||
"Repair definitions and update" {
|
||
if (-not (Is-Admin)) {
|
||
Write-Output "✘ Please run this action as Administrator (required to reset definitions)."
|
||
break
|
||
}
|
||
|
||
$mp = Get-MpCmdPath
|
||
if (-not $mp) {
|
||
Write-Output "✘ MpCmdRun.exe not found."
|
||
break
|
||
}
|
||
|
||
try {
|
||
Write-Output "↻ Removing all definitions (repair) ..."
|
||
& $mp -RemoveDefinitions -All | Out-String | Write-Output
|
||
} catch {
|
||
Write-Output "✘ Failed to remove definitions: $($_.Exception.Message)"
|
||
}
|
||
|
||
try {
|
||
Write-Output "↻ Updating signatures ..."
|
||
Update-MpSignature -ErrorAction Stop
|
||
Write-Output "✔ Signatures updated."
|
||
} catch {
|
||
Write-Output "↻ Fallback: MpCmdRun signature update ..."
|
||
& $mp -SignatureUpdate | Out-String | Write-Output
|
||
}
|
||
|
||
Show-Status
|
||
}
|
||
|
||
"Show Defender status" {
|
||
Show-Status
|
||
}
|
||
|
||
default {
|
||
Write-Output "✘ Unknown option: $choice"
|
||
}
|
||
}
|