Mengapa DFSR tidak mereplikasi beberapa file dan cara mengatasinya


Seperti yang diketahui banyak orang, Anda dapat mengonfigurasi pengecualian dalam bentuk topeng file di properti folder yang direplikasi - dan kemudian layanan tidak akan mereplikasi file yang cocok dengan topeng yang ditentukan. Tetapi tidak semua orang tahu bahwa file memiliki atribut "sementara", dan DFSR tidak memproses file tersebut dengan desain. Dan jika ini tidak diperhitungkan, mungkin terjadi bahwa isi folder DFSR Anda menjadi tidak sinkron, meskipun semuanya akan bersih dan indah di log layanan, dan ini mungkin muncul pada saat yang paling tidak menguntungkan. Masalahnya sendiri dan solusinya telah dianalisis di Internet lebih dari sekali, tujuan artikel ini adalah untuk menyelesaikan solusi yang dibuat sebelumnya, menambah fleksibilitas dan kenyamanan untuk itu. Untuk siapa ini relevan - saya bertanya di bawah kucing.

Topiknya telah dibahas di Internet lebih dari sekali, misalnya, di blog resmi , di sini dan di HabrΓ© sendiri . Karena itu, saya tidak akan mengulangi lagi, tetapi saya akan langsung ke intinya. Solusi asli adalah skrip PowerShell yang mengatur ulang atribut "sementara" untuk semua file dalam folder tertentu. Mengambilnya sebagai dasar, saya menulis versi saya sendiri, yang menemukan folder yang direplikasi pada server target dan menjalankan masing-masing, mengatur ulang atribut masalah, dan kemudian mengirimkan laporan tentang file yang ditemukan ke email. Juga menambahkan dukungan untuk jalur panjang (membutuhkan PowerShell versi 5).

Agar skrip berfungsi, Anda memerlukan alat manajemen layanan DFS (secara default mereka diinstal bersama dengan penambahan peran Replikasi DFS). Jika mereka tidak tersedia di server tujuan, jalankan cmdlet ini:

Install-WindowsFeature RSAT-DFS-Mgmt-Con 

Dan ini skripnya sendiri:

TempAttrFixer.ps1
 Param( #   [parameter(Mandatory=$false)][String]$OutDir ) $SMTPServer = "mail.mydomain.com" $MailFrom = "sender@mydomain.com" $MailTo = "recipient@mydomain.com" Function ConvertTo-LiteralPath { #      LiteralPath Param( [parameter(Mandatory=$true)][String]$Path ) #    UNC If ($Path.Substring(0,2) -eq "\\") { Return ("\\?\UNC" + $Path.Remove(0,1)) } Else { Return "\\?\$Path" } } $StartTime = Get-Date $Error.Clear() If (!$OutDir) { $OutDir = (Get-WmiObject Win32_OperatingSystem).SystemDrive +"\TempAttrFixer_Report" } #   ,    $FoldersToScan = @(Get-DfsrMembership -ComputerName $env:COMPUTERNAME | Sort-Object GroupName, FolderName).ContentPath $LogFileName = "$env:COMPUTERNAME" + "_TempFiles_" + (Get-Date -Format "yyyy-MM-dd-HH-mm-ss") + ".csv" $LogFilePath = "$OutDir\$LogFileName" $Delimiter = "`t" $FilesCount = 0 If (!(Test-Path $OutDir -PathType Container)) { New-Item -ItemType Directory -Force -Path $OutDir | Out-Null } ForEach ($Folder in $FoldersToScan) { # PowerShell 5.1,      LireralPath Write-Output "Scanning `"$Folder`"..." Get-ChildItem -LiteralPath (ConvertTo-LiteralPath $Folder) -Recurse | ForEach-Object -Process { if (($_.Attributes -band 0x100) -eq 0x100) { $FilesCount += 1 $Entry = $_.FullName + $Delimiter + $_.GetAccessControl().Owner + "`r`n" $Entry $Entry | Out-File -FilePath $LogFilePath -Encoding unicode -Append -NoNewline $_.Attributes = ($_.Attributes -band 0xFEFF) } } } $FinishTime = Get-Date $TimeSpan = $FinishTime - $StartTime Write-Output ("Done, errors: " + $Error.Count) $Encoding = [System.Text.Encoding]::Unicode If ($FilesCount -gt 0) { $MessageBody = $null $Subject = "     " $MessageBody += " : $env:COMPUTERNAME`r`n" $MessageBody += "  : " + $TimeSpan.ToString() + "`r`n" $MessageBody += "   `"$LogFilePath`"`r`n" Send-MailMessage -SmtpServer $SMTPServer -From $MailFrom -Subject $Subject -Encoding $Encoding -To $MailTo -Body $MessageBody -Attachments $LogFilePath } Else { $MessageBody = $null $Subject = "      " $MessageBody += " : $env:COMPUTERNAME`r`n" $MessageBody += "  : " + $TimeSpan.ToString() + "`r`n" Send-MailMessage -SmtpServer $SMTPServer -From $MailFrom -Subject $Subject -Encoding $Encoding -To $MailTo -Body $MessageBody } #,  -    If ($Error.Count -gt 0) { $MessageBody = $null $Subject = "     " $MessageBody += " : $env:COMPUTERNAME`r`n" $MessageBody += " : $env:UserName`r`n" $MessageBody += " :`r`n" $MessageBody += $Error[0] Send-MailMessage -SmtpServer $SMTPServer -From $MailFrom -Subject $Subject -Encoding $Encoding -To $MailTo -Body $MessageBody } 


Kami mengoreksi nilai variabel yang bertanggung jawab atas peringatan email, dan menambahkan skrip ke penjadwal:

 powershell.exe -NoLogo -ExecutionPolicy Bypass -NoProfile -File "<  >\TempAttrFixer.ps1" 

Cara termudah untuk menjalankan tugas dari dalam SISTEM, tetapi jika Anda memiliki tingkat paranoia yang meningkat dan pendekatan serius terhadap keamanan informasi dipraktikkan, Anda dapat menggunakan akun terpisah, memberinya hak istimewa untuk login sebagai pekerjaan batch dan hak untuk memodifikasi file dalam folder yang direplikasi.

Alih-alih laporan email (atau sebagai tambahannya), Anda dapat mengonfigurasi skrip untuk berinteraksi dengan zabbix atau sistem pemantauan lain. Penting juga untuk memahami bahwa prosedur ini cukup banyak sumber daya, jadi jangan terlalu sering menjalankannya. Kami membutuhkan waktu sekitar satu jam untuk memproses 10TB data, dan skrip berjalan sekali sehari pada malam hari.

Rekan-rekan saya dan saya tertarik pada pertanyaan dari mana file dengan atribut sementara berasal. Oleh karena itu, dalam setiap laporan, bersama dengan nama lengkap file, pemilik NTFS-nya muncul. Berdasarkan data yang dikumpulkan, adalah mungkin untuk mengetahui bahwa dalam situasi kami, atribut kadang-kadang ditambahkan ke file ketika menyalin data dari disk lokal diteruskan melalui RDP (kami secara aktif menggunakan teknologi desktop jarak jauh). Tapi ada kemungkinan bahwa file-file itu awalnya "rusak". Sejauh ini, belum memungkinkan untuk mencari tahu lebih detail.

Saya akan berterima kasih jika Anda lulus survei singkat dan berbagi pengalaman Anda dalam komentar.

Source: https://habr.com/ru/post/id459020/


All Articles