Möchte man das Datum herausfinden, zu dem Active Directory zuletzt gesichert wurde, so gibt es eine recht einfache Methode: Ab Windows 2003 (SP1) beantwortet repadmin diese Frage.
repadmin /showbackup
Die Ausgabe sieht ungefähr so aus:
Da ich gerade an der neuen Version 3.0 meines AD-Dokumentationswerkzeugs José arbeite, wollte ich diese Daten aber per Skript herausfinden, ohne auf repadmin angewiesen zu sein. Das stellte sich als gar nicht so einfach heraus, denn die Information ist im AD gut versteckt.
Schließlich brachte mich der AD-Supportengineer Ned Pyle auf den richtigen Weg (mit Vermittlung durch Yusuf Dikmenoglu). Er verwies mich auf diesen Blogartikel:
[Active Directory Powershell Blog : Accessing Replication Metadata using ADPowerShell]
http://blogs.msdn.com/adpowershell/archive/2009/11/01/accessing-replication-metadata-using-adpowershell.aspx
OK, PowerShell ist ja wenigstens schon mal Skript. 😉 Mit der Information, dass die gesuchten Daten sich in einem XML-ähnlich formatierten berechneten Feld finden, hatte ich dann alles, was ich brauchte. Naja, fast alles. Der Abend ist dann schon noch dabei draufgegangen. 😉 Dann soll es sich aber wenigstens gelohnt haben, daher hier jetzt der Skriptcode. Das folgende Beispiel in eine VBS-Datei kopieren und diese mit cscript (oder notfalls auch per Doppelklick) aufrufen.
-
Set objRootDSE = GetObject(„LDAP://rootDSE“)
-
strDomain = objRootDSE.Get(„defaultNamingContext“)
-
Set objDomain = GetObject(„LDAP://“ & strDomain)
-
WScript.Echo GetADBackupDate(objDomain)
-
-
Function GetADBackupDate(objDom)
-
Dim ReplValue, Subvalue, DSASignature
-
Dim timeLeft, timeRight, DCLeft, DCRight
-
Dim TimeVal, DCName, BackupDate, BackupTime
-
-
systemBias = GetSystemBias
-
-
‚ the attribute was introduced in Windows 2003, so we’ll catch errors
-
On Error Resume Next
-
objDom.GetInfoEx Array(„msDS-ReplAttributeMetaData“),0
-
ReplValue = objDom.Get(„msDS-ReplAttributeMetaData“)
-
If Err.number <> 0 Then
-
GetADBackupDate = „(keine Information vorhanden)“
-
Exit Function
-
End If
-
On Error Goto 0
-
-
DSASignature = „“
-
For Each Subvalue In ReplValue
-
if instr(LCase(SubValue), „dsasignature“) >0 then DSASignature = Subvalue
-
Next
-
‚ this is not too pretty but after all we do not need an XML parser here
-
If DSASignature <> „“ Then
-
timeLeft = InStr(LCase(DSASignature), LCase(„<ftimeLastOriginatingChange>“)) + Len(„<ftimeLastOriginatingChange>“)
-
timeRight = InStr(timeLeft, LCase(DSASignature), LCase(„</ftimeLastOriginatingChange>“))
-
DCLeft = InStr(LCase(DSASignature), LCase(„<pszLastOriginatingDsaDN>“)) + Len(„<pszLastOriginatingDsaDN>“) + Len(„CN=NTDS Settings,CN=“)
-
DCRight = InStr(DCLeft, DSASignature, „,“)
-
TimeVal = Mid(DSASignature, timeLeft, timeRight – timeLeft)
-
DCName = Mid(DSASignature, DCLeft , DCRight – DCLeft)
-
BackupDate = Left(TimeVal, InStr(TimeVal, „T“) – 1)
-
BackupTime = Mid(TimeVal, InStr(TimeVal, „T“) + 1)
-
BackupTime = Left(BackupTime, Len(BackupTime) – 1)
-
BackupTime = CDate(BackupDate & “ „ & BackupTime)
-
BackupTime = DateAdd(„n“, –(systemBias), BackupTime)
-
GetADBackupDate = BackupTime & “ von „ & DCName
-
Else
-
‚ AD seems not to have been backed up yet
-
GetADBackupDate = „bislang nicht gesichert“
-
End If
-
-
End Function
-
-
Function GetSystemBias
-
Dim biasKey, k
-
-
Dim objShell : Set objShell = CreateObject(„WScript.Shell“)
-
biasKey = objShell.RegRead(„HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias“)
-
Set objShell = Nothing
-
-
If (LCase(TypeName(biasKey)) = „long“) Then
-
GetSystemBias = biasKey
-
ElseIf (LCase(TypeName(biasKey)) = „variant()“) Then
-
GetSystemBias = 0
-
For k = 0 To UBound(biasKey)
-
GetSystemBias = GetSystemBias + (biasKey(k) * 256^k)
-
Next
-
End If
-
End Function
-
http://faq-o-matic.net/?p=2158