İçeriğe geç
Yeni yazı çıkınca e-posta · 4.812 abone 244 rehber · 102 ipucu · 82 komut RSS GitHub LinkedIn İletişim
Ara Ctrl K Bültene katıl
Tüm arşiv · 244 rehber →
Tüm araçlar · 75 üreteç →
Araçlar

Komut kütüphanesi

Sahada denenmiş komutlar. Her birinin ne yaptığı ve nerede patlayabileceği yazıyor — kopyalayın, ama uyarıyı okumadan çalıştırmayın.

82 komut 26 konu
Windows Server sertifikapkiizleme

45 gün içinde süresi dolacak sertifikalar

Yenileme takvimi kimsenin ajandasında değilse makinenin kendisine sorun.

Get-ChildItem Cert:\LocalMachine\My |
  Where-Object { $_.NotAfter -lt (Get-Date).AddDays(45) } |
  Select-Object Subject, NotAfter, Thumbprint | Sort-Object NotAfter

Yalnızca makine deposuna bakar. IIS bağlamaları, uygulama havuzları ve hizmet hesaplarının kişisel depoları ayrı yerlerdedir.

PowerShell active-directoryraporlama

90 gündür giriş yapmayan etkin hesaplar

Pasif kullanıcı hesaplarını bulup CSV'ye döker; yeni açılmış hesapları listeye almaz.

$sinir = (Get-Date).AddDays(-90)
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly |
  Get-ADUser -Properties LastLogonDate, whenCreated, Enabled |
  Where-Object { $_.Enabled -and $_.whenCreated -lt $sinir } |
  Export-Csv '.\pasif-hesaplar.csv' -NoTypeInformation -Encoding UTF8

LastLogonDate 9–14 gün gecikmeyle eşitlenir; sınırı 30 günün altına indirmeyin.

Ayrıntılı rehberi oku →
Güvenlik & Entra ID dnsepostakimlik-avi

Alan adının SPF, DKIM ve DMARC kayıtları

E-posta sahteciliğine karşı üç kaydın da olması gerekir; biri eksikse diğer ikisi tek başına yetmez.

$alan = 'ornek.com'
Resolve-DnsName $alan -Type TXT | Where-Object Strings -match 'v=spf1' | Select-Object -Expand Strings
Resolve-DnsName "_dmarc.$alan" -Type TXT | Select-Object -Expand Strings
Resolve-DnsName "selector1._domainkey.$alan" -Type CNAME, TXT -ErrorAction SilentlyContinue

DMARC'ta p=none yalnızca rapor toplar, hiçbir mesajı durdurmaz. Kurumların çoğu yıllarca p=none'da kalır ve korunduğunu sanır.

Altyapı Otomasyonu ansibleiac

Ansible: hangi sunucular hedeften sapmış?

Kuru çalıştırma ile değişecek makineleri listeler; uygulamadan önce kapsamı gösterir.

ansible-playbook site.yml --check --diff |
  awk '/^changed:/ {print $2}' | tr -d '[]' | sort -u

Kuru çalıştırma bazı modüllerde yanlış "değişecek" der (özellikle command/shell). `changed_when` tanımlayın.

Microsoft 365 m365teamsyonetisim

Aylardır kullanılmayan Teams ekipleri

Son etkinliğe göre sıralar; yönetişim temizliğinin başlangıç noktası.

Connect-MgGraph -Scopes Reports.Read.All
Get-MgReportTeamActivityDetail -Period D90 -OutFile teams-90.csv
Import-Csv teams-90.csv |
  Where-Object { [int]$_.'Active Users' -eq 0 } |
  Select-Object 'Team Name', 'Last Activity Date' |
  Sort-Object 'Last Activity Date'

Rapor verisi anonimleştirilmiş olabilir: Microsoft 365 yönetim merkezinde "gizlilik" ayarını kapatmadan ad sütunu boş gelir.

ITSM itsmraporlama

Aynı kullanıcıdan tekrar eden çağrılar

Otuz günde üçten fazla çağrı açan kullanıcıları sayar — çözülmemiş kök neden işareti.

Import-Csv .\cagrilar.csv |
  Where-Object { [datetime]$_.Tarih -gt (Get-Date).AddDays(-30) } |
  Group-Object Kullanici |
  Where-Object Count -gt 3 |
  Sort-Object Count -Descending |
  Select-Object Count, Name

CSV sütun adlarını kendi sisteminize göre düzeltin; tarih biçimi yerel ayara duyarlıdır.

Linux Sunucu linuxsystemd

Başarısız systemd servisleri ve son hataları

Hangi servisin düştüğünü ve düşerken ne yazdığını tek çıktıda verir.

systemctl --failed --no-legend | awk '{print $1}' | while read -r s; do
  echo "=== $s"
  journalctl -u "$s" -n 5 --no-pager -p err
done

journalctl kalıcı değilse yeniden başlatma sonrası geçmiş kaybolur: `Storage=persistent`.

Linux Sunucu linuxperformans

Belleği en çok tüketen on süreç

RSS değerine göre sıralar; OOM killer devreye girmeden önce bakılacak yer.

ps -eo pid,user,rss,pmem,comm --sort=-rss | head -11

RSS paylaşılan belleği çift sayar; birden çok süreç aynı kütüphaneyi kullanıyorsa toplam abartılı görünür.

AWS maliyetyedeklemeebs

Bir yıldan eski EBS anlık görüntüleri

Yedek politikası yazılırken kimse eski anlık görüntüleri silmeyi yazmaz; depolama faturası onları hatırlatır.

aws ec2 describe-snapshots --owner-ids self \
  --query "Snapshots[?StartTime<='2025-08-01'].{Id:SnapshotId, GB:VolumeSize, Tarih:StartTime, Not:Description}" \
  --output table

AMI'lerin dayandığı anlık görüntüleri silmeyin; önce describe-images ile hangi görüntünün hangi anlık görüntüye bağlı olduğunu çıkarın.

Veritabanı postgresqltanilama

Birbirini bekleyen PostgreSQL sorguları

Kilit zincirini, engelleyen ve engellenen sorguyla birlikte gösterir.

SELECT bekleyen.pid AS bekleyen_pid, bekleyen.query AS bekleyen_sorgu,
       engelleyen.pid AS engelleyen_pid, engelleyen.query AS engelleyen_sorgu
FROM pg_stat_activity bekleyen
JOIN pg_stat_activity engelleyen
  ON engelleyen.pid = ANY(pg_blocking_pids(bekleyen.pid))
WHERE cardinality(pg_blocking_pids(bekleyen.pid)) > 0;

Engelleyeni sonlandırmadan önce ne yaptığına bakın; uzun süren bir bakım işi olabilir.

Windows İstemci bitlockersifrelemekurtarma

BitLocker açık ama kurtarma anahtarı yedeklendi mi?

Şifreleme durumu ile anahtarın yedeği ayrı sorulardır. İkincisi olmadan disk şifreli ve kurtarılamaz.

Get-BitLockerVolume | Select-Object MountPoint, VolumeStatus, ProtectionStatus,
  @{n='KurtarmaAnahtari'; e={ ($_.KeyProtector | Where-Object KeyProtectorType -eq 'RecoveryPassword').Count }}

Sayı 0 ise anahtar yalnızca TPM'de: anakart değişiminde veya ürün yazılımı güncellemesinde veri gider. Anahtarı Entra ID'ye ya da AD'ye yedekleyin.

Microsoft Copilot copilotlisansmaliyet

Boşta duran Copilot lisansları

Pahalı lisans kaleminde atanmamış koltuk aramanın en kısa yolu.

Get-MgSubscribedSku | Where-Object SkuPartNumber -like '*COPILOT*' |
  Select-Object SkuPartNumber, ConsumedUnits,
    @{n='Bos'; e={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}}

Atanmış olması kullanıldığı anlamına gelmez. Gerçek kullanım için Microsoft 365 yönetim merkezindeki kullanım raporlarına bakın; lisans sayısı yalnızca üst sınırdır.

Windows İstemci windows-11gocurmeenvanter

Bu makine Windows 11'e çıkabilir mi?

TPM, Secure Boot ve bellek — üç engelin üçünü tek çıktıda gösterir.

$tpm = Get-Tpm
$sb  = try { Confirm-SecureBootUEFI } catch { 'BIOS/Legacy' }

[pscustomobject]@{
  TPM_Var      = $tpm.TpmPresent
  TPM_Etkin    = $tpm.TpmReady
  TPM_Surum    = (Get-CimInstance -Namespace root\cimv2\security\microsofttpm -ClassName Win32_Tpm).SpecVersion
  SecureBoot   = $sb
  RAM_GB       = [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB)
}

SpecVersion 1.2 ile başlıyorsa yükseltme desteklenmez. Confirm-SecureBootUEFI eski BIOS makinelerinde hata fırlatır; bu yüzden karma tablonun dışında kendi değişkeninde yakalanıyor — try/catch bir ifade olmadığı için tablo içine yazılamaz.

Windows Server gpoactive-directorytanilama

Bu makinede hangi grup ilkeleri gerçekten uygulandı?

'İlke uygulanmadı' şikâyetinin cevabı tahminle değil, sonuç raporuyla verilir.

gpresult /h "$env:TEMP\gpo-rapor.html" /f
Invoke-Item "$env:TEMP\gpo-rapor.html"

Kullanıcı ilkeleri için o kullanıcının oturumunda çalıştırın; yönetici olarak açılan konsolda kullanıcı bölümü sizin hesabınızı gösterir.

Windows Server porttanilamahizmet

Bu portu hangi süreç dinliyor?

Yeni kurulan bir hizmet ayağa kalkmıyorsa portu tutan başka bir şey vardır.

Get-NetTCPConnection -State Listen |
  Select-Object LocalAddress, LocalPort,
    @{n='Surec'; e={ (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName }},
    OwningProcess | Sort-Object LocalPort

0.0.0.0 tüm arayüzleri dinliyor demektir; yönetim arayüzlerinin yalnızca iç ağ adresine bağlanması gerekir.

Uç Nokta Yönetimi mdmentrawindows

Cihaz gerçekten yönetimde mi?

Cihazın buluta katılma ve yönetim kaydı durumunu, kiracı bilgisini ve son eşitleme zamanını tek çıktıda gösterir.

dsregcmd /status | Select-String 'AzureAdJoined|DomainJoined|WorkplaceJoined|TenantName|MdmUrl'

# Kayıtlı yönetim sunucusu ve son eşitleme
Get-ScheduledTask -TaskPath '\Microsoft\Windows\EnterpriseMgmt\*' -EA 0 |
  Get-ScheduledTaskInfo | Select-Object TaskName, LastRunTime, LastTaskResult

AzureAdJoined YES ama MdmUrl boşsa cihaz kimliğe katılmış fakat yönetime alınmamıştır.

Ayrıntılı rehberi oku →
Kablosuz Ağ wifikanalplanlama

Çevredeki ağları kanal kanal say

Menzildeki tüm erişim noktalarını kanallarına göre gruplar; hangi kanalın kalabalık olduğunu tek bakışta gösterir.

(netsh wlan show networks mode=bssid) -match 'Kanal|Channel' |
  ForEach-Object { ($_ -split ':')[1].Trim() } |
  Group-Object |
  Sort-Object Count -Descending |
  Format-Table Name, Count -AutoSize

Yalnızca kartın gördüğü ağları sayar; kendi erişim noktanız da listededir. Ölçümü şikâyetin yaşandığı yerde yapın.

Ayrıntılı rehberi oku →
Güvenlik & Entra ID defenderkotu-amacli-yazilimolay-mudahale

Defender bu makinede en son ne yakaladı?

Kullanıcı 'virüs uyarısı çıktı' diyor ama ne olduğunu hatırlamıyor. Kayıt makinenin kendisinde duruyor.

Get-MpThreatDetection |
  Sort-Object InitialDetectionTime -Descending |
  Select-Object -First 20 InitialDetectionTime, ThreatID, Resources

Boş dönmesi 'temiz' demek değildir: geçmiş temizlenmiş ya da tarama hiç çalışmamış olabilir. Get-MpComputerStatus ile son tarama tarihine de bakın.

dhcpip-planiizleme

DHCP kapsamları dolmak üzere mi?

Misafir ağında 'IP alamıyorum' şikâyetleri başlamadan önce görülebilecek tek sayı.

Get-DhcpServerv4ScopeStatistics -ComputerName dhcp01 |
  Select-Object ScopeId, AddressesFree, AddressesInUse, PercentageInUse |
  Sort-Object PercentageInUse -Descending

Kiralama süresi uzunsa doluluk gerçek cihaz sayısından yüksek görünür. Misafir ağında kirayı 2–4 saate indirmek çoğu zaman kapsamı büyütmekten iyidir.

Microsoft 365 m365guvenlikexchange

Dışarı posta yönlendiren kutular

Kurum dışına yönlendirme, ele geçirilmiş hesabın ilk işaretidir.

Get-Mailbox -ResultSize Unlimited |
  Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress } |
  Select-Object DisplayName, PrimarySmtpAddress, ForwardingSmtpAddress,
                DeliverToMailboxAndForward

Gelen kutusu kuralıyla yapılan yönlendirme burada görünmez; `Get-InboxRule` ile ayrıca tarayın.

Linux Sunucu linuxagguvenlik

Dinleyen portlar ve sahibi süreç

Hangi portu hangi sürecin tuttuğunu kullanıcı bilgisiyle listeler.

ss -tulpnH | awk '{print $1, $5, $7}' | sort -u

Süreç adını görmek için root gerekir; aksi hâlde sütun boş gelir.

Linux Sunucu linuxdisktanilama

Diski dolduran dizini bul

Kökten başlayıp en büyük on dizini tek geçişte listeler.

du -xh --max-depth=3 / 2>/dev/null | sort -rh | head -10

`-x` bayrağı dosya sistemi sınırında durur; ağ bağlarını taramaz. Kaldırılmış ama açık tutulan dosyalar burada görünmez, onlar için `lsof +L1`.

Donanım ssddepolamaizleme

Disklerin sağlık ve aşınma durumu

Fiziksel disklerin sağlık durumunu, aşınma yüzdesini ve sıcaklığını listeler; SSD'nin sessiz yaşlanmasını görünür kılar.

Get-PhysicalDisk | ForEach-Object {
  $r = $_ | Get-StorageReliabilityCounter -EA 0
  [pscustomobject]@{
    Disk = $_.FriendlyName; Saglik = $_.HealthStatus
    AsinmaYuzde = $r.Wear; Sicaklik = $r.Temperature
    OkunamayanHata = $r.ReadErrorsUncorrected
  }
} | Format-Table -AutoSize

Aşınma değeri her sürücüde raporlanmaz. Boş dönerse üreticinin aracıyla ya da smartctl ile okuyun.

Ayrıntılı rehberi oku →
Donanım pildizustuwindows

Dizüstü pil sağlığı raporu

Tasarım kapasitesi ile bugünkü tam şarj kapasitesini karşılaştıran ayrıntılı raporu üretir; filo genelinde değişim planının girdisidir.

powercfg /batteryreport /output "$env:TEMP\pil.html"

# Yalnızca iki sayı gerekiyorsa
Get-CimInstance -Namespace root/WMI -Class BatteryStaticData |
  Select-Object DeviceName, DesignedCapacity
Get-CimInstance -Namespace root/WMI -Class BatteryFullChargedCapacity |
  Select-Object FullChargedCapacity

Oran yüzde 80'in altındaysa pil değişim eşiğindedir. Masaüstü ve sanal makinelerde bu sınıflar boş döner.

Ayrıntılı rehberi oku →
dnsperformans

DNS sunucularının yanıt süresi

Yapılandırılmış her çözümleyiciyi aynı sorguyla ölçer; yavaş olanı ortaya çıkarır.

Get-DnsClientServerAddress -AddressFamily IPv4 |
  Select-Object -ExpandProperty ServerAddresses -Unique | ForEach-Object {
    $s = Measure-Command { Resolve-DnsName microsoft.com -Server $_ -EA 0 }
    [pscustomobject]@{ Sunucu = $_; MS = [int]$s.TotalMilliseconds }
  } | Sort-Object MS

Önbelleğe alınmış yanıt hızlı görünür; ölçümü farklı alan adlarıyla tekrarlayın.

Gözlemlenebilirlik izlemealarm

En çok tetiklenen alarmlar

Otuz günde en çok çalan alarmları sayar; alarm yorgunluğunun kaynağı ilk üç satırdadır.

curl -s "$PROM/api/v1/query?query=sort_desc(
  count_over_time(ALERTS{alertstate=\"firing\"}[30d])
)" | jq -r '.data.result[] | "\(.value[1])\t\(.metric.alertname)"' | head -15

$PROM Prometheus adresiniz. 30 günlük sorgu büyük kümelerde yavaş çalışır, saatte bir çalıştırmayın.

Depolama depolamakapasite

En hızlı büyüyen paylaşımlar

İki ölçüm arasındaki farkı alarak büyüme hızını bulur.

$dosya = "$env:TEMP\paylasim-olcum.csv"
$simdi = Get-SmbShare | Where-Object Special -eq $false | ForEach-Object {
  [pscustomobject]@{
    Ad = $_.Name
    GB = [math]::Round((Get-ChildItem $_.Path -Recurse -File -EA 0 |
          Measure-Object Length -Sum).Sum / 1GB, 2)
  }
}
if (Test-Path $dosya) {
  $onceki = Import-Csv $dosya
  $simdi | ForEach-Object {
    $e = $onceki | Where-Object Ad -eq $_.Ad
    if ($e) { "{0}: +{1} GB" -f $_.Ad, [math]::Round($_.GB - [double]$e.GB, 2) }
  }
}
$simdi | Export-Csv $dosya -NoTypeInformation

İlk çalıştırma yalnızca ölçüm alır, fark ikinci çalıştırmada çıkar.

Web Sunucu nginxperformansgunluk

En yavaş uç noktaları bul

Yanıt süresi alanı eklenmiş bir erişim günlüğünde, ortalama süreye göre en yavaş adresleri listeler.

# Son alanın $request_time olduğu varsayılır
awk '{ t[$7] += $NF; n[$7]++ }
     END { for (u in t) printf "%8.3f  %6d  %s\n", t[u]/n[u], n[u], u }' \
    /var/log/nginx/access.log |
  sort -rn | head -20

Az sayıda çağrılan bir adres tepeye çıkabilir; çağrı sayısı sütununu da okuyun.

Ayrıntılı rehberi oku →
Web Sunucu nginxgunluksorun-giderme

Erişim günlüğünde durum kodu dağılımı

Hangi kodun ne sıklıkta döndüğünü ve 5xx üretmiş adresleri sıralar; olay anında ilk bakılacak iki tablodur.

# Kod dağılımı
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 5xx üreten adresler, çoktan aza
awk '$9 ~ /^5/ {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

Alan numaraları günlük biçimine göre değişir. Öndeki vekil varsa $1 gerçek istemci değil vekilin adresidir.

Ayrıntılı rehberi oku →
Google Cloud envantermaliyetgce

Google Cloud'da o an çalışan sanal makineler

Hangi projede ne çalışıyor sorusunun konsol açmadan cevabı.

gcloud compute instances list --filter="status=RUNNING" \
  --format="table(name, zone.basename(), machineType.basename(), status)"

Varsayılan olarak yalnızca etkin projeyi listeler. Tüm projeler için gcloud projects list çıktısında döngü kurun.

Web Sunucu web-sunucuguvenliksertlestirme

Güvenlik başlıkları gerçekten gönderiliyor mu?

Yanıt başlıklarını okuyup beklenen güvenlik başlıklarının varlığını ve sürüm bilgisinin sızıp sızmadığını gösterir.

curl -sSI https://ornek.com |
  grep -iE 'strict-transport|content-security|x-content-type|x-frame|referrer-policy|server|x-powered-by'

# Dizin listesi açık mı
curl -s -o /dev/null -w '%{http_code}\n' https://ornek.com/assets/

server ve x-powered-by satırları görünüyorsa sürüm bilgisi sızıyor demektir; öndeki vekilde temizlenmeli.

Ayrıntılı rehberi oku →
PowerShell active-directoryolay-gunlugu

Hesabı kim kilitliyor?

PDC emulator üzerindeki son kilitlenme olaylarını hesap ve kaynak bilgisayarla listeler.

Get-WinEvent -ComputerName (netdom query fsmo) -FilterHashtable @{
  LogName = 'Security'; Id = 4740
} -MaxEvents 10 |
  Select-Object TimeCreated,
    @{ n = 'Hesap';  e = { $_.Properties[0].Value } },
    @{ n = 'Kaynak'; e = { $_.Properties[1].Value } }

Yalnızca PDC emulator rolündeki DC'de güvenilir sonuç verir.

Ayrıntılı rehberi oku →
Microsoft Azure maliyetdepolamatemizlik

Hiçbir sanal makineye bağlı olmayan Azure diskleri

Silinen makinelerin diskleri arkada kalır ve her ay tam ücret öder. Fatura kaleminin adı yoktur, sahibi de.

az disk list --query "[?diskState=='Unattached'].{Ad:name, Grup:resourceGroup, GB:diskSizeGb, Katman:sku.name}" -o table

Silmeden önce anlık görüntü alın ve bir hafta bekleyin. 'Bağlı değil' bazen 'yarın taşınacak' demektir.

Sanallaştırma hyper-vfelaket-kurtarmareplikasyon

Hyper-V replikasyonu gerçekten çalışıyor mu?

Durum 'Replicating' görünürken sağlık 'Warning' olabilir ve son kopya dünden kalma olabilir.

Get-VMReplication |
  Select-Object VMName, State, Health, LastReplicationTime |
  Sort-Object Health, LastReplicationTime

LastReplicationTime bugüne ait değilse hedefteki kopya sizi kurtarmaz. Sağlık 'Normal' olsa bile bu sütuna bakın.

Kablosuz Ağ wifiroamingsorun-giderme

Kablosuz bağlantı geçmişi raporu

Son üç güne ait bağlanma, kopma ve erişim noktası geçişlerini zaman çizelgesi hâlinde HTML rapora döker.

netsh wlan show wlanreport

# Rapor buraya yazılır:
# C:\ProgramData\Microsoft\Windows\WlanReport\wlan-report-latest.html

Yönetici hakkı ister. Rapor kullanıcı adı ve ağ adlarını içerir; paylaşmadan önce içeriğine bakın.

Ayrıntılı rehberi oku →
Kablosuz Ağ wifisorun-gidermewindows

Kablosuz bağlantının gerçek durumu

Bağlı olunan erişim noktasını, bandı, kanalı, sinyal yüzdesini ve anlaşma hızını gösterir; 'yavaş' şikâyetinde ilk bakılacak çıktıdır.

netsh wlan show interfaces

# Yalnızca karar veren satırlar
netsh wlan show interfaces |
  Select-String 'SSID|BSSID|Radyo|Radio|Kanal|Channel|Sinyal|Signal|Alma|Receive|İletim|Transmit'

Sinyal yüzdesi doluyken hız düşükse sorun kapsama değil ortam doluluğudur; kanal taraması gerekir.

Ayrıntılı rehberi oku →
Kubernetes kuberneteskapasite

Kaynak isteği tanımlanmamış podlar

requests/limits verilmemiş podlar zamanlayıcıyı yanıltır ve gece yarısı tahliyeye yol açar.

kubectl get pods -A -o json |
  jq -r '.items[] | select(.spec.containers[].resources.requests == null) |
    "\(.metadata.namespace)/\(.metadata.name)"'

jq gerekir. Sistem ad alanlarında normal olabilir; önce kendi ad alanlarınıza bakın.

Microsoft Azure entrakimlikdenetim

Koşullu erişim politikaları ve gerçekten açık olanlar

Politikaların hangisi zorluyor, hangisi yalnızca rapor topluyor — Entra panelinde tek tek tıklamadan görün.

Get-MgIdentityConditionalAccessPolicy |
  Select-Object DisplayName, State, ModifiedDateTime |
  Sort-Object State, DisplayName

enabledForReportingButNotEnforced = rapor modu: oturumları sayar ama hiçbir şeyi engellemez. Denetimde 'MFA politikamız var' derken çoğu kurumun kastettiği budur.

Microsoft 365 m365lisansmaliyet

Kullanılmayan Microsoft 365 lisansları

Atanmış ama 90 gündür oturum açmamış hesapları listeler — doğrudan bütçe kalemi.

Connect-MgGraph -Scopes AuditLog.Read.All, User.Read.All
$sinir = (Get-Date).AddDays(-90)
Get-MgUser -All -Property DisplayName,UserPrincipalName,SignInActivity,AssignedLicenses |
  Where-Object { $_.AssignedLicenses.Count -gt 0 -and
                 $_.SignInActivity.LastSignInDateTime -lt $sinir } |
  Select-Object DisplayName, UserPrincipalName,
    @{ n = 'SonGiris'; e = { $_.SignInActivity.LastSignInDateTime } }

SignInActivity için Entra ID P1 gerekir. Hizmet hesapları hiç oturum açmaz; silmeden önce ayırın.

Uç Nokta Yönetimi yazicienvanterwindows

Kurulu yazıcıları sürücü ve portuyla listele

Hangi yazıcının hangi sürücüyle ve hangi porttan çalıştığını gösterir; üreticiye özgü sürücüde kalanları ayırır.

Get-Printer |
  Select-Object Name, DriverName, PortName, Shared, Published |
  Sort-Object DriverName | Format-Table -AutoSize

# Sürücüye göre kaç yazıcı var
Get-Printer | Group-Object DriverName | Sort-Object Count -Descending |
  Select-Object Count, Name

Sunucudan çalıştırıldığında yalnızca o sunucudaki tanımları görür; istemcilerdeki doğrudan tanımlar listede çıkmaz.

Ayrıntılı rehberi oku →
Kablosuz Ağ wifilinuxroaming

Linux'ta sinyal ve bağlantı hızını izle

Bağlı erişim noktasını, sinyal seviyesini ve anlaşma hızını saniyede bir yazdırır; yürürken dolaşım davranışını görmeye yarar.

watch -n1 'iw dev wlan0 link | grep -E "Connected to|SSID|signal|tx bitrate"'

# Tek seferlik özet
nmcli -f IN-USE,SSID,BSSID,CHAN,SIGNAL,RATE dev wifi list

Arayüz adı wlan0 olmayabilir; önce 'iw dev' ile doğrulayın. Tarama sırasında bağlantı kısa süre duraklayabilir.

Ayrıntılı rehberi oku →
Donanım ssdlinuxsmart

Linux'ta SMART değerlerini oku

Diskin kalan ömrünü, toplam yazılan veriyi ve ayrılmış blok kullanımını gösterir; NVMe ve SATA için ayrı çıktı verir.

# NVMe
sudo nvme smart-log /dev/nvme0n1 | grep -E 'percentage_used|data_units_written|media_errors'

# SATA / SAS
sudo smartctl -A /dev/sda |
  grep -E 'Reallocated|Wear_Leveling|Total_LBAs_Written|Media_Wearout|Temperature'

smartmontools kurulu olmalı. RAID denetleyicisi arkasındaki disklerde -d seçeneğiyle denetleyici türü belirtilmelidir.

Ayrıntılı rehberi oku →
macOS mdmintuneenvanter

Mac gerçekten MDM'e kayıtlı mı?

Envanterde görünmesi kayıtlı olduğu anlamına gelmez; cihaza sorun.

sudo profiles status -type enrollment

'Enrolled via DEP: No' çıkıyorsa cihaz elle kaydedilmiş demektir: silinip yeniden kurulduğunda yönetimden düşer. Otomatik cihaz kaydına almadan filoya saymayın.

wifinetshkurtarma

Makinede kayıtlı Wi-Fi parolasını göster

Kullanıcı parolayı unuttu, ağ profili makinede duruyor. Parola orada, düz metin.

netsh wlan show profile name="AgAdi" key=clear | Select-String 'Key Content|Anahtar İçeriği'

Yönetici hakkı ister ve parolayı ekrana düz metin basar. Ekran paylaşımı ya da kayıt açıkken çalıştırmayın; sonrasında konsol geçmişini de temizleyin.

Güvenlik & Entra ID entra-idmfa

MFA'ya kaydolmamış kullanıcılar

Koşullu erişimi zorlamadan önce kimlerin henüz yöntem kaydetmediğini gösterir.

Connect-MgGraph -Scopes 'UserAuthenticationMethod.Read.All'
Get-MgReportAuthenticationMethodUserRegistrationDetail -All |
  Where-Object { -not $_.IsMfaRegistered } |
  Select-Object UserPrincipalName, UserDisplayName |
  Sort-Object UserPrincipalName

Yayımdan önce bu listeyi sıfırlayın; kayıtsız kullanıcı politika açıldığında dışarıda kalır.

Ayrıntılı rehberi oku →
Microsoft Azure m365lisansmaliyet

Microsoft 365 lisanslarının kaçı kullanılıyor?

Yenileme görüşmesine girmeden önce alınan ve tüketilen lisans sayısını yan yana koyun.

Get-MgSubscribedSku | Select-Object SkuPartNumber,
  @{n='Alinan'; e={$_.PrepaidUnits.Enabled}}, ConsumedUnits,
  @{n='Bos'; e={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}} | Sort-Object Bos -Descending

Ayrılmış çalışanların lisansı hâlâ atanmış görünüyorsa 'tüketilen' sayısı gerçek kullanımı değil, temizlenmemiş hesapları gösterir.

E-posta mxdnseposta

MX kayıtlarını önceliğe göre listele

Alan adına gelen postanın hangi sunucuya, hangi sırayla teslim edileceğini gösterir; yedek MX olup olmadığını da açığa çıkarır.

Resolve-DnsName ornek.com -Type MX |
  Sort-Object Preference |
  Select-Object Preference, NameExchange |
  Format-Table -AutoSize

# Adların gerçekten çözülüp çözülmediğini de doğrulayın
(Resolve-DnsName ornek.com -Type MX).NameExchange |
  ForEach-Object { Resolve-DnsName $_ -Type A -EA 0 | Select-Object Name, IPAddress }

MX bir IP değil ad göstermelidir. Çözülemeyen bir ad, postanın hiç ulaşmaması demektir.

Ayrıntılı rehberi oku →
Güvenlik & Entra ID ntlmkerberossertlestirme

NTLM ile açılan oturumları bul

NTLM'i kapatmadan önce kimin kullandığını bilmek gerekir; kapatıp beklemek kesinti üretir.

Get-WinEvent -LogName Security -MaxEvents 200 -FilterXPath @"
*[System[EventID=4624] and EventData[Data[@Name='AuthenticationPackageName']='NTLM']]
"@ | ForEach-Object {
  $x = [xml]$_.ToXml()
  [pscustomobject]@{
    Zaman   = $_.TimeCreated
    Hesap   = ($x.Event.EventData.Data | Where-Object Name -eq 'TargetUserName').'#text'
    Kaynak  = ($x.Event.EventData.Data | Where-Object Name -eq 'WorkstationName').'#text'
  }
} | Group-Object Hesap | Sort-Object Count -Descending

Etki alanı denetleyicisinde çalıştırın. Tek makinede yalnızca o makineye gelen oturumları görürsünüz; asıl resim denetleyicilerdedir.

Güvenlik & Entra ID active-directoryguvenlikparola

Parolası hiç değişmeyen hesaplar

Bir yıldan uzun süredir aynı parolayı taşıyan etkin hesapları listeler.

Search-ADAccount -AccountInactive -UsersOnly -TimeSpan 0 |
  Out-Null  # önbelleği tazeler
Get-ADUser -Filter { Enabled -eq $true } -Properties PasswordLastSet |
  Where-Object { $_.PasswordLastSet -lt (Get-Date).AddDays(-365) } |
  Select-Object Name, SamAccountName, PasswordLastSet |
  Sort-Object PasswordLastSet

Hizmet hesapları bilerek uzun ömürlü olabilir; silmeden önce sahibini bulun. PasswordNeverExpires ayrı bir tarama ister.

tanilama

Port açık mı?

telnet istemcisi kurmadan TCP bağlantısını, DNS çözümlemesini ve yönlendirmeyi tek komutta gösterir.

Test-NetConnection sunucu01 -Port 443 -InformationLevel Detailed

PingSucceeded False olsa bile TcpTestSucceeded True ise port açıktır — çoğu güvenlik duvarı ICMP'yi kapatır.

E-posta smtptlseposta

Posta sunucusu STARTTLS destekliyor mu?

Alıcı sunucuya bağlanıp şifreli taşımanın kurulup kurulmadığını ve sertifikanın geçerliliğini sınar.

# Erişilebilirlik
Test-NetConnection posta.ornek.com -Port 25

# STARTTLS ve sertifika (openssl gerekir)
openssl s_client -starttls smtp -connect posta.ornek.com:25 -servername posta.ornek.com < /dev/null 2>/dev/null |
  openssl x509 -noout -subject -issuer -dates

Birçok internet servis sağlayıcısı 25 numaralı portu dışarıya kapatır; test kurumsal hattan yapılmalıdır.

Ayrıntılı rehberi oku →
Veritabanı postgresqlbakim

PostgreSQL tablo şişmesi

Ölü satır oranı yüksek tabloları bulur; autovacuum yetişemiyorsa buradan anlaşılır.

SELECT schemaname, relname, n_live_tup, n_dead_tup,
       round(n_dead_tup * 100.0 / NULLIF(n_live_tup + n_dead_tup, 0), 1) AS olu_yuzde,
       last_autovacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY olu_yuzde DESC NULLS LAST
LIMIT 20;

Sayaçlar istatistik toplayıcıdan gelir; `pg_stat_reset()` sonrası sıfırlanır.

Uzak Erişim rdpguvenlikwindows

RDP hangi portu dinliyor, NLA açık mı?

Kayıt defterindeki gerçek dinleme portunu, ağ düzeyinde kimlik doğrulama ayarını ve servisin durumunu tek çıktıda gösterir.

$rdp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'
$sid = (Get-CimInstance Win32_Service -Filter "Name='TermService'").ProcessId

[pscustomobject]@{
  Port       = (Get-ItemProperty "$rdp\WinStations\RDP-Tcp").PortNumber
  RdpKapali  = [bool](Get-ItemProperty $rdp).fDenyTSConnections
  NLA        = [bool](Get-ItemProperty "$rdp\WinStations\RDP-Tcp").UserAuthentication
  Dinleniyor = (Get-NetTCPConnection -State Listen -EA 0 |
                 Where-Object OwningProcess -eq $sid).LocalPort
}

NLA değeri 0 ise doğrulanmamış bağlantılar oturum ayağa kaldırabilir; 1 olmalı.

Ayrıntılı rehberi oku →
Windows Server robocopydosya-sunucusu

Silmeden önce robocopy /MIR provası

Aynalamanın ne sileceğini gerçekten silmeden gösterir. /MIR'i her zaman önce böyle çalıştırın.

robocopy "D:\Kaynak" "\\yedek01\Hedef" /MIR /L /NJH /NJS /NDL /XD "System Volume Information"

/L parametresi 'yalnızca listele' demektir. Çıktıyı okumadan /L'i kaldırmayın — /MIR hedefteki fazlalıkları siler.

Güvenlik & Entra ID smbsertlestirmedosya-sunucusu

SMB imzalama ve SMB1 durumu

Dosya sunucusu sertleştirmesinde ilk bakılacak üç ayar tek satırda.

Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EnableSMB1Protocol, EncryptData

EnableSMB1Protocol True ise diğer maddeleri tartışmayı bırakın, önce onu kapatın. İmzalama zorunlu değilse ortadaki adam saldırısı dosya trafiğini değiştirebilir.

Kubernetes kubernetesolay-gunlugu

Son 1 saatin uyarı olayları

Küme olaylarını yalnızca Warning türüyle ve zamana göre sıralı verir.

kubectl get events -A --field-selector type=Warning \
  --sort-by='.lastTimestamp' | tail -30

Olaylar varsayılan olarak 1 saat sonra silinir; sorun eskiyse günlük toplayıcıya bakın.

Veritabanı sql-serveryedekleme

Son yedek ne zaman alındı?

Her veritabanının son tam ve günlük yedeğini tek tabloda verir.

SELECT d.name AS veritabani,
       MAX(CASE WHEN b.type = 'D' THEN b.backup_finish_date END) AS son_tam,
       MAX(CASE WHEN b.type = 'L' THEN b.backup_finish_date END) AS son_gunluk
FROM sys.databases d
LEFT JOIN msdb.dbo.backupset b ON b.database_name = d.name
WHERE d.database_id > 4
GROUP BY d.name
ORDER BY son_tam;

msdb geçmişi budanmışsa boş görünür — yedek alınmadığı anlamına gelmez. Yedek dosyalarını da doğrulayın.

Yedekleme & kurtarma yedeklemeizlemewindows-server-backup

Son yedek ne zaman ve başarılı mıydı?

İki ayrı soru: en son ne zaman çalıştı ve en son ne zaman başarılı oldu.

Get-WBSummary | Select-Object LastSuccessfulBackupTime, LastBackupResultHR, NextBackupTime

LastBackupResultHR 0 değilse son iş başarısızdır ve 'son başarılı' tarihi eskide kalır. İzlemeniz bu iki alanı ayrı ayrı kontrol etmiyorsa aylarca yedeksiz kalabilirsiniz.

E-posta spfdnseposta

SPF kaydı on sorgu sınırını aşıyor mu?

Kayıttaki include ve redirect zincirini açarak toplam DNS sorgu sayısını sayar; on sınırı aşıldığında SPF sessizce başarısız olur.

function Say-Spf($alan, $derinlik = 0) {
  if ($derinlik -gt 10) { return 99 }
  $kayit = ((Resolve-DnsName $alan -Type TXT -EA 0).Strings -match '^v=spf1')
  if (-not $kayit) { return 0 }
  $sayi = 0
  foreach ($p in ($kayit -split ' ')) {
    if ($p -match '^(include:|redirect=)(.+)$') { $sayi += 1 + (Say-Spf $Matches[2] ($derinlik+1)) }
    elseif ($p -match '^(a|mx|ptr|exists)') { $sayi += 1 }
  }
  $sayi
}
Say-Spf 'ornek.com'

Sonuç 10'a yakınsa yeni bir sağlayıcı eklendiğinde sınır aşılır. Kullanılmayan include satırlarını temizleyin.

Ayrıntılı rehberi oku →
E-posta spfdkimdmarcdns

SPF, DKIM ve DMARC kayıtlarını tek seferde oku

Bir alan adının üç kimlik doğrulama kaydını da sorgular; eksik olan hemen görünür.

$alan = 'ornek.com'
$secici = 'selector1'   # DKIM seçicisi sağlayıcıya göre değişir

'SPF   : ' + ((Resolve-DnsName $alan -Type TXT).Strings -match '^v=spf1')
'DMARC : ' + ((Resolve-DnsName "_dmarc.$alan" -Type TXT -EA 0).Strings -match '^v=DMARC1')
'DKIM  : ' + ((Resolve-DnsName "$secici._domainkey.$alan" -Type TXT,CNAME -EA 0).Strings -join '')

DKIM seçicisini bilmeden sorgulanamaz. Giden bir postanın başlığındaki imza satırında yazar.

Ayrıntılı rehberi oku →
Güvenlik & Entra ID tlssertifikasertlestirme

Sunucu hangi TLS sürümlerini kabul ediyor?

Tarayıcı açılıyor diye TLS 1.2 kapalı sanmayın; el sıkışmayı sürüm sürüm deneyin.

$h = 'www.ornek.com'
foreach ($p in 'Tls12', 'Tls13') {
  $c = [Net.Sockets.TcpClient]::new($h, 443)
  $s = [Net.Security.SslStream]::new($c.GetStream())
  try { $s.AuthenticateAsClient($h, $null, [Net.SecurityProtocolType]::$p, $false); "$p : kabul" }
  catch { "$p : ret" }
  finally { $s.Dispose(); $c.Dispose() }
}

Windows Server 2019 ve öncesi Tls13'ü hiç bilmez; 'ret' cevabı sunucunun değil istemcinin sınırı olabilir.

Uzak Erişim sshtunellinux

Sunucuda açılmış SSH tünellerini gör

sshd süreçlerinin açtığı dinleme portlarını listeler; yerel arayüz dışına bağlanmış olanlar ters tünel adayıdır.

sudo ss -tlnp | awk '/sshd/ {print $4, $6}'

# Tüm arayüzlere açılmış olanlar (0.0.0.0 veya [::]) incelenmeli
sudo ss -tlnp | awk '/sshd/ && ($4 ~ /^0\.0\.0\.0:/ || $4 ~ /^\[::\]:/) {print}'

22 portu normaldir. Diğer portlarda sshd dinliyorsa bir port yönlendirme kurulmuş demektir.

Ayrıntılı rehberi oku →
Windows Server rdpoturumuzaktan-erisim

Sunucuda kim oturum açmış, kimin oturumu asılı kalmış?

Kapatılmamış uzak masaüstü oturumları bellek tutar ve lisans yer.

quser /server:sunucu01

Disc (disconnected) durumundaki oturumlar uygulamaları çalışır hâlde tutar. Oturum zaman aşımını grup ilkesinden vermezseniz bu liste hiç kısalmaz.

Windows Server izlemedepolama

Sunuculardaki disk doluluğunu tek tabloda gör

Birden çok sunucunun boş alanını yüzdeyle listeler; %15'in altındakileri işaretler.

'sunucu01','sunucu02','sunucu03' | ForEach-Object {
  Get-CimInstance Win32_LogicalDisk -ComputerName $_ -Filter "DriveType=3" |
    Select-Object @{ n='Sunucu'; e={ $_.SystemName } }, DeviceID,
      @{ n='BosGB'; e={ [math]::Round($_.FreeSpace/1GB,1) } },
      @{ n='Bos%';  e={ [math]::Round($_.FreeSpace/$_.Size*100,1) } }
} | Sort-Object 'Bos%' | Format-Table -AutoSize

Uzak sunucularda WinRM açık olmalı; kapalıysa Get-CimInstance -Protocol Dcom deneyin.

Web Sunucu tlssertifikaizleme

Sunucunun sunduğu sertifikada kaç gün kaldı?

Diskteki dosyaya değil, sunucunun gerçekten sunduğu sertifikaya bakar; yenilenmiş ama yüklenmemiş sertifikayı yakalar.

'ornek.com', 'panel.ornek.com' | ForEach-Object {
  $t = [Net.Sockets.TcpClient]::new($_, 443)
  $s = [Net.Security.SslStream]::new($t.GetStream(), $false, { $true })
  $s.AuthenticateAsClient($_)
  $b = [Security.Cryptography.X509Certificates.X509Certificate2]$s.RemoteCertificate
  [pscustomobject]@{ Alan = $_; Bitis = $b.NotAfter; KalanGun = ($b.NotAfter - (Get-Date)).Days }
  $s.Dispose(); $t.Close()
}

Sertifika doğrulaması bilerek atlanır — amaç geçerliliği değil kalan süreyi ölçmektir.

Ayrıntılı rehberi oku →
Kubernetes kubernetestanilamapod

Sürekli yeniden başlayan podları bul

Küme genelinde restart sayısına göre sıralar; gürültünün kaynağını ilk bakışta gösterir.

kubectl get pods -A --sort-by='.status.containerStatuses[0].restartCount' \
  -o custom-columns='AD:.metadata.name,AD ALANI:.metadata.namespace,RESTART:.status.containerStatuses[0].restartCount,DURUM:.status.phase' \
  | tail -20

Çok konteynerli podlarda yalnızca ilk konteynerin sayacını gösterir; şüpheli podu ayrıca `kubectl describe` ile açın.

Uç Nokta Yönetimi yaziciwindowssorun-giderme

Takılmış yazdırma kuyruğunu sıfırla

Bekletici hizmetini durdurup kuyruktaki artık işleri temizler ve hizmeti geri başlatır; en sık gelen yazdırma çağrısını kapatır.

Stop-Service Spooler -Force
Remove-Item "$env:SystemRoot\System32\spool\PRINTERS\*" -Force -EA 0
Start-Service Spooler

# Önce neyin takıldığına bakmak isterseniz
Get-Printer | Get-PrintJob -EA 0 | Select-Object PrinterName, Id, DocumentName, JobStatus

Kuyruktaki tüm bekleyen işleri siler — yalnızca sizin işiniz değil. Paylaşımlı yazıcı sunucusunda mesai saatinde çalıştırmayın.

Ayrıntılı rehberi oku →
Uzak Erişim rdpoturumwindows

Terk edilmiş RDP oturumlarını bul ve kapat

Kopmuş ama sunucuda bellek tutmaya devam eden oturumları listeler; belirtilen süreden eskileri kapatır.

# Tüm oturumlar: Disc durumundakiler kopmuş ama hâlâ açık
quser /server:SUNUCU

# Yalnızca kopmuş olanlar
(quser /server:SUNUCU) -match 'Disc'

# Kimliği gözle doğruladıktan sonra tek tek kapatın
logoff 3 /server:SUNUCU

logoff kaydedilmemiş işi yok eder ve geri alınamaz. Oturum kimliğini quser çıktısından gözle doğrulamadan çalıştırmayın; sütun ayrıştırmaya dayanan toplu betikler yanlış oturumu kapatabilir.

Ayrıntılı rehberi oku →
Altyapı Otomasyonu terraformiac

Terraform durum sürüklemesi

Koddan sapmış kaynakları değişiklik uygulamadan gösterir.

terraform plan -refresh-only -detailed-exitcode -no-color |
  grep -E '^\s+[~+-]' | head -40

`-detailed-exitcode` fark varsa 2 döner; CI adımınız 0 dışındaki her çıkışı hata sayıyorsa bunu ayrıca ele alın.

Donanım tpmuefiwindows

TPM ve Secure Boot durumu

Çipin var olup olmadığını, etkin olup olmadığını, sürümünü ve Secure Boot ile açılış kipini tek çıktıda verir.

$t = Get-Tpm
$sb = try { Confirm-SecureBootUEFI } catch { 'UEFI degil' }
[pscustomobject]@{
  TpmVar     = $t.TpmPresent
  TpmEtkin   = $t.TpmReady
  Surum      = (Get-CimInstance -Namespace root/CIMV2/Security/MicrosoftTpm -Class Win32_Tpm).SpecVersion
  SecureBoot = $sb
  AcilisKipi = $env:firmware_type
}

AcilisKipi 'Legacy' dönüyorsa makine uyumluluk kipinde kurulmuştur; Secure Boot ve GPT devre dışıdır.

Ayrıntılı rehberi oku →
Windows Server gpoyedekleme

Tüm GPO'ları tarihli klasöre yedekle

Görev Zamanlayıcı ile haftalık çalıştırmak için tasarlanmış, sürümlenmiş GPO yedeği.

$hedef = "\\yedek01\gpo\$(Get-Date -Format 'yyyy-MM-dd')"
New-Item -ItemType Directory -Path $hedef -Force | Out-Null
Backup-GPO -All -Path $hedef -Comment "Haftalık otomatik yedek"

Görevi kendi hesabınızla değil hizmet hesabıyla kurun; parolanız değişince görev sessizce durur.

Ayrıntılı rehberi oku →
Depolama depolamamaliyetsanallastirma

Unutulmuş anlık görüntüler

Otuz günden eski anlık görüntüleri boyutuyla listeler — sessiz maliyet kalemi.

Get-VM | Get-VMSnapshot |
  Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-30) } |
  Select-Object VMName, Name, CreationTime,
    @{ n = 'BoyutGB'; e = { [math]::Round((Get-Item $_.Path).Length / 1GB, 2) } } |
  Sort-Object CreationTime

Uzun yaşayan anlık görüntü zinciri birleştirme sırasında uzun kesinti üretir; iş saatleri dışında silin.

Sanallaştırma hyper-vdepolama

Unutulmuş checkpoint'leri bul

Tüm sanal makinelerdeki checkpoint'leri oluşturma tarihine göre sıralar — en eskisi en tehlikelisidir.

Get-VM | Get-VMSnapshot |
  Select-Object VMName, Name, CreationTime, ParentSnapshotName |
  Sort-Object CreationTime

Silmeye en eski checkpoint'ten başlayın; ters sırada silmek zinciri yeniden yazdırır.

Ayrıntılı rehberi oku →
Veritabanı sql-serverperformans

Uzun süren SQL Server sorguları

Beş saniyeden uzun çalışan oturumları, beklediği kaynakla birlikte gösterir.

SELECT r.session_id, r.status, r.wait_type, r.total_elapsed_time / 1000 AS saniye,
       DB_NAME(r.database_id) AS veritabani, t.text AS sorgu
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id > 50 AND r.total_elapsed_time > 5000
ORDER BY r.total_elapsed_time DESC;

VIEW SERVER STATE izni ister. Sorguyu öldürmeden önce beklediği kaynağı not edin.

Windows İstemci wingetyamaotomasyon

Üçüncü parti uygulamaları tek komutla güncelle

Chrome, 7-Zip, Notepad++ ve benzerleri Windows Update'e uğramaz. winget uğrar.

winget upgrade --all --include-unknown --accept-source-agreements --accept-package-agreements

Önce --all olmadan çalıştırıp listeyi görün. --include-unknown sürümü okunamayan paketleri de günceller; sunucuda bu, çalışan bir uygulamayı yeniden başlatabilir.

Gözlemlenebilirlik izlemeprometheus

Veri göndermeyi bırakan hedefler

Beş dakikadır örnek gelmeyen hedefleri listeler — sessizce ölen izleme budur.

curl -s "$PROM/api/v1/query?query=up==0" |
  jq -r '.data.result[] | "\(.metric.job)\t\(.metric.instance)"'

up==0 yalnızca kayıtlı hedefleri kapsar; hiç eklenmemiş bir sunucu burada da görünmez.

Yedekleme & kurtarma yedeklemedogrulama

Yedek işlerinin son durumu

Windows Server Backup günlüğünden son yedek sonuçlarını çıkarır.

Get-WinEvent -FilterHashtable @{
  LogName = 'Microsoft-Windows-Backup'; Id = 4, 5, 8, 9, 17, 22, 49
} -MaxEvents 20 |
  Select-Object TimeCreated, Id,
    @{ n = 'Sonuc'; e = { if ($_.Id -in 4, 5) { 'Başarılı' } else { 'Hata' } } },
    @{ n = 'Mesaj'; e = { $_.Message.Split("`n")[0] } }

Yalnızca yerleşik yedekleme aracını kapsar. Üçüncü taraf çözümler kendi günlüklerini yazar; "başarılı" görmek geri dönüş testinin yerini tutmaz.

Windows Server windows-serverguncelleme

Yeniden başlatma bekleyen sunucular

Güncellemesi bitmiş ama yeniden başlatılmadığı için yarım kalan makineleri bulur.

$sunucular = Get-ADComputer -Filter { OperatingSystem -like '*Server*' } |
  Select-Object -ExpandProperty Name
Invoke-Command -ComputerName $sunucular -ErrorAction SilentlyContinue -ScriptBlock {
  $b = Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
  if ($b) { $env:COMPUTERNAME }
}

WinRM kapalı sunucular sessizce atlanır; listeyi AD sayısıyla karşılaştırıp farkı ayrıca inceleyin.

Uç Nokta Yönetimi guvenlikyetkiwindows

Yerel yönetici grubunda kim var?

Uç noktadaki yerel yönetici üyelerini kaynağıyla birlikte listeler; zamanla biriken yetkileri açığa çıkarır.

Get-LocalGroupMember -Group 'Administrators' |
  Select-Object Name, ObjectClass, PrincipalSource |
  Format-Table -AutoSize

# Filo genelinde
'PC01','PC02' | ForEach-Object {
  Invoke-Command -ComputerName $_ -ScriptBlock { Get-LocalGroupMember Administrators } -EA 0 |
    Select-Object PSComputerName, Name, PrincipalSource
}

Grup adı yerelleştirilmiş sistemlerde farklıdır; hata alırsanız 'Yöneticiler' deneyin.

Ayrıntılı rehberi oku →
Güvenlik & Entra ID yetkidenetimlaps

Yerel yöneticiler grubunda kimler var?

Yıllar içinde eklenen kullanıcılar, eski servis hesapları ve unutulmuş etki alanı grupları burada birikir.

Get-LocalGroupMember -Group 'Administrators' |
  Select-Object Name, PrincipalSource, ObjectClass

Yerel yönetici parolası her makinede aynıysa bir makinenin ele geçirilmesi hepsinin ele geçirilmesi demektir. Windows LAPS bunu çözer.

mtuvpntanilama

Yoldaki gerçek MTU değerini bul

VPN üstünde bazı siteler açılıyor bazıları takılıyorsa, sorun çoğu zaman parçalanmayan büyük paketlerdir.

ping -f -l 1472 8.8.8.8

'Paketin parçalanması gerekiyor' hatası alana kadar 1472'den aşağı inin. Geçen en büyük değere 28 ekleyin: yolun MTU'su odur. VPN'de 1500 beklemeyin, 1400 civarı normaldir.

Uzak Erişim guvenliktaramaport

Yönetim portları dışarıya açık mı?

Kurumun genel adresine dışarıdan bakarak RDP, SSH ve yönetim portlarının erişilebilir olup olmadığını sınar.

$hedef = (Invoke-RestMethod https://api.ipify.org)
3389, 22, 5985, 5986, 445, 623 | ForEach-Object {
  $s = Test-NetConnection $hedef -Port $_ -WarningAction SilentlyContinue
  [pscustomobject]@{ Port = $_; Acik = $s.TcpTestSucceeded }
} | Format-Table -AutoSize

İç ağdan çalıştırıldığında güvenlik duvarını atlayabilir; sonucu kurum dışı bir bağlantıdan da doğrulayın.

Ayrıntılı rehberi oku →