Por qué DFSR no replica algunos archivos y cómo lidiar con ellos


Como muchas personas saben, puede configurar excepciones en forma de máscaras de archivos en las propiedades de las carpetas replicadas, y luego el servicio no replicará archivos que coincidan con las máscaras especificadas. Pero no todos saben que los archivos tienen un atributo "temporal", y DFSR no procesa dichos archivos por diseño. Y si esto no se tiene en cuenta, puede suceder que el contenido de sus carpetas DFSR no esté sincronizado, aunque todo estará limpio y hermoso en los registros de servicio, y esto puede aparecer en el momento más inoportuno. El problema en sí y su solución han sido analizados en Internet más de una vez, el propósito de este artículo es finalizar la solución creada anteriormente, agregando flexibilidad y conveniencia. Para quién es relevante, pregunto bajo cat.

El tema ha sido cubierto en Internet más de una vez, por ejemplo, en el blog oficial , aquí y en el propio Habré . Por lo tanto, no me repetiré, pero iré directo al grano. La solución original es un script de PowerShell que restablece el atributo "temporal" para todos los archivos en una carpeta determinada. Tomando como base, escribí mi propia versión, que encuentra carpetas replicadas en el servidor de destino y las revisa, restablece el atributo del problema y luego envía un informe sobre los archivos encontrados al correo electrónico. También se agregó soporte para rutas largas (requiere la quinta versión de PowerShell).

Para que el script funcione, necesita herramientas de administración de servicios DFS (de manera predeterminada, se instalan junto con la función de replicación DFS). Si no están disponibles en el servidor de destino, ejecute este cmdlet:

Install-WindowsFeature RSAT-DFS-Mgmt-Con 

Y aquí está el guión en sí:

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 } 


Corregimos los valores de las variables responsables de las alertas por correo electrónico y agregamos el script al programador:

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

Es más fácil ejecutar la tarea desde SYSTEM, pero si tiene un mayor nivel de paranoia y se practica un enfoque serio de seguridad de la información, puede usar una cuenta separada, dándole el privilegio de iniciar sesión como un trabajo por lotes y el derecho de modificar archivos en carpetas replicadas.

En lugar de informes por correo electrónico (o además de ellos), puede configurar el script para interactuar con el zabbix u otro sistema de monitoreo. También es importante comprender que el procedimiento requiere muchos recursos, por lo tanto, no lo ejecute con demasiada frecuencia. Nos lleva aproximadamente una hora procesar 10 TB de datos, y el script se ejecuta una vez al día por la noche.

Mis colegas y yo estábamos interesados ​​en la cuestión de dónde provienen los archivos con el atributo temporal. Por lo tanto, en cada informe, junto con el nombre completo del archivo, aparece su propietario NTFS. En función de los datos recopilados, fue posible descubrir que, en nuestra situación, el atributo a veces se agregaba a los archivos al copiar datos de discos locales enviados a través de RDP (estamos utilizando activamente la tecnología de escritorio remoto). Pero es posible que los archivos fueran inicialmente "defectuosos". Hasta ahora no ha sido posible descubrirlo con más detalle.

Le agradecería que pase una breve encuesta y comparta su experiencia en los comentarios.

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


All Articles