PowerShell ile SMB Paylaşımı Oluşturma ve Yönetme

Ortam yönetiminde SMB paylaşımları hâlâ en kritik bileşenlerden biri. Kullanıcıların dosyalara erişimi, departman klasörleri, yazıcı paylaşımları derken bunların hepsini GUI üzerinden tek tek yapmak hem yorucu hem de hata yapmaya açık. PowerShell ile bu işlemleri scriptleyebilir, tekrarlanabilir ve denetlenebilir hale getirebilirsiniz. Bu yazıda SMB paylaşımı oluşturmaktan izin yönetimine, monitoring’den otomatik temizlemeye kadar gerçek dünya senaryolarıyla konuyu ele alacağız.

SMB ve PowerShell: Neden Bu İkili?

Windows ortamlarında dosya paylaşımı denilince akla ilk gelen protokol SMB (Server Message Block). Windows Server 2012 ile birlikte gelen SmbShare modülü, bu protokolü PowerShell üzerinden tam anlamıyla yönetmenizi sağlıyor. Eski yöntem olan net share komutlarına kıyasla çok daha fazla esneklik sunuyor ve özellikle toplu işlemlerde hayat kurtarıyor.

Önce ortamınızda SmbShare modülünün yüklü olup olmadığını kontrol edin:

Get-Module -ListAvailable -Name SmbShare
Import-Module SmbShare
Get-Command -Module SmbShare

Modülü import ettikten sonra elliden fazla komuta erişiminiz olacak. Bunların hepsiyle uğraşmak yerine günlük hayatta en çok kullandıklarımıza odaklanacağız.

Temel SMB Paylaşımı Oluşturma

En basit kullanım senaryosundan başlayalım. Bir departman klasörü oluşturup paylaşıma açacağız:

# Önce fiziksel klasörü oluştur
New-Item -ItemType Directory -Path "D:SharesMuhasebe" -Force

# Sonra SMB paylaşımını oluştur
New-SmbShare -Name "Muhasebe" `
             -Path "D:SharesMuhasebe" `
             -Description "Muhasebe Departmani Paylasimi" `
             -FullAccess "DOMAINMuhasebeYoneticileri" `
             -ChangeAccess "DOMAINMuhasebePersnel" `
             -ReadAccess "DOMAINDenetciler" `
             -FolderEnumerationMode AccessBased

Burada dikkat etmeniz gereken birkaç parametre var:

  • -Name: Ağda görünecek paylaşım adı
  • -Path: Fiziksel dizin yolu
  • -Description: Paylaşım açıklaması, sonradan bulmayı kolaylaştırır
  • -FullAccess: Tam erişim verilecek kullanıcı veya gruplar
  • -ChangeAccess: Okuma ve yazma izni ama silme ve izin değişikliği yok
  • -ReadAccess: Sadece okuma izni
  • -FolderEnumerationMode: AccessBased seçildiğinde kullanıcılar sadece erişebildikleri klasörleri görür, bu güvenlik açısından önemli

AccessBased Enumeration (ABE) özellikle büyük ortamlarda kritik. Kullanıcılar paylaşım içinde yalnızca kendi erişim yetkisi olan klasörleri görebiliyor, diğerleri onlara sanki yokmuş gibi görünüyor. Bu hem güvenlik hem de kullanıcı deneyimi açısından büyük fark yaratıyor.

Mevcut Paylaşımları Listeleme ve İnceleme

Sunucudaki tüm paylaşımları görmek için:

# Tüm paylaşımları listele
Get-SmbShare

# Sadece belirli özellikleri getir
Get-SmbShare | Select-Object Name, Path, Description, ScopeName, ShareState

# Gizli paylaşımları da dahil et ($ ile bitenler)
Get-SmbShare | Where-Object { $_.Name -notlike "*$" } | Format-Table -AutoSize

# Belirli bir paylaşımın detayları
Get-SmbShare -Name "Muhasebe" | Format-List *

Paylaşıma bağlı olan aktif oturumları görmek istiyorsanız:

# Aktif SMB oturumları
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens, SecondsExists

# Belirli bir kullanıcının oturumları
Get-SmbSession | Where-Object { $_.ClientUserName -like "*ahmet*" }

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

Bu komutlar özellikle troubleshooting sırasında çok işe yarıyor. Bir dosyanın “başka biri tarafından kullanılıyor” hatasını aldığınızda hangi kullanıcının o dosyayı açık tuttuğunu anında görebiliyorsunuz.

İzin Yönetimi

SMB paylaşımlarında iki katmanlı izin yapısı var: Share Permission ve NTFS Permission. İkisini de doğru ayarlamak şart. Genel tavsiye share permission’ı geniş tutup NTFS ile kısıtlamak, ama her ortamın kendine özgü gereksinimleri var.

# Mevcut share izinlerini görüntüle
Get-SmbShareAccess -Name "Muhasebe"

# Yeni izin ekle
Grant-SmbShareAccess -Name "Muhasebe" `
                     -AccountName "DOMAINYeniKullanici" `
                     -AccessRight Read `
                     -Force

# İzin güncelle (Read'den Change'e yükselt)
Grant-SmbShareAccess -Name "Muhasebe" `
                     -AccountName "DOMAINYeniKullanici" `
                     -AccessRight Change `
                     -Force

# İzin kaldır
Revoke-SmbShareAccess -Name "Muhasebe" `
                      -AccountName "DOMAINYeniKullanici" `
                      -Force

NTFS izinlerini de PowerShell ile yönetmek için:

# Mevcut NTFS izinlerini görüntüle
$acl = Get-Acl -Path "D:SharesMuhasebe"
$acl.Access | Format-Table IdentityReference, FileSystemRights, AccessControlType, IsInherited

# Yeni NTFS izni ekle
$acl = Get-Acl -Path "D:SharesMuhasebe"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "DOMAINYeniGrup",
    "Modify",
    "ContainerInherit,ObjectInherit",
    "None",
    "Allow"
)
$acl.SetAccessRule($rule)
Set-Acl -Path "D:SharesMuhasebe" -AclObject $acl

Toplu Paylaşım Oluşturma Senaryosu

Gerçek hayat senaryosuna geçelim. Yeni bir ofis açıyorsunuz ve her departman için paylaşım oluşturmanız gerekiyor. 10-15 departman varsa bunu tek tek yapmak yerine bir script yazın:

# Departman paylaşımlarını toplu oluşturma scripti
$BasePath = "D:Shares"
$Domain = "CONTOSO"

$Departments = @(
    @{Name="Muhasebe"; Groups=@{Full="MuhasebeYonetici"; Change="MuhasebePers"; Read="FinansDenetci"}},
    @{Name="IK"; Groups=@{Full="IKYonetici"; Change="IKPers"; Read="YonetimKurulu"}},
    @{Name="BT"; Groups=@{Full="BTYonetici"; Change="BTDestek"; Read="TumKullanicilar"}},
    @{Name="Satis"; Groups=@{Full="SatisYonetici"; Change="SatisPers"; Read="SatisRapor"}},
    @{Name="Pazarlama"; Groups=@{Full="PazarlamaYonetici"; Change="PazarlamaPers"; Read="SatisYonetici"}}
)

foreach ($Dept in $Departments) {
    $FullPath = Join-Path $BasePath $Dept.Name
    
    # Klasör oluştur
    if (-not (Test-Path $FullPath)) {
        New-Item -ItemType Directory -Path $FullPath -Force | Out-Null
        Write-Host "Klasor olusturuldu: $FullPath" -ForegroundColor Green
    }
    
    # Paylaşım zaten var mı kontrol et
    $ExistingShare = Get-SmbShare -Name $Dept.Name -ErrorAction SilentlyContinue
    
    if ($null -eq $ExistingShare) {
        try {
            New-SmbShare -Name $Dept.Name `
                         -Path $FullPath `
                         -Description "$($Dept.Name) Departmani Dosya Paylasimi" `
                         -FullAccess "$Domain$($Dept.Groups.Full)" `
                         -ChangeAccess "$Domain$($Dept.Groups.Change)" `
                         -ReadAccess "$Domain$($Dept.Groups.Read)" `
                         -FolderEnumerationMode AccessBased `
                         -ErrorAction Stop
            
            Write-Host "Paylasim olusturuldu: $($Dept.Name)" -ForegroundColor Green
        }
        catch {
            Write-Host "HATA - $($Dept.Name): $($_.Exception.Message)" -ForegroundColor Red
        }
    }
    else {
        Write-Host "Paylasim zaten mevcut: $($Dept.Name)" -ForegroundColor Yellow
    }
}

Write-Host "`nIslem tamamlandi." -ForegroundColor Cyan

Bu script çalıştığında her departman için hem klasörü hem paylaşımı oluşturuyor, var olanları atlıyor ve her adımda size geri bildirim veriyor. Bunu bir müşteride çalıştırdığımda 15 departmanı 3 dakikada hazırladım, GUI ile en az 45 dakika sürerdi.

SMB Paylaşım Özelliklerini Güncelleme

Var olan paylaşımı değiştirmek için Set-SmbShare kullanıyoruz:

# Paylaşım açıklamasını güncelle
Set-SmbShare -Name "Muhasebe" -Description "Muhasebe ve Finans Departmani - Guncellendi" -Force

# Eş zamanlı bağlantı sayısını sınırla
Set-SmbShare -Name "Muhasebe" -ConcurrentUserLimit 50 -Force

# Önbelleğe alma (caching) ayarını değiştir
Set-SmbShare -Name "Muhasebe" -CachingMode None -Force

# ABE'yi sonradan etkinleştir
Set-SmbShare -Name "Muhasebe" -FolderEnumerationMode AccessBased -Force

# Şifrelemeyi etkinleştir (SMB 3.0+)
Set-SmbShare -Name "Muhasebe" -EncryptData $true -Force

-EncryptData parametresi SMB 3.0 özelliği ve özellikle hassas departmanlar için (İK, Muhasebe, Hukuk) mutlaka açık olması gerekiyor. Ağ trafiğini şifrelediği için performansa küçük bir etkisi var ama güvenlik kazancı buna değiyor.

Paylaşım Monitoring ve Raporlama

Ortamı izlemek ve raporlamak için de güzel scriptler yazabilirsiniz. Ben genellikle haftalık olarak çalışacak şekilde zamanlanmış görev olarak kuruyorum:

# SMB Paylaşım Durum Raporu
function Get-SmbShareReport {
    param(
        [string]$OutputPath = "C:RaporlarSMBRapor_$(Get-Date -Format 'yyyyMMdd').txt"
    )
    
    $Report = @()
    $Report += "=" * 60
    $Report += "SMB PAYLASIM RAPORU - $(Get-Date -Format 'dd.MM.yyyy HH:mm')"
    $Report += "Sunucu: $env:COMPUTERNAME"
    $Report += "=" * 60
    $Report += ""
    
    # Tüm özel paylaşımları al (admin paylaşımları hariç)
    $Shares = Get-SmbShare | Where-Object { 
        $_.Name -notlike "*$" -and 
        $_.Name -ne "IPC$" 
    }
    
    $Report += "TOPLAM PAYLASIM SAYISI: $($Shares.Count)"
    $Report += ""
    
    foreach ($Share in $Shares) {
        $Report += "Paylasim: $($Share.Name)"
        $Report += "  Yol      : $($Share.Path)"
        $Report += "  Durum    : $($Share.ShareState)"
        $Report += "  Aciklama : $($Share.Description)"
        
        # Boyut hesapla (varsa)
        if (Test-Path $Share.Path) {
            $Size = (Get-ChildItem -Path $Share.Path -Recurse -ErrorAction SilentlyContinue | 
                     Measure-Object -Property Length -Sum).Sum
            $SizeGB = [math]::Round($Size / 1GB, 2)
            $Report += "  Boyut    : $SizeGB GB"
        }
        else {
            $Report += "  Boyut    : YOL BULUNAMADI!"
        }
        
        # Aktif baglantilar
        $Sessions = Get-SmbSession | Where-Object { 
            (Get-SmbOpenFile | Where-Object { $_.SessionId -eq $_.SessionId }).ShareRelativePath -like "$($Share.Name)*" 
        }
        $Report += "  Izinler  :"
        
        $Permissions = Get-SmbShareAccess -Name $Share.Name
        foreach ($Perm in $Permissions) {
            $Report += "    - $($Perm.AccountName): $($Perm.AccessRight)"
        }
        
        $Report += ""
    }
    
    # Dosyaya yaz
    $Report | Out-File -FilePath $OutputPath -Encoding UTF8
    Write-Host "Rapor olusturuldu: $OutputPath" -ForegroundColor Green
    
    return $Report
}

# Fonksiyonu çalıştır
Get-SmbShareReport

Eski ve Kullanılmayan Paylaşımları Tespit Etme

Ortamlarda zamanla kullanılmayan paylaşımlar birikir. Bunları temizlemek hem güvenlik hem de yönetim açısından önemli:

# 90 günden fazla süredir erişilmemiş paylaşımları bul
$Threshold = (Get-Date).AddDays(-90)

$StaleShares = Get-SmbShare | Where-Object { 
    $_.Name -notlike "*$" 
} | ForEach-Object {
    $SharePath = $_.Path
    $ShareName = $_.Name
    
    if (Test-Path $SharePath) {
        $LastAccess = (Get-Item $SharePath).LastAccessTime
        $LastWrite = (Get-Item $SharePath).LastWriteTime
        
        [PSCustomObject]@{
            ShareName    = $ShareName
            Path         = $SharePath
            LastAccess   = $LastAccess
            LastWrite    = $LastWrite
            StaleAccess  = ($LastAccess -lt $Threshold)
            StaleWrite   = ($LastWrite -lt $Threshold)
        }
    }
} | Where-Object { $_.StaleAccess -eq $true -and $_.StaleWrite -eq $true }

Write-Host "90 Gunden Eski Paylasimlar:" -ForegroundColor Yellow
$StaleShares | Format-Table ShareName, LastAccess, LastWrite -AutoSize

# Bunları bir log dosyasına yaz (silmeden önce mutlaka kaydet)
$StaleShares | Export-Csv -Path "C:RaporlarEskiPaylasimlar.csv" -NoTypeInformation -Encoding UTF8

Önemli uyarı: Bu listedeki paylaşımları hemen silmeyin. Önce ilgili departman yöneticileriyle konuşun. Bazı paylaşımlar yedekleme amaçlı kullanılıyor olabilir ve erişim görünmüyor ama önemli.

Paylaşımı Kaldırma

Güvenli bir şekilde paylaşım kaldırmak için önce aktif bağlantıları kontrol edin:

# Paylaşıma bağlı oturumları kontrol et
$ShareName = "EskiPaylasim"
$ActiveSessions = Get-SmbOpenFile | Where-Object { 
    $_.ShareRelativePath -like "$ShareName*" 
}

if ($ActiveSessions.Count -gt 0) {
    Write-Host "UYARI: $($ActiveSessions.Count) aktif baglanti var!" -ForegroundColor Yellow
    $ActiveSessions | Select-Object ClientUserName, Path | Format-Table
    
    $Confirm = Read-Host "Yine de devam etmek istiyor musunuz? (E/H)"
    if ($Confirm -ne "E") {
        Write-Host "Islem iptal edildi." -ForegroundColor Cyan
        return
    }
}

# Paylaşımı kaldır (klasörü silmez, sadece paylaşımı)
Remove-SmbShare -Name $ShareName -Force
Write-Host "Paylasim kaldirildi: $ShareName" -ForegroundColor Green

Uzak Sunucularda SMB Yönetimi

Tek bir sunucuda değil de birden fazla sunucuyu yönetiyorsanız:

# Uzak sunucuda paylaşım oluştur
$RemoteServer = "FileServer02"
$Credential = Get-Credential

Invoke-Command -ComputerName $RemoteServer -Credential $Credential -ScriptBlock {
    New-SmbShare -Name "Ortak" `
                 -Path "E:SharesOrtak" `
                 -FullAccess "DOMAINBTYonetici" `
                 -ChangeAccess "DOMAINTumKullanicilar" `
                 -FolderEnumerationMode AccessBased
}

# Birden fazla sunucuda aynı anda paylaşımları listele
$Servers = @("FileServer01", "FileServer02", "FileServer03")

$AllShares = Invoke-Command -ComputerName $Servers -ScriptBlock {
    Get-SmbShare | Where-Object { $_.Name -notlike "*$" } | 
    Select-Object Name, Path, PSComputerName
}

$AllShares | Sort-Object PSComputerName, Name | Format-Table -AutoSize

SMB Güvenlik Ayarları

Güvenlik tarafını da ihmal etmeyelim. SMB1 protokolü artık güvenli kabul edilmiyor ve kapatılması gerekiyor:

# SMB1 durumunu kontrol et
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol

# SMB1'i devre dışı bırak (ÖNEMLİ: Önce eski sistemleri kontrol edin)
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force

# SMB imzalamayı zorunlu kıl
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force

# Misafir erişimini engelle
Set-SmbServerConfiguration -EnableInsecureGuestLogons $false -Force

# Sunucu adı açıklamasını gizle (güvenlik hardeningi)
Set-SmbServerConfiguration -ServerHidden $true -AnnounceServer $false -Force

# Yapılandırmayı doğrula
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol, 
    RequireSecuritySignature, EnableInsecureGuestLogons | Format-List

SMB1’i kapatmadan önce ortamınızda eski yazıcılar, NAS cihazlar veya Windows XP/2003 sistemler var mı kontrol edin. Bunlar SMB1’e bağımlı olabilir ve bağlantı sorunu yaşanabilir.

Sonuç

PowerShell ile SMB yönetimi, GUI’ye kıyasla başlangıçta daha zorlu görünse de bir kez öğrendiğinizde geri dönmek istemiyorsunuz. Scriptleri yazıp kaydettikten sonra hem tekrarlanabilirlik elde ediyorsunuz hem de değişiklik geçmişini tutabiliyorsunuz (Git ile versiyon kontrolü yapmayı da düşünün).

Özetlemek gerekirse:

  • New-SmbShare ile yeni paylaşım oluşturun, -FolderEnumerationMode AccessBased eklemeyi unutmayın
  • Get-SmbShare, Get-SmbSession, Get-SmbOpenFile ile ortamı izleyin
  • Grant-SmbShareAccess ve Revoke-SmbShareAccess ile izinleri yönetin
  • SMB1’i kapatın, şifrelemeyi ve imzalamayı etkinleştirin
  • Toplu işlemler için array ve foreach döngüsü kullanın, manuel işlemi minimuma indirin
  • Düzenli raporlar oluşturun ve eski paylaşımları temizleyin

Bu scriptleri kendi ortamınıza uyarlayarak kullanabilirsiniz. Değişken isimlerini ve domain adlarını güncellemek yeterli olacaktır. Sorularınız olursa yorum bölümünde paylaşın.

Yorum yapın