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:
AccessBasedseç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.