
Hazırladığım scriptin temel amaçları:
ACL ve Owner Bilgilerini Toplama:
Script önce eski ve yeni sunucudaki dosyaların ACL ve sahiplik bilgilerini toplar.

Eksik İzinleri ve Sahiplik Farklarını Karşılaştırma:
Toplanan bilgiler karşılaştırılarak eksik izinler ve sahiplik farklılıkları belirlenir.
Eksik İzinleri Yeni Sunucuya Ekleme:
Sadece eksik izinler, mevcut izinlere dokunmadan yeni sunucuya eklenir.
Owner Bilgilerini Güncelleme:
Eğer sahiplik bilgisi farklıysa, eski sunucudaki bilgi yeni sunucuya güncellenir.
Loglama:
Tüm işlemler bir log dosyasına kaydedilerek sürecin okunabilirliğini ve takibini kolaylaştırması sağlanır.
Bu scripti hazırlarken aşağıdaki adımları takip ettim:
İzinlerin ve Sahiplik Bilgilerinin Toplanması:Get-Acl komutuyla dosyaların ACL ve owner bilgilerini aldım.
Eksik İzinlerin Kontrolü:
Yeni sunucudaki izinleri tek tek kontrol ederek, eksik olanları belirledim.
ACL Ekleme ve Owner Güncelleme:
Eksik izinleri AddAccessRule yöntemiyle, sahiplik bilgisini ise SetOwner yöntemiyle güncelledim.
Hata Yönetimi ve Loglama:
İşlemler sırasında oluşabilecek hataları yönetmek ve detaylı bir izlenebilirlik sağlamak için loglama ekledim.
<#
.SYNOPSIS
Eski ve yeni sunucudaki ACL'leri ve owner bilgilerini karşılaştırır, eksik izinleri ekler ve owner bilgilerini günceller. İşlemleri bir log dosyasına kaydeder.
.DESCRIPTION
Bu script:
- Eski ve yeni sunucudan ACL ve owner bilgilerini toplar.
- Eksik ACL'leri tespit eder ve sadece eksik olan izinleri yeni sunucuya ekler.
- Owner bilgilerinde farklılık varsa, eski sunucudaki owner bilgilerini yeni sunucuya uygular.
- Mevcut izinlere dokunmaz.
- İşlem detaylarını bir log dosyasına kaydeder.
.AUTHOR
Elif UÇHAN
.DATE
10 Ocak 2025
.NOTES
Log dosyası işlemlerin izlenebilirliğini artırır.
Test ortamında çalıştırılmadan önce gerçek ortamda uygulanması önerilmez.
#>
# Log dosyası oluştur
$logFilePath = "C:MigrationLogsACL_Update_Log.txt"
Out-File -FilePath $logFilePath -Force
# Loglama fonksiyonu
function Write-Log {
param (
[string]$Message
)
$timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
$entry = "$timestamp - $Message"
$entry | Out-File -FilePath $logFilePath -Append
Write-Host $entry
}
# Eski ve yeni sunucu yolları
$oldPath = "\xxxxxxxxxx"
$newPath = "C:xxxxxxxxxx"
# Eski sunucu ACL'lerini ve owner bilgilerini al
Write-Log "Eski ve yeni sunucu ACL'leri alınmaya başlanıyor..."
$oldACLs = Get-ChildItem -Recurse -Path $oldPath | ForEach-Object {
$acl = Get-Acl $_.FullName
[PSCustomObject]@{
Path = $_.FullName.Replace($oldPath, $newPath) # Yol eşlemesi
ACL = $acl.Access
Owner = $acl.Owner
}
}
# Yeni sunucu ACL'lerini ve owner bilgilerini al
$newACLs = Get-ChildItem -Recurse -Path $newPath | ForEach-Object {
$acl = Get-Acl $_.FullName
[PSCustomObject]@{
Path = $_.FullName
ACL = $acl.Access
Owner = $acl.Owner
}
}
Write-Log "Eski ve yeni sunucu ACL'leri ve owner bilgileri alındı."
# Eksik izinleri ve owner farklarını kontrol et
Write-Log "Eksik izinler ve owner farkları karşılaştırılıyor..."
$comparison = foreach ($oldItem in $oldACLs) {
$newItem = $newACLs | Where-Object { $_.Path -eq $oldItem.Path }
if ($newItem) {
$missingACLs = @()
foreach ($oldRule in $oldItem.ACL) {
# Yeni sunucuda aynı ACL var mı kontrol et
$exists = $newItem.ACL | Where-Object {
$_.IdentityReference -eq $oldRule.IdentityReference -and
$_.FileSystemRights -eq $oldRule.FileSystemRights -and
$_.InheritanceFlags -eq $oldRule.InheritanceFlags -and
$_.PropagationFlags -eq $oldRule.PropagationFlags -and
$_.AccessControlType -eq $oldRule.AccessControlType
}
if (-not $exists) {
$missingACLs += $oldRule
}
}
$ownerMismatch = $oldItem.Owner -ne $newItem.Owner
[PSCustomObject]@{
Path = $oldItem.Path
MissingACL = $missingACLs
UpdateOwner = $ownerMismatch
NewOwner = $oldItem.Owner
}
} else {
Write-Log "Yeni sunucuda bu yol bulunamadı: $($oldItem.Path)"
}
}
Write-Log "Eksik izinler ve owner farkları karşılaştırıldı."
# Eksik izinleri ve owner farklarını düzelt
foreach ($item in $comparison) {
Write-Log "İşleniyor: $($item.Path)"
$acl = Get-Acl -Path $item.Path
# Eksik ACL'leri ekle
foreach ($rule in $item.MissingACL) {
try {
$identity = [System.Security.Principal.NTAccount]$rule.IdentityReference
$accessRule = [System.Security.AccessControl.FileSystemAccessRule]::new(
$identity,
$rule.FileSystemRights,
$rule.InheritanceFlags,
$rule.PropagationFlags,
$rule.AccessControlType
)
$acl.AddAccessRule($accessRule)
Write-Log "Eklendi: $($rule.IdentityReference) - Yetki: $($rule.FileSystemRights) - Dosya: $($item.Path)"
} catch {
Write-Log "ACL ekleme hatası: $($_.Exception.Message)"
}
}
# Owner'ı güncelle
if ($item.UpdateOwner) {
try {
$acl.SetOwner([System.Security.Principal.NTAccount]$item.NewOwner)
Write-Log "Owner güncellendi: $($item.NewOwner) - Dosya: $($item.Path)"
} catch {
Write-Log "Owner güncelleme hatası: $($_.Exception.Message)"
}
}
# ACL'yi güncelle
try {
Set-Acl -Path $item.Path -AclObject $acl
Write-Log "ACL güncellendi: $($item.Path)"
} catch {
Write-Log "ACL güncelleme hatası: $($_.Exception.Message)"
}
}
Write-Log "İşlem tamamlandı. Log dosyasını kontrol edin: $logFilePath"