Windows Defender yönetimini GUI üzerinden yapmak başlangıçta mantıklı görünse de, onlarca sunucuyu veya iş istasyonunu yönetmek zorunda kaldığınızda bu yaklaşım hızla işkenceye dönüşür. PowerShell ile Defender’ı yönetmek hem zaman kazandırır hem de tutarlı bir yapılandırma sağlar. Bu yazıda gerçek dünya senaryoları üzerinden PowerShell ile Windows Defender yönetimini ele alacağız.
Temel Kavramlar ve Modül Yapısı
Windows Defender, PowerShell tarafında Defender modülü üzerinden yönetilir. Windows 10, Windows 11 ve Windows Server 2016 sonrası sistemlerde bu modül varsayılan olarak gelir. Çalışmaya başlamadan önce modülün mevcut olduğunu doğrulayalım:
# Modülün varlığını kontrol et
Get-Module -Name Defender -ListAvailable
# Modülü manuel olarak yükle (genellikle gerek kalmaz)
Import-Module Defender
# Mevcut tüm Defender komutlarını listele
Get-Command -Module Defender
Bu komutları çalıştırdığınızda Set-MpPreference, Get-MpPreference, Start-MpScan, Update-MpSignature gibi onlarca cmdlet göreceksiniz. Bu cmdlet’lerin her biri Defender’ın farklı bir yönünü kontrol eder.
Önemli bir not: Defender yönetim komutlarının büyük çoğunluğu yönetici yetkisi gerektirir. PowerShell’i her zaman “Run as Administrator” ile açın ya da script’lerinizin başına yetki kontrolü ekleyin.
# Yetki kontrolü - script başına ekleyin
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Warning "Bu script yonetici yetkisiyle calistirilmalidir!"
Exit 1
}
Write-Host "Yonetici yetkisi onaylandi, devam ediliyor..." -ForegroundColor Green
Defender Durumunu Okumak
Bir sistemde Defender’ın mevcut durumunu anlamak, yönetimin ilk adımıdır. Get-MpComputerStatus cmdlet’i size genel durumu verir:
# Genel Defender durumunu al
$defenderStatus = Get-MpComputerStatus
# Önemli bilgileri ekrana yazdır
Write-Host "=== Windows Defender Durum Raporu ===" -ForegroundColor Cyan
Write-Host "Antivirus Aktif: $($defenderStatus.AntivirusEnabled)"
Write-Host "Real-Time Koruma: $($defenderStatus.RealTimeProtectionEnabled)"
Write-Host "Son Tarama Tarihi: $($defenderStatus.QuickScanAge) gun once"
Write-Host "Son Imza Guncelleme: $($defenderStatus.AntivirusSignatureLastUpdated)"
Write-Host "Imza Versiyonu: $($defenderStatus.AntivirusSignatureVersion)"
Write-Host "Tam Tarama Gereklimi: $($defenderStatus.FullScanRequired)"
Write-Host "NIS Aktif: $($defenderStatus.NISEnabled)"
Write-Host "Bulut Koruma: $($defenderStatus.IsTamperProtected)"
Bu çıktıyı düzenli olarak bir log dosyasına kaydetmek, ileride sorun çıktığında referans almanızı sağlar. Özellikle “AntivirusSignatureLastUpdated” değerinin birkaç günden eski olması ciddi bir uyarı işaretidir.
Gerçek Zamanlı Koruma Yönetimi
Real-time protection, Defender’ın en kritik özelliğidir. Bazı durumlarda geçici olarak kapatmanız gerekebilir; örneğin büyük bir yazılım kurulumu sırasında veya performans testleri yaparken. Ancak bunu her zaman kontrollü ve zamanlanmış şekilde yapın:
# Real-time korumayı devre dışı bırak (dikkatli kullanın!)
Set-MpPreference -DisableRealtimeMonitoring $true
Write-Warning "Real-time koruma DEVRE DISI! Isleminizi tamamladiktan sonra tekrar aktif edin."
# 5 dakika sonra otomatik olarak tekrar aktif et
Start-Sleep -Seconds 300
Set-MpPreference -DisableRealtimeMonitoring $false
Write-Host "Real-time koruma yeniden AKTIF edildi." -ForegroundColor Green
# Mevcut durumu doğrula
$status = Get-MpComputerStatus
Write-Host "Real-Time Koruma Durumu: $($status.RealTimeProtectionEnabled)"
Üretim ortamında bu komutu asla manuel çalıştırmayın. Her zaman bir zaman sınırı koyun ve işlem bittikten sonra korumayı geri açtığınızı doğrulayın.
İmza Güncellemeleri ve Otomasyonu
İmza güncellemeleri Defender’ın etkinliği için hayati önem taşır. Özellikle internet bağlantısı kısıtlı sunucularda veya WSUS kullanan ortamlarda bu güncellemeleri manuel olarak tetiklemek gerekebilir:
# İmza güncellemesini başlat ve sonucu raporla
function Update-DefenderSignatures {
param(
[string]$ComputerName = $env:COMPUTERNAME,
[switch]$Verbose
)
Write-Host "[$ComputerName] Imza guncellemesi baslatiliyor..." -ForegroundColor Yellow
$oncekiVersiyon = (Get-MpComputerStatus).AntivirusSignatureVersion
try {
Update-MpSignature -ErrorAction Stop
# Güncellemenin tamamlanması için bekle
Start-Sleep -Seconds 30
$yeniVersiyon = (Get-MpComputerStatus).AntivirusSignatureVersion
$guncellemeTarihi = (Get-MpComputerStatus).AntivirusSignatureLastUpdated
if ($oncekiVersiyon -ne $yeniVersiyon) {
Write-Host "[$ComputerName] Guncelleme BASARILI!" -ForegroundColor Green
Write-Host " Eski Versiyon: $oncekiVersiyon"
Write-Host " Yeni Versiyon: $yeniVersiyon"
Write-Host " Guncelleme Tarihi: $guncellemeTarihi"
} else {
Write-Host "[$ComputerName] Imzalar zaten guncel. Versiyon: $yeniVersiyon" -ForegroundColor Cyan
}
return $true
} catch {
Write-Error "[$ComputerName] Guncelleme BASARISIZ: $($_.Exception.Message)"
return $false
}
}
# Fonksiyonu çalıştır
Update-DefenderSignatures -Verbose
Bu fonksiyonu bir scheduled task’a bağlayarak her gece otomatik imza güncellemesi yapabilirsiniz. Özellikle domain ortamlarında uzak sistemlere de Invoke-Command ile uygulayabilirsiniz.
Tarama İşlemleri
Defender üç ana tarama tipi sunar: Quick Scan, Full Scan ve Custom Scan. Her birinin kullanım senaryosu farklıdır:
# Hızlı tarama başlat
Start-MpScan -ScanType QuickScan
Write-Host "Hizli tarama baslatildi."
# Tam tarama başlat (arka planda çalışır)
Start-MpScan -ScanType FullScan
Write-Host "Tam tarama baslatildi. Bu islem uzun surebilir."
# Belirli bir dizini tara
Start-MpScan -ScanType CustomScan -ScanPath "C:Downloads"
Write-Host "C:Downloads dizini taranıyor."
# Tarama durumunu takip et
function Watch-MpScan {
Write-Host "Tarama izleniyor..." -ForegroundColor Yellow
do {
$scanStatus = Get-MpComputerStatus
$devamEdiyor = $scanStatus.QuickScanRunning -or $scanStatus.FullScanRunning
if ($devamEdiyor) {
$tip = if ($scanStatus.QuickScanRunning) { "Hizli Tarama" } else { "Tam Tarama" }
Write-Host "[$tip] Devam ediyor... $(Get-Date -Format 'HH:mm:ss')" -ForegroundColor Yellow
Start-Sleep -Seconds 10
}
} while ($devamEdiyor)
Write-Host "Tarama tamamlandi!" -ForegroundColor Green
# Sonuçları göster
$tehditler = Get-MpThreatDetection
if ($tehditler) {
Write-Warning "DIKKAT: $($tehditler.Count) tehdit bulundu!"
$tehditler | Select-Object ThreatID, InitialDetectionTime, RemediationTime, ActionSuccess | Format-List
} else {
Write-Host "Tehdit bulunamadi. Sistem temiz." -ForegroundColor Green
}
}
Watch-MpScan
Exclusion (Dışlama) Yönetimi
SQL Server, Exchange, Hyper-V gibi sunucu rolleri kurduğunuzda Defender’a dışlamalar eklemeniz gerekir. Aksi halde performans sorunları ve yanlış pozitifler yaşarsınız. Ancak bu dışlamaları rastgele eklemek güvenlik açığı yaratır:
# SQL Server için önerilen dışlamalar
function Add-SqlServerExclusions {
param([string]$SqlInstancePath = "C:Program FilesMicrosoft SQL Server")
Write-Host "SQL Server dışlamaları ekleniyor..." -ForegroundColor Yellow
# Dizin dışlamaları
$dizinler = @(
"$SqlInstancePath",
"C:WindowsSysWOW64",
"C:WindowsSystem32"
)
# Dosya uzantısı dışlamaları
$uzantilar = @(".mdf", ".ldf", ".ndf", ".bak", ".trn")
# İşlem dışlamaları
$islemler = @(
"sqlservr.exe",
"sqlwriter.exe",
"sqlagent.exe",
"msmdsrv.exe"
)
foreach ($dizin in $dizinler) {
Add-MpPreference -ExclusionPath $dizin
Write-Host " Dizin eklendi: $dizin"
}
foreach ($uzanti in $uzantilar) {
Add-MpPreference -ExclusionExtension $uzanti
Write-Host " Uzanti eklendi: $uzanti"
}
foreach ($islem in $islemler) {
Add-MpPreference -ExclusionProcess $islem
Write-Host " Islem eklendi: $islem"
}
Write-Host "SQL Server dışlamaları tamamlandi." -ForegroundColor Green
}
# Mevcut dışlamaları listele
function Get-AllExclusions {
$tercihler = Get-MpPreference
Write-Host "=== Mevcut Dışlamalar ===" -ForegroundColor Cyan
Write-Host "`nDizin Dışlamaları:" -ForegroundColor Yellow
$tercihler.ExclusionPath | ForEach-Object { Write-Host " - $_" }
Write-Host "`nUzantı Dışlamaları:" -ForegroundColor Yellow
$tercihler.ExclusionExtension | ForEach-Object { Write-Host " - $_" }
Write-Host "`nİşlem Dışlamaları:" -ForegroundColor Yellow
$tercihler.ExclusionProcess | ForEach-Object { Write-Host " - $_" }
}
# Belirli bir dışlamayı kaldır
Remove-MpPreference -ExclusionPath "C:GeciciKlasor"
Write-Host "Dışlama kaldirildi."
Add-SqlServerExclusions
Get-AllExclusions
Dışlama eklerken dikkat edin: Tüm C: sürücüsünü veya Windows sistem dizinlerini dışlama listesine atmak ciddi güvenlik riskleri doğurur. Mümkün olduğunca dar kapsamlı dışlamalar kullanın.
Tehdit Geçmişi ve Raporlama
Defender’ın tespit ettiği tehditler hakkında düzenli rapor almak, güvenlik durumunuzu anlamanıza yardımcı olur:
# Tehdit geçmişi raporu oluştur
function Get-ThreatReport {
param(
[int]$SonKacGun = 30,
[string]$RaporDosyasi = "C:LogsDefenderReport_$(Get-Date -Format 'yyyyMMdd').txt"
)
# Log klasörünü oluştur
$logKlasoru = Split-Path $RaporDosyasi
if (-not (Test-Path $logKlasoru)) {
New-Item -ItemType Directory -Path $logKlasoru -Force | Out-Null
}
$baslangicTarihi = (Get-Date).AddDays(-$SonKacGun)
# Tespit edilen tehditleri al
$tehditler = Get-MpThreatDetection | Where-Object {
$_.InitialDetectionTime -ge $baslangicTarihi
}
# Tehdit detaylarını al
$tehditDetaylari = Get-MpThreat
# Rapor içeriği
$rapor = @"
Windows Defender Tehdit Raporu
Rapor Tarihi: $(Get-Date -Format 'dd.MM.yyyy HH:mm:ss')
Bilgisayar: $env:COMPUTERNAME
Raporlanan Donem: Son $SonKacGun gun
Defender Versiyonu: $((Get-MpComputerStatus).AntivirusSignatureVersion)
========================================
Toplam Tespit Sayisi: $($tehditler.Count)
"@
if ($tehditler.Count -gt 0) {
$rapor += "TESPIT DETAYLARI:`n"
foreach ($tehdit in $tehditler) {
$detay = $tehditDetaylari | Where-Object { $_.ThreatID -eq $tehdit.ThreatID } | Select-Object -First 1
$rapor += @"
---
Tehdit ID : $($tehdit.ThreatID)
Tespit Tarihi: $($tehdit.InitialDetectionTime)
Islem : $($tehdit.ActionSuccess)
Dosya : $($tehdit.Resources -join ', ')
"@
}
} else {
$rapor += "Belirtilen donemde tehdit tespit edilmedi.`n"
}
# Raporu dosyaya yaz
$rapor | Out-File -FilePath $RaporDosyasi -Encoding UTF8
Write-Host "Rapor olusturuldu: $RaporDosyasi" -ForegroundColor Green
# Özeti ekranda göster
Write-Host "`nOzet: $($tehditler.Count) tehdit tespit edildi (son $SonKacGun gun)" -ForegroundColor Cyan
return $RaporDosyasi
}
Get-ThreatReport -SonKacGun 7
Çoklu Sunucu Yönetimi
Gerçek ortamlarda onlarca veya yüzlerce Windows sunucusu yönetmek gerekir. PowerShell Remoting ile bu işi merkezileştirebilirsiniz:
# Birden fazla sunucuda Defender durumunu kontrol et
function Get-RemoteDefenderStatus {
param(
[string[]]$Sunucular,
[System.Management.Automation.PSCredential]$Credential
)
$sonuclar = @()
foreach ($sunucu in $Sunucular) {
Write-Host "[$sunucu] Kontrol ediliyor..." -ForegroundColor Yellow
try {
$scriptBlock = {
$durum = Get-MpComputerStatus
[PSCustomObject]@{
Bilgisayar = $env:COMPUTERNAME
AntivirusAktif = $durum.AntivirusEnabled
RealTimeKoruma = $durum.RealTimeProtectionEnabled
ImzaVersiyonu = $durum.AntivirusSignatureVersion
SonGuncelleme = $durum.AntivirusSignatureLastUpdated
SonHizliTarama = $durum.QuickScanAge
TamTaramaGerekli = $durum.FullScanRequired
BulutKoruma = $durum.MAPSReporting
}
}
$params = @{
ComputerName = $sunucu
ScriptBlock = $scriptBlock
ErrorAction = 'Stop'
}
if ($Credential) { $params.Credential = $Credential }
$sonuc = Invoke-Command @params
$sonuclar += $sonuc
Write-Host " [$sunucu] OK - Imza: $($sonuc.ImzaVersiyonu)" -ForegroundColor Green
} catch {
Write-Warning "[$sunucu] Baglanti hatasi: $($_.Exception.Message)"
$sonuclar += [PSCustomObject]@{
Bilgisayar = $sunucu
AntivirusAktif = "HATA"
RealTimeKoruma = "HATA"
ImzaVersiyonu = "HATA"
SonGuncelleme = "HATA"
SonHizliTarama = "HATA"
TamTaramaGerekli = "HATA"
BulutKoruma = "HATA"
}
}
}
return $sonuclar
}
# Örnek kullanım
$sunucuListesi = @("WEBSRV01", "WEBSRV02", "DBSRV01", "FILESRV01")
$defenderDurumu = Get-RemoteDefenderStatus -Sunucular $sunucuListesi
# Sorunlu sunucuları filtrele
$sorunluSunucular = $defenderDurumu | Where-Object {
$_.AntivirusAktif -ne $true -or
$_.RealTimeKoruma -ne $true -or
$_.AntivirusAktif -eq "HATA"
}
if ($sorunluSunucular) {
Write-Warning "DIKKAT: $($sorunluSunucular.Count) sorunlu sunucu tespit edildi!"
$sorunluSunucular | Select-Object Bilgisayar, AntivirusAktif, RealTimeKoruma | Format-List
}
Saldırı Yüzeyini Azaltma (ASR) Kuralları
Windows Defender’ın en güçlü özelliklerinden biri olan Attack Surface Reduction (ASR) kuralları, ransomware ve diğer gelişmiş tehditlere karşı ek bir koruma katmanı sağlar:
# ASR kurallarını yapılandır
function Set-ASRRules {
param(
[ValidateSet("AuditMode", "BlockMode", "Disable")]
[string]$Mod = "AuditMode"
)
# Mod değerlerini Defender'ın beklediği formata çevir
$modDeger = switch ($Mod) {
"AuditMode" { 2 }
"BlockMode" { 1 }
"Disable" { 0 }
}
Write-Host "ASR kuralları '$Mod' modunda yapılandırılıyor..." -ForegroundColor Yellow
# Kritik ASR kural GUID'leri
$asrKurallari = @{
"Office makrolarinden process olusturmayi engelle" = "D4F940AB-401B-4EFC-AADC-AD5F3C50688A"
"Office uygulamalarinin kod enjeksiyonunu engelle" = "75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84"
"Credential calmaya karsi koruma" = "9E6C4E1F-7D60-472F-BA1A-A39EF669E4B2"
"Ransomware koruması" = "C1DB55AB-C21A-4637-BB3F-A12568109D35"
"Script obfuscation engelleme" = "5BEB7EFE-FD9A-4556-801D-275E5FFC04CC"
"Email yoluyla gelen executable engelleme" = "BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550"
"Guvensiz signed driver engelleme" = "56a863a9-875e-4185-98a7-b882c64b5ce5"
}
foreach ($kural in $asrKurallari.GetEnumerator()) {
try {
Add-MpPreference -AttackSurfaceReductionRules_Ids $kural.Value -AttackSurfaceReductionRules_Actions $modDeger
Write-Host " OK: $($kural.Key)" -ForegroundColor Green
} catch {
Write-Warning " HATA: $($kural.Key) - $($_.Exception.Message)"
}
}
Write-Host "`nASR kural yapılandırması tamamlandi." -ForegroundColor Green
Write-Host "Not: Once AuditMode ile test edin, sonra BlockMode'a gecin!" -ForegroundColor Yellow
}
# Önce audit mode ile test et
Set-ASRRules -Mod "AuditMode"
ASR kurallarını doğrudan BlockMode’da uygulamak üretim ortamında sorunlara yol açabilir. Önce AuditMode ile birkaç gün çalıştırın, Event Viewer’da 1121 ve 1122 event ID’lerini izleyin, gerekli dışlamaları ekleyin, sonra BlockMode’a geçin.
Defender Servisini İzleme ve Otomatik Kurtarma
Bazen Defender servisi beklenmedik şekilde durabiliyor. Özellikle üçüncü parti güvenlik yazılımlarının kurulumu veya kaldırılması sonrasında bu durumla karşılaşabilirsiniz:
# Defender servis durumunu kontrol et ve gerekirse başlat
function Ensure-DefenderRunning {
$servisler = @(
@{ Ad = "WdNisSvc"; Aciklama = "Network Inspection Service" },
@{ Ad = "WinDefend"; Aciklama = "Windows Defender Antivirus" },
@{ Ad = "Sense"; Aciklama = "Windows Defender Advanced Threat Protection" }
)
foreach ($servis in $servisler) {
$durumu = Get-Service -Name $servis.Ad -ErrorAction SilentlyContinue
if ($durumu -eq $null) {
Write-Warning "$($servis.Aciklama) servisi sistemde bulunamadi."
continue
}
if ($durumu.Status -ne 'Running') {
Write-Warning "$($servis.Aciklama) servisi durdu. Baslatiliyor..."
try {
Start-Service -Name $servis.Ad -ErrorAction Stop
Write-Host "$($servis.Aciklama) basarıyla baslatildi." -ForegroundColor Green
} catch {
Write-Error "$($servis.Aciklama) baslatilamadi: $($_.Exception.Message)"
}
} else {
Write-Host "$($servis.Aciklama): Calisiyor" -ForegroundColor Green
}
}
}
Ensure-DefenderRunning
Bu fonksiyonu scheduled task olarak her 15 dakikada bir çalıştırabilirsiniz. Defender’ın kapalı kaldığı süreyi minimize etmek için otomatik iyileştirme akışları kritik önem taşır.
Önemli Parametreler ve Ayarlar
Set-MpPreference ile yapılabilecek kritik yapılandırmaların özeti:
- -DisableRealtimeMonitoring: Gerçek zamanlı korumayı devre dışı bırakır.
$trueveya$false - -DisableBehaviorMonitoring: Davranış izlemeyi kapatır, performans kritik ortamlarda kullanılabilir
- -DisableIOAVProtection: İndirilen dosyaların taranmasını devre dışı bırakır
- -CloudBlockLevel: Bulut tabanlı engelleme seviyesi. 0’dan 6’ya kadar değer alır
- -EnableNetworkProtection: Ağ korumasını aktif eder. 1: Enabled, 2: AuditMode
- -MAPSReporting: Microsoft Active Protection Service raporlama seviyesi
- -ScanScheduleQuickScanTime: Günlük hızlı taramanın saatini belirler
- -ScanAvgCPULoadFactor: Tarama sırasında kullanılacak maksimum CPU yüzdesi (1-100)
- -ExclusionPath: Dışlanacak dizin yolu ekler
- -ExclusionExtension: Dışlanacak dosya uzantısı ekler
- -ExclusionProcess: Dışlanacak işlem (exe) ekler
Sonuç
PowerShell ile Windows Defender yönetimi, özellikle büyük ölçekli ortamlarda vazgeçilmez bir beceri haline gelmiştir. Bu yazıda ele aldığımız konuları özetleyecek olursak:
- Defender durumunu okumak ve izlemek için
Get-MpComputerStatustemel araçtır - İmza güncellemelerini script ile otomatikleştirin, eski imzalar sizi savunmasız bırakır
- Dışlamaları eklerken mümkün olduğunca dar kapsamlı tutun
- ASR kurallarını önce Audit Mode’da test edin, BlockMode’a acele etmeyin
- Çoklu sunucu ortamlarında PowerShell Remoting ile merkezi yönetim yapın
- Defender servislerini izleyin ve otomatik kurtarma mekanizmaları kurun
Defender’ı PowerShell ile yönetmek başta karmaşık görünse de, bir kez doğru script’leri oluşturduğunuzda hem güvenlik seviyenizi artırır hem de yönetim yükünüzü önemli ölçüde azaltırsınız. Kodlarınızı versiyon kontrolüne alın, test ortamında deneyin ve değişiklikleri üretim ortamına aşamalı olarak uygulayın.