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