Gestire Microsoft Defender Antivirus con PowerShell: cmdlet pratici per sysadmin
Microsoft Defender Antivirus è il componente di sicurezza integrato in Windows 10, Windows 11 e Windows Server 2016 e successivi. Spesso gestito tramite interfaccia grafica o Group Policy, offre però un set completo di cmdlet PowerShell che permettono una gestione programmatica potente, particolarmente utile in ambienti server headless, pipeline di automazione e script di provisioning.
In questo articolo esploriamo i cmdlet principali, con esempi pratici di utilizzo per la gestione quotidiana da parte di amministratori di sistema.
Prerequisiti e Accesso
I cmdlet di Defender sono disponibili per impostazione predefinita su Windows 10/11 e Windows Server 2016+. Per usarli è necessario aprire PowerShell come amministratore.
# Verifica che il modulo Defender sia disponibile
Get-Module -ListAvailable -Name Defender
# Per visualizzare la documentazione completa di qualsiasi cmdlet
Get-Help <cmdlet> -Online
Nota importante: le modifiche apportate via PowerShell agiscono sulle impostazioni locali del dispositivo. Politiche distribuite tramite Microsoft Intune, Group Policy o Configuration Manager possono sovrascriverle. Pianificare di conseguenza nelle architetture gestite centralmente.
Verificare lo Stato della Protezione
Il punto di partenza è sempre capire in che stato si trova il sistema.
# Stato complessivo di Defender Antivirus
Get-MpComputerStatus
# Output selettivo: solo i campi più rilevanti
Get-MpComputerStatus | Select-Object `
AntivirusEnabled, `
RealTimeProtectionEnabled, `
BehaviorMonitorEnabled, `
IoavProtectionEnabled, `
NISEnabled, `
QuickScanAge, `
FullScanAge, `
AntivirusSignatureLastUpdated, `
AntivirusSignatureVersion
QuickScanAge e FullScanAge indicano da quanti giorni non viene eseguita una scansione rapida o completa. Un valore molto alto può indicare un problema di pianificazione. AntivirusSignatureLastUpdated è critico: firme obsolete riducono drasticamente l’efficacia della protezione.
Configurare le Preferenze con Set-MpPreference
Set-MpPreference è il cmdlet centrale per la configurazione. Permette di intervenire su centinaia di parametri.
Protezione in Tempo Reale
# Abilitare la protezione in tempo reale (default: abilitata)
Set-MpPreference -DisableRealtimeMonitoring $false
# Abilitare il monitoraggio comportamentale
Set-MpPreference -DisableBehaviorMonitoring $false
# Abilitare la protezione cloud-delivered (MAPS)
Set-MpPreference -MAPSReporting Advanced
Set-MpPreference -SubmitSamplesConsent SendAllSamples
Gestire le Esclusioni
Le esclusioni sono necessarie in ambienti dove certi processi o directory generano falsi positivi, ma vanno gestite con attenzione: sono uno dei vettori sfruttati dagli attaccanti (come visto nel caso TonRAT).
# Aggiungere un percorso alle esclusioni
Add-MpPreference -ExclusionPath "C:\AppData\MyApp\cache"
# Aggiungere un processo alle esclusioni
Add-MpPreference -ExclusionProcess "msbuild.exe"
# Aggiungere un’estensione file alle esclusioni
Add-MpPreference -ExclusionExtension ".log"
# Verificare le esclusioni configurate
Get-MpPreference | Select-Object ExclusionPath, ExclusionProcess, ExclusionExtension
# Rimuovere una singola esclusione
Remove-MpPreference -ExclusionPath "C:\AppData\MyApp\cache"
Best practice: documentare ogni esclusione con il motivo tecnico e revisionarle periodicamente. Un’esclusione dimenticata è una superficie di attacco aperta.
Pianificazione delle Scansioni
# Impostare una scansione rapida giornaliera alle 03:00
Set-MpPreference -ScanScheduleDay Everyday
Set-MpPreference -ScanScheduleTime 03:00:00
# Impostare una scansione completa settimanale alla domenica alle 02:00
Set-MpPreference -ScanParameters FullScan
Set-MpPreference -ScanScheduleDay Sunday
Set-MpPreference -ScanScheduleTime 02:00:00
# Abilitare la scansione dei file email e degli archivi compressi
Set-MpPreference -DisableEmailScanning $false
Set-MpPreference -DisableArchiveScanning $false
Aggiornare le Definizioni Antivirus
# Aggiornare le signature immediatamente
Update-MpSignature
# Aggiornare da un percorso UNC condiviso (es. WSUS o share locale)
Update-MpSignature -UpdateSource InternalDefinitionUpdateServer
# Verificare la versione corrente delle signature
(Get-MpComputerStatus).AntivirusSignatureVersion
(Get-MpComputerStatus).AntivirusSignatureLastUpdated
In ambienti con dispositivi offline o in reti segmentate, la distribuzione delle signature tramite share UNC o WSUS è essenziale. Update-MpSignature supporta diversi source: MicrosoftUpdateServer, MMPC, InternalDefinitionUpdateServer, FileShares.
Avviare Scansioni Manuali
# Scansione rapida
Start-MpScan -ScanType QuickScan
# Scansione completa
Start-MpScan -ScanType FullScan
# Scansione di un percorso specifico (custom scan)
Start-MpScan -ScanType CustomScan -ScanPath "D:\Downloads"
# Avviare in modo asincrono (non blocca la shell)
Start-MpScan -ScanType QuickScan -AsJob
Rilevare e Gestire le Minacce
# Visualizzare le minacce rilevate attualmente attive
Get-MpThreat
# Visualizzare lo storico delle rilevazioni (incluse quelle già gestite)
Get-MpThreatDetection
# Output dettagliato di una singola minaccia per ID
Get-MpThreat | Where-Object { $_.ThreatID -eq 12345 } | Format-List *
# Rimuovere tutte le minacce attive in quarantena
Remove-MpThreat
Performance Analyzer: Individuare i Colli di Bottiglia
Se Defender causa rallentamenti, il Performance Analyzer integrato aiuta a identificare quali file, processi o estensioni impattano maggiormente sui tempi di scansione:
# Avviare la raccolta dati per 60 secondi
New-MpPerformanceRecording -RecordTo "C:\Temp\DefenderPerf.etl"
# Analizzare i risultati: top 10 file più lenti da scansionare
Get-MpPerformanceReport -Path "C:\Temp\DefenderPerf.etl" `
-TopFiles 10 `
-TopScansPerFile 5 `
-TopProcessesPerFile 5
Automazione: Script di Audit Difensivo
Uno script di audit rapido da eseguire periodicamente su ogni macchina o tramite PSRemoting su più host:
function Get-DefenderAudit {
$status = Get-MpComputerStatus
$prefs = Get-MpPreference
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
AVEnabled = $status.AntivirusEnabled
RealTimeProtection = $status.RealTimeProtectionEnabled
SignatureAge_Days = ((Get-Date) - $status.AntivirusSignatureLastUpdated).Days
SignatureVersion = $status.AntivirusSignatureVersion
LastQuickScan_Days = $status.QuickScanAge
LastFullScan_Days = $status.FullScanAge
ExclusionPathCount = @($prefs.ExclusionPath).Count
ExclusionProcessCount = @($prefs.ExclusionProcess).Count
CloudProtection = $prefs.MAPSReporting
}
}
# Esecuzione locale
Get-DefenderAudit | Format-List
# Esecuzione remota su più host
$servers = @("SRV01", "SRV02", "SRV03")
Invoke-Command -ComputerName $servers -ScriptBlock ${Function:Get-DefenderAudit} |
Sort-Object SignatureAge_Days -Descending |
Format-Table -AutoSize
Conclusione
I cmdlet PowerShell di Microsoft Defender Antivirus offrono un controllo granulare e scriptabile su ogni aspetto della protezione, rendendoli uno strumento fondamentale per i sysadmin che gestiscono flotte di macchine Windows. Integrarli in pipeline di provisioning, script di audit periodici e runbook di incident response è una pratica che migliora significativamente la postura di sicurezza senza dipendere da interfacce grafiche.
Ricorda: le modifiche via PowerShell sono locali e possono essere sovrascritte da GPO o Intune. In ambienti gestiti centralmente, usa PowerShell per audit e diagnostica, e riserva la configurazione permanente agli strumenti di management centralizzato.
Fonte: 4sysops.com | Documentazione ufficiale: Microsoft Learn
Microsoft Defender Antivirus provides a robust set of PowerShell cmdlets for managing security features on Windows 10, Windows 11, and Windows Server 2016 or la
IT News (4sysops)
Ray McCarthy
in reply to Free Software Foundation Europe • • •I've designed both audio & RF in the day job. Also design & install of studio & PA gear.
This is over complicated mechanically, electrically and software.
Stereo is pointless in a box that size.
Should use a generic speaker.
A simple 2 layer PCB with a 1/10th of the PCB parts is possible.
Material is not eco-friendly or acoustically good.
Open source in this case is irrelevant as there are far better starting points to do your own. Not worth copying, so safe to Open Source!