Pourquoi DFSR ne réplique pas certains fichiers et comment y faire face


Comme de nombreuses personnes le savent, vous pouvez configurer des exceptions sous forme de masques de fichiers dans les propriétés des dossiers répliqués - et le service ne répliquera pas les fichiers correspondant aux masques spécifiés. Mais tout le monde ne sait pas que les fichiers ont un attribut «temporaire» et DFSR ne traite pas ces fichiers par conception. Et si cela n'est pas pris en compte, il peut arriver que le contenu de vos dossiers DFSR soit désynchronisé, bien que tout soit propre et beau dans les journaux de service, et cela peut arriver au moment le plus inopportun. Le problème lui-même et sa solution ont été analysés plus d'une fois sur Internet, le but de cet article est de finaliser la solution créée précédemment, en lui ajoutant flexibilité et commodité. Pour qui c'est pertinent - je demande sous cat.

Le sujet a été couvert plus d'une fois sur Internet, par exemple dans le blog officiel , ici et sur le Habré lui-même . Je ne vais donc pas me répéter, mais je vais aller droit au but. La solution d'origine est un script PowerShell qui réinitialise l'attribut «temporaire» pour tous les fichiers d'un dossier donné. En prenant cela comme base, j'ai écrit ma propre version, qui trouve les dossiers répliqués sur le serveur cible et les exécute dans chacun d'eux, réinitialisant l'attribut du problème, puis envoie un rapport sur les fichiers trouvés par e-mail. Ajout de la prise en charge des chemins longs (nécessite la 5e version de PowerShell).

Pour que le script fonctionne, vous avez besoin d'outils de gestion de services DFS (par défaut, ils sont installés avec l'ajout du rôle de réplication DFS). S'ils ne sont pas disponibles sur le serveur de destination, exécutez cette applet de commande:

Install-WindowsFeature RSAT-DFS-Mgmt-Con 

Et voici le script lui-même:

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 } 


Nous corrigeons les valeurs des variables responsables des alertes par e-mail et ajoutons le script au planificateur:

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

Il est plus facile d'exécuter la tâche à partir de SYSTEM, mais si vous avez un niveau accru de paranoïa et qu'une approche sérieuse de la sécurité des informations est pratiquée, vous pouvez utiliser un compte distinct, lui donnant le privilège de se connecter en tant que travail par lots et le droit de modifier les fichiers dans des dossiers répliqués.

Au lieu de rapports par e-mail (ou en plus), vous pouvez configurer le script pour interagir avec le zabbix ou un autre système de surveillance. Il est également important de comprendre que la procédure est assez gourmande en ressources, donc ne l'exécutez pas trop souvent. Il nous faut environ une heure pour traiter 10 To de données et le script s'exécute une fois par jour la nuit.

Mes collègues et moi nous sommes intéressés à la question de l'origine des fichiers avec l'attribut temporaire. Par conséquent, dans chaque rapport, avec le nom complet du fichier, son propriétaire NTFS apparaît. Sur la base des données collectées, il a été possible de découvrir que dans notre situation, l'attribut était parfois ajouté aux fichiers lors de la copie de données à partir de disques locaux transmis via RDP (nous utilisons activement la technologie de bureau à distance). Mais il est possible que les fichiers aient été initialement «défectueux». Jusqu'à présent, il n'a pas été possible de le découvrir plus en détail.

Je vous serais reconnaissant de bien vouloir passer un court sondage et de partager votre expérience dans les commentaires.

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


All Articles