DFSR Backlog Check
Das folgende Script prüft den Backlog-Status einer DFS- Replikation und schreibt die Ergebnisse in eine Datei.Entwickelt habe ich das Script um die Dateireplikation in einem Domainforest über fünf Standorte prüfen zu können.
Zu Debugzwecken kann die Variable loggit_silent auf "false" gestellt werden. Das Ergebnis jeder Prüfung wird dann als Messagebox ausgegeben und nicht in die Datei geschrieben.
Das Ausgabeziel, d.h. die Datei in die die Ergebnisse geschrieben werden wird in der Variable loggit_filename angegeben.
Sollte noch etwas im Backlog eingetragen sein, so werden die ersten 100 Dateinamen ausgegeben und zudem die Anzahl der Backlogobjekte gesamt.
Das Script kann über einen geplanten Task ausgeführt werden.
dim loggit_logfilename, loggit_fso, loggit_silent
loggit_logfilename = "F:\dfsr-backlog.txt"
loggit_silent = true ' log file only or with MsgBox/Echo
set loggit_fso = CreateObject("Scripting.FileSystemObject")
strComputer = "."
Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\MicrosoftDFS")
Set DFSRGroups = objWMIService.ExecQuery ("SELECT * FROM DfsrReplicationGroupConfig")
loggit "========================================================"
For Each DFSRGroup in DFSRGroups
DFSRGroupEnabled = DFSRGroup.Enabled
If DFSRGroupEnabled = 1 Then
' cycle through connections
Set DFSRGroupConnections = objWMIService.ExecQuery ("SELECT * FROM DfsrConnectionConfig WHERE ReplicationGroupGUID='" & DFSRGroup.ReplicationGroupGUID & "'")
For Each DFSRGroupConnection in DFSRGroupConnections
DFSRConnectionEnabled = DFSRGroupConnection.Enabled
DFSRConnectionInbound = DFSRGroupConnection.Inbound
DFSRConnectionPartner = DFSRGroupConnection.PartnerDns
' only enabled connections are relevant
If DFSRGroupConnection.Enabled = "True" Then
' cycle through folders
Set DFSRGroupFolders = objWMIService.ExecQuery ("SELECT * FROM DfsrReplicatedFolderConfig WHERE ReplicationGroupGUID='" & DFSRGroup.ReplicationGroupGUID & "'")
For Each DFSRGroupFolder in DFSRGroupFolders
' Query Backlog for enabled ReplicationGroup
DFSRGroupName = DFSRGroup.ReplicationGroupName
DFSRFolderName = DFSRGroupFolder.ReplicatedFolderName
' query inbound/outbound
Set objSysInfo = CreateObject( "WScript.Network" )
DFSRMyName = objSysInfo.ComputerName
If DFSRConnectionInbound = True Then
DFSRSendingMemberDNS = DFSRGroupConnection.PartnerDns
DFSRReceivingMemberDNS = DFSRMyName
DFSRSendingMember = DFSRGroupConnection.PartnerName
DFSRReceivingMember = DFSRMyName
Else
DFSRSendingMemberDNS = DFSRMyName
DFSRReceivingMemberDNS = DFSRGroupConnection.PartnerDns
DFSRSendingMember = DFSRMyName
DFSRReceivingMember = DFSRGroupConnection.PartnerName
End If
DFSRBacklogCommand = "dfsrdiag Backlog /RGName:""" & DFSRGroupName & """ /RFName:""" & DFSRFolderName & """ /SendingMember:" & DFSRSendingMemberDNS & " /ReceivingMember:" & DFSRReceivingMemberDNS
Set WshShell = CreateObject("WScript.Shell")
Set DFSRBacklogCommandExec = WshShell.Exec(DFSRBacklogCommand)
StrDFSRBacklogCommandExec = DFSRBacklogCommandExec.StdOut.ReadAll
OkMessage = "No Backlog - member <" & DFSRReceivingMember & "> is in sync with partner <" & DFSRSendingMember & ">"
If InStr(LCase(StrDFSRBacklogCommandExec), LCase(OkMessage)) > 0 Then
' If return value contains 'No Backlog - member <SOURCE> is in sync with partner <DEST>' everything is ok- leave now
' count lines of output and return value
loggit "Bei " & DFSRFolderName & " von " & DFSRSendingMember & " zu " & DFSRReceivingMember & " ist alles im Lot!"
Else
loggit "Bei " & DFSRFolderName & " ist noch etwas im Backlog auf " & DFSRSendingMember & " für " & DFSRReceivingMember & "!"
loggit "Ausgabe: " & StrDFSRBacklogCommandExec
End If
Next
End If
Next
End If
Next
sub loggit (msg)
set stream = loggit_fso.OpenTextFile(loggit_logfilename, 8, True)
stream.writeline date & " " & time & ": " & msg
stream.close
if not loggit_silent then
WScript.echo msg
end if
end sub