Wie viele wissen, können Sie Ausnahmen in Form von Dateimasken in den Eigenschaften replizierter Ordner konfigurieren. Anschließend repliziert der Dienst keine Dateien, die den angegebenen Masken entsprechen. Aber nicht jeder weiß, dass Dateien ein "temporäres" Attribut haben, und DFSR verarbeitet solche Dateien nicht von Entwurf. Und wenn dies nicht berücksichtigt wird, kann es vorkommen, dass der Inhalt Ihrer DFSR-Ordner nicht mehr synchron ist, obwohl in den Dienstprotokollen alles sauber und schön ist, und dies kann im ungünstigsten Moment auftreten. Das Problem selbst und seine Lösung wurden mehr als einmal im Internet analysiert. Der Zweck dieses Artikels besteht darin, die zuvor erstellte Lösung fertigzustellen und ihr Flexibilität und Komfort zu verleihen. Für wen es relevant ist - frage ich unter Katze.
Das Thema wurde mehr als einmal im Internet behandelt, zum Beispiel im
offiziellen Blog ,
hier und
im Habré selbst . Deshalb werde ich mich nicht wiederholen, sondern gleich zur Sache kommen. Die ursprüngliche Lösung ist ein PowerShell-Skript, das das Attribut "temporär" für alle Dateien in einem bestimmten Ordner zurücksetzt. Auf dieser Grundlage habe ich meine eigene Version geschrieben, die replizierte Ordner auf dem Zielserver findet und durch jeden dieser Ordner läuft, das Problemattribut zurücksetzt und dann einen Bericht über die gefundenen Dateien per E-Mail sendet. Unterstützung für
lange Pfade hinzugefügt (erfordert die fünfte Version von PowerShell).
Damit das Skript funktioniert, benötigen Sie DFS-Dienstverwaltungstools (standardmäßig werden sie zusammen mit der zusätzlichen DFS-Replikationsrolle installiert). Wenn sie auf dem Zielserver nicht verfügbar sind, führen Sie dieses Cmdlet aus:
Install-WindowsFeature RSAT-DFS-Mgmt-Con
Und hier ist das Drehbuch selbst:
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 }
Wir korrigieren die Werte der Variablen, die für E-Mail-Benachrichtigungen verantwortlich sind, und fügen das Skript dem Scheduler hinzu:
powershell.exe -NoLogo -ExecutionPolicy Bypass -NoProfile -File "< >\TempAttrFixer.ps1"
Es ist am einfachsten, die Aufgabe in SYSTEM auszuführen. Wenn Sie jedoch
ein erhöhtes Maß an Paranoia haben und ein ernsthafter Ansatz zur Informationssicherheit praktiziert wird, können Sie ein separates Konto verwenden, das die Berechtigung zum Anmelden als Stapeljob und das Recht zum Ändern von Dateien in replizierten Ordnern erteilt.
Anstelle von E-Mail-Berichten (oder zusätzlich zu diesen) können Sie das Skript für die Interaktion mit zabbix oder einem anderen Überwachungssystem konfigurieren. Es ist auch wichtig zu verstehen, dass das Verfahren sehr ressourcenintensiv ist. Führen Sie es daher nicht zu oft aus. Die Verarbeitung von 10 TB Daten dauert ungefähr eine Stunde, und das Skript wird einmal täglich nachts ausgeführt.
Meine Kollegen und ich waren an der Frage interessiert, woher die Dateien mit dem temporären Attribut stammen. Daher wird in jedem Bericht zusammen mit dem vollständigen Namen der Datei der NTFS-Eigentümer angezeigt. Anhand der gesammelten Daten konnte festgestellt werden, dass in unserer Situation das Attribut manchmal zu den Dateien hinzugefügt wurde, wenn Daten von lokalen Festplatten kopiert wurden, die über RDP weitergeleitet wurden (wir verwenden aktiv die Remotedesktoptechnologie). Es ist jedoch möglich, dass die Dateien anfangs „defekt“ waren. Bisher war es nicht möglich, dies genauer herauszufinden.
Ich wäre Ihnen dankbar, wenn Sie eine kurze Umfrage bestehen und Ihre Erfahrungen in den Kommentaren mitteilen würden.