SMB Paylaşım Erişim Sorunlarını Giderme

Ağda bir SMB paylaşımına erişilemiyor ve kullanıcılar “Access Denied”, “Network Path Not Found” veya “The specified network name is no longer available” gibi hatalar alıyor. Bu senaryolar her sysadmin’in kabusudur çünkü sorunun kaynağı onlarca farklı yerden gelebilir: izin sorunları, firewall kuralları, DNS çözümleme hataları, SMB protokol versiyonu uyumsuzlukları veya servis sorunları. Bu yazıda gerçek dünya senaryolarıyla SMB paylaşım sorunlarını sistematik olarak nasıl çözeceğinizi ele alacağız.

Temel Kontroller ile Başlamak

Karmaşık çözümlere atlamadan önce temel kontrolleri yapmak hem zaman kazandırır hem de bazen sorunun ne kadar basit olduğunu gösterir.

Sunucu Tarafında SMB Servisini Kontrol Etme

İlk adım her zaman servisin çalışıp çalışmadığını doğrulamaktır.

# SMB ile ilgili servislerin durumunu kontrol et
Get-Service -Name LanmanServer, LanmanWorkstation, MrxSmb* | 
    Select-Object Name, Status, StartType

# Servis çalışmıyorsa başlat
Start-Service -Name LanmanServer

# Otomatik başlamayı ayarla
Set-Service -Name LanmanServer -StartupType Automatic

Pratikte karşılaştığım bir senaryoda, bir Windows Server 2019 makinesinde LanmanServer servisi “Disabled” olarak işaretlenmişti. Bunun nedeni güvenlik sertleştirme (hardening) scriptinin yanlış yapılandırılmasıydı. Servis başlatılır başlatılmaz tüm şikayetler çözüldü.

SMB Paylaşımlarını Listelemek

Sunucuda hangi paylaşımların mevcut olduğunu görmek için:

# Tüm paylaşımları listele
Get-SmbShare | Select-Object Name, Path, Description, CurrentUsers

# Belirli bir paylaşımın detaylarını gör
Get-SmbShare -Name "SharedFiles" | Format-List *

# Aktif SMB bağlantılarını gör
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens

# Açık dosyaları listele
Get-SmbOpenFile | Select-Object ClientComputerName, ClientUserName, Path

SMB Protokol Versiyonu Sorunları

SMB versiyonu uyumsuzluğu son yıllarda en sık karşılaşılan sorunların başına geldi. WannaCry sonrasında birçok kurum SMBv1’i devre dışı bıraktı ancak eski cihazlar hala SMBv1 gerektiriyor.

Mevcut SMB Versiyon Yapılandırmasını Kontrol Etme

# SMBv1, SMBv2 ve SMBv3 durumlarını kontrol et
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol

# Sunucu tarafında hangi versiyonların aktif olduğunu gör
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

# İstemci tarafında SMB versiyon desteğini kontrol et
Get-SmbClientConfiguration | Select-Object EnableBandwidthThrottling, EnableLargeMaxWorkItems

SMB Versiyon Yönetimi

Gerçek dünyada bir üretim ortamında legacy bir yazıcı sunucusu SMBv1 gerektiriyordu ve SMBv1’i tamamen devre dışı bırakmak bu cihazı kullanılamaz hale getirdi. Bu gibi durumlarda dikkatli bir yaklaşım gerekir.

# SMBv1'i etkinleştir (sadece gerekli durumlarda ve geçici olarak)
Set-SmbServerConfiguration -EnableSMB1Protocol $true -Force

# SMBv2'yi etkinleştir (genellikle açık olmalı)
Set-SmbServerConfiguration -EnableSMB2Protocol $true -Force

# Hangi versiyon üzerinden bağlantı kurulduğunu kontrol et
Get-SmbConnection | Select-Object ServerName, ShareName, SmbInstance, Dialect

Önemli Not: SMBv1, EternalBlue gibi kritik açıklar barındırır. Production ortamında SMBv1 kullanmanız gerekiyorsa bu cihazları izole bir VLAN’a almanızı şiddetle tavsiye ederim.

Firewall Kurallarını Giderme

Firewall yanlış yapılandırması “Network Path Not Found” hatasının en yaygın nedenidir.

Windows Firewall Kurallarını Kontrol Etme

# SMB ile ilgili firewall kurallarını listele
Get-NetFirewallRule -DisplayGroup "File and Printer Sharing" | 
    Select-Object DisplayName, Enabled, Direction, Action

# SMB portlarının (445 ve 139) durumunu kontrol et
Test-NetConnection -ComputerName "dosyasunucusu01" -Port 445
Test-NetConnection -ComputerName "dosyasunucusu01" -Port 139

# Firewall profillerini kontrol et (Domain, Private, Public)
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction

Firewall Kurallarını Doğru Yapılandırma

# Dosya ve Yazıcı Paylaşımı kurallarını etkinleştir
Enable-NetFirewallRule -DisplayGroup "File and Printer Sharing"

# Sadece domain profili için SMB'yi aç (daha güvenli yaklaşım)
Set-NetFirewallRule -DisplayGroup "File and Printer Sharing" `
    -Profile Domain -Enabled True

# Belirli bir IP aralığından SMB erişimine izin ver
New-NetFirewallRule -DisplayName "SMB Internal Access" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 445 `
    -RemoteAddress "192.168.10.0/24" `
    -Action Allow `
    -Profile Domain

Bir finans şirketinde yaşadığım olayda, güvenlik ekibi tüm “Public” profil kurallarını devre dışı bırakmıştı. Sorun şuydu: laptoplar ofis dışında domaine bağlanamadığından profil “Public” olarak kalıyordu ve SMB paylaşımlarına erişilemiyordu. Çözüm sadece domain profili kurallarını etkinleştirmek değil, aynı zamanda profil tespitini düzeltmekti.

NTFS ve Paylaşım İzinleri

“Access Denied” hatası aldığınızda genellikle iki ayrı izin katmanını incelemeniz gerekir: Paylaşım İzinleri ve NTFS İzinleri. Efektif izin her ikisinin kesişimidir.

İzinleri PowerShell ile İnceleme

# Paylaşım izinlerini kontrol et
Get-SmbShareAccess -Name "SharedFiles"

# NTFS izinlerini kontrol et
$acl = Get-Acl -Path "D:SharedFiles"
$acl.Access | Select-Object IdentityReference, FileSystemRights, AccessControlType

# Belirli bir kullanıcı için efektif erişimi hesapla
# (Windows Server 2012 R2 ve üzeri)
$user = "DOMAINkullanici01"
$path = "D:SharedFiles"
$acl = Get-Acl $path
$acl.Access | Where-Object { $_.IdentityReference -eq $user }

İzin Sorunlarını Düzeltme

# Paylaşım iznine grup ekle
Grant-SmbShareAccess -Name "SharedFiles" `
    -AccountName "DOMAINIT-Ekibi" `
    -AccessRight Change `
    -Force

# NTFS iznini ayarla
$acl = Get-Acl "D:SharedFiles"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "DOMAINIT-Ekibi",
    "Modify",
    "ContainerInherit,ObjectInherit",
    "None",
    "Allow"
)
$acl.SetAccessRule($rule)
Set-Acl -Path "D:SharedFiles" -AclObject $acl

Pratik ipucu: Paylaşım iznini “Everyone – Full Control” olarak bırakıp erişim kontrolünü tamamen NTFS izinleriyle yönetmek, sorun gidermede hayatı kolaylaştırır. Paylaşım izinleri yerine NTFS izinleri her zaman daha granüler kontrol sağlar.

DNS ve NetBIOS Sorunları

“Network path not found” hataları bazen sunucunun gerçekten erişilemez olmadığını, sadece adının çözümlenemediğini gösterir.

İsim Çözümlemeyi Test Etme

:: DNS çözümlemesini test et
nslookup dosyasunucusu01
nslookup dosyasunucusu01.sirket.local

:: NetBIOS ad çözümlemesini test et
nbtstat -a dosyasunucusu01

:: Ping ile temel bağlantıyı doğrula
ping dosyasunucusu01
ping dosyasunucusu01.sirket.local

:: Trace ile paket yolunu gör
tracert dosyasunucusu01

Eğer IP adresiyle bağlantı kurulabiliyorsa ama isimle kurulamıyorsa sorun DNS veya NetBIOS tarafındadır. Bu durumda DNS kaydını kontrol edin:

# DNS kaydını kontrol et
Resolve-DnsName -Name "dosyasunucusu01" -Type A
Resolve-DnsName -Name "dosyasunucusu01.sirket.local" -Type A

# DNS önbelleğini temizle (istemci tarafında)
Clear-DnsClientCache

# Hosts dosyasına geçici giriş ekle (hızlı test için)
Add-Content -Path "C:WindowsSystem32driversetchosts" `
    -Value "192.168.10.50 dosyasunucusu01"

Kerberos ve Kimlik Doğrulama Sorunları

Domain ortamlarında Kerberos sorunları SMB erişim hatalarına yol açabilir. Bu durum genellikle “Logon failure” veya “The security database on the server does not have a computer account” şeklinde kendini gösterir.

Kerberos Sorunlarını Diagnose Etme

:: Mevcut Kerberos biletlerini listele
klist

:: Kerberos biletlerini temizle ve yeniden al
klist purge

:: Domain controller bağlantısını test et
nltest /sc_verify:SIRKET.LOCAL

:: Bilgisayar hesabı sağlığını kontrol et
Test-ComputerSecureChannel -Verbose
# Bilgisayar hesabını domain ile yeniden senkronize et
Reset-ComputerMachinePassword -Server "dc01.sirket.local" `
    -Credential (Get-Credential)

# Domain üyeliğini doğrula
Get-WmiObject -Class Win32_ComputerSystem | 
    Select-Object Name, Domain, PartOfDomain

Gerçek bir senaryoda, bir dosya sunucusunun bilgisayar hesabı parolası çakışmasından kaynaklanan Kerberos kimlik doğrulama sorunu vardı. Sunucu haftalarca kapalı kaldıktan sonra açılmıştı ve hesap parolasının süresi dolmuştu. Test-ComputerSecureChannel -Repair komutu sorunu çözdü.

SMB İmzalama Sorunları

SMB imzalama (signing) güvenlik açısından önemlidir ancak bazen uyumsuzluk sorunlarına yol açar. Özellikle Domain Controller’lar SMB imzalamayı zorunlu kılarken bazı cihazlar bunu desteklemez.

# Mevcut SMB imzalama yapılandırmasını kontrol et
Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EnableSecuritySignature

# SMB imzalamayı sunucu tarafında yapılandır
Set-SmbServerConfiguration -RequireSecuritySignature $false -Force
Set-SmbServerConfiguration -EnableSecuritySignature $true -Force

# İstemci tarafında SMB imzalama durumunu kontrol et
Get-SmbClientConfiguration | Select-Object RequireSecuritySignature, EnableSecuritySignature

Not: Production ortamında SMB imzalamayı devre dışı bırakmak güvenlik riskidir. Bunu sadece sorun tespiti için geçici olarak yapın, kalıcı çözüm olarak değil.

SMB Event Log Analizi

Sorunun kaynağını bulmak için Event Log analizi vazgeçilmezdir.

# SMB ile ilgili kritik ve hata olaylarını filtrele
Get-WinEvent -LogName "Microsoft-Windows-SMBServer/Operational" | 
    Where-Object { $_.LevelDisplayName -in "Error", "Warning" } |
    Select-Object TimeCreated, Id, Message -First 20

# Güvenlik log'larında başarısız oturum açmaları ara
Get-WinEvent -FilterHashtable @{
    LogName = "Security"
    Id = 4625  # Başarısız oturum açma
    StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message -First 10

# SMB istemci operasyonel loglarını incele
Get-WinEvent -LogName "Microsoft-Windows-SMBClient/Operational" |
    Where-Object { $_.LevelDisplayName -eq "Error" } |
    Select-Object TimeCreated, Id, Message -First 15

Event ID’leri genellikle sorunun tam kaynağını gösterir:

  • Event ID 3: SMB bağlantısı kesildi
  • Event ID 31: SMBv1 istek alındı (SMBv1 etkin değilse uyarı)
  • Event ID 551: Kimlik doğrulama başarısız
  • Event ID 1006: Disk kotası aşıldı

Ağ Seviyesinde İnceleme

Bazı durumlarda sorun ağ altyapısında olabilir. Özellikle çok katlı ağ yapılandırmalarında firewall veya yük dengeleyiciler SMB trafiğini engelleyebilir.

# Portscanning alternatifi - belirli portları test et
1..1024 | ForEach-Object {
    $result = Test-NetConnection -ComputerName "dosyasunucusu01" -Port $_ -WarningAction SilentlyContinue
    if ($result.TcpTestSucceeded) {
        Write-Host "Port $_ ACIK" -ForegroundColor Green
    }
} 

# Daha temiz yaklaşım - sadece SMB portları
foreach ($port in @(139, 445)) {
    $conn = Test-NetConnection -ComputerName "dosyasunucusu01" -Port $port
    Write-Host "Port $port : $($conn.TcpTestSucceeded)"
}

# Aktif SMB oturumlarında gecikme analizi
Get-SmbMultichannelConnection | Select-Object ServerName, ClientNetworkInterface, 
    ServerNetworkInterface, State, TransportType

SMB Multichannel Sorunları

Büyük ortamlarda SMB Multichannel performans sorunlarına yol açabilir. Devre dışı bırakarak sorunun kaynağını izole edebilirsiniz:

# SMB Multichannel durumunu kontrol et
Get-SmbMultichannelConstraint
Get-SmbMultichannelConnection

# Test amaçlı Multichannel'ı devre dışı bırak
Set-SmbServerConfiguration -EnableMultiChannel $false -Force
Set-SmbClientConfiguration -EnableMultiChannel $false -Force

# Tekrar etkinleştir
Set-SmbServerConfiguration -EnableMultiChannel $true -Force

Erişim Sorunlarında Kapsamlı Kontrol Scripti

Yukarıdaki tüm kontrolleri bir araya getiren bir script hazırlamak hem kendiniz hem de ekibiniz için büyük zaman tasarrufu sağlar.

# SMB-DiagCheck.ps1 - Kapsamli SMB sorun giderme scripti
param(
    [Parameter(Mandatory=$true)]
    [string]$ShareServer,
    
    [string]$ShareName = ""
)

Write-Host "=== SMB Tani Raporu ===" -ForegroundColor Cyan
Write-Host "Sunucu: $ShareServer" -ForegroundColor Yellow
Write-Host "Tarih: $(Get-Date)" -ForegroundColor Yellow
Write-Host ""

# 1. Temel baglanti testi
Write-Host "[1] Temel Baglanti Testi" -ForegroundColor Green
$ping = Test-Connection -ComputerName $ShareServer -Count 2 -Quiet
Write-Host "  ICMP Ping: $(if($ping){'BASARILI'}else{'BASARISIZ'})"

$smb445 = Test-NetConnection -ComputerName $ShareServer -Port 445 -WarningAction SilentlyContinue
Write-Host "  SMB Port 445: $(if($smb445.TcpTestSucceeded){'ACIK'}else{'KAPALI'})"

$smb139 = Test-NetConnection -ComputerName $ShareServer -Port 139 -WarningAction SilentlyContinue
Write-Host "  NetBIOS Port 139: $(if($smb139.TcpTestSucceeded){'ACIK'}else{'KAPALI'})"

# 2. DNS cozumlemesi
Write-Host "`n[2] DNS Cozumleme" -ForegroundColor Green
try {
    $dns = Resolve-DnsName -Name $ShareServer -ErrorAction Stop
    Write-Host "  DNS Cozumleme: BASARILI - IP: $($dns[0].IPAddress)"
} catch {
    Write-Host "  DNS Cozumleme: BASARISIZ - $($_.Exception.Message)" -ForegroundColor Red
}

# 3. SMB servisleri (yerel sunucuda calistiriliyorsa)
Write-Host "`n[3] SMB Servisleri (Yerel)" -ForegroundColor Green
$services = Get-Service -Name LanmanServer, LanmanWorkstation -ErrorAction SilentlyContinue
foreach ($svc in $services) {
    $color = if ($svc.Status -eq "Running") { "White" } else { "Red" }
    Write-Host "  $($svc.Name): $($svc.Status)" -ForegroundColor $color
}

# 4. SMB protokol versiyonlari
Write-Host "`n[4] SMB Protokol Versiyonlari (Sunucu)" -ForegroundColor Green
$smbConfig = Get-SmbServerConfiguration
Write-Host "  SMBv1: $($smbConfig.EnableSMB1Protocol)"
Write-Host "  SMBv2/v3: $($smbConfig.EnableSMB2Protocol)"

# 5. Son hatalar
Write-Host "`n[5] Son 10 SMB Hata Olaylari" -ForegroundColor Green
$events = Get-WinEvent -LogName "Microsoft-Windows-SMBServer/Operational" `
    -ErrorAction SilentlyContinue | 
    Where-Object { $_.LevelDisplayName -eq "Error" } |
    Select-Object TimeCreated, Id, Message -First 5
    
if ($events) {
    $events | ForEach-Object { Write-Host "  [$($_.TimeCreated)] ID:$($_.Id)" -ForegroundColor Yellow }
} else {
    Write-Host "  Son 24 saatte kritik hata bulunamadi." -ForegroundColor Gray
}

Write-Host "`n=== Tani Tamamlandi ===" -ForegroundColor Cyan

Kota ve Disk Alanı Sorunları

Kullanıcılar bazen dosya kopyalayamıyor veya yazamıyor ancak hata mesajı “Access Denied” olarak görünüyor. Bu genellikle disk kotası veya dolmuş disk nedeniyledir.

# Disk alanı kontrolü
Get-PSDrive -PSProvider FileSystem | Select-Object Name, Used, Free, @{
    Name="Free GB"
    Expression={[math]::Round($_.Free/1GB,2)}
}

# FSrm kotalarini kontrol et (File Server Resource Manager)
if (Get-Module -ListAvailable FSRM) {
    Get-FsrmQuota | Select-Object Path, Size, Usage, SoftLimit
}

# Belirli bir kullanici icin kota durumunu kontrol et
Get-FsrmQuotaUsage -Path "D:UserHomekullanici01"

Sonuç

SMB sorun giderme, katmanlı bir yapıya sahip olduğu için sistematik yaklaşım şarttır. Sorunlara rastgele çözüm uygulamak hem zaman kaybettirir hem de yeni sorunlara kapı aralar.

Her zaman şu sırayla ilerleyin: önce temel bağlantı (ping, port testi), sonra servis durumu, ardından kimlik doğrulama ve izinler, en son olarak protokol düzeyindeki ince ayarlar. Event log’ları asla görmezden gelmeyin çünkü Windows SMB hatalarını genellikle çok detaylı şekilde kaydeder.

Production ortamlarında yaptığınız her değişikliği, özellikle SMB imzalama ve versiyon ayarlarını, belgeleyin. “Geçici bir test” olarak yaptığınız bir değişiklik aylar sonra güvenlik açığına dönüşebilir. SMBv1’i bir daha açmak zorunda kalıyorsanız bu bir geçici yama değil, o eski sistemin yeni bir protokole taşınması için proje başlatma sinyalidir.

Son olarak, yukarıdaki teşhis scriptini kendi ortamınıza uyarlayıp ekibinizle paylaşın. Bir sonraki SMB sorunu geldiğinde “ilk 5 dakikada ne kontrol edeceğiz” sorusunun cevabı hazır olsun.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir