Logo faq-o-matic.net
Logo faq-o-matic.net

Datum des AD-Backup per Skript herausfinden

von veröffentlicht am26. Februar 2010, 00:25 Uhr Kurzlink und Zitatlink einblenden
Kategorie Kategorie: Active Directory, AD: Erweiterte Abfragen, Datensicherung, Monitoring, Scripting, VBScript   Translate with Google Translate Translate EN   Die angezeigte Seite drucken
Zuletzt aktualisiert: 5. Oktober 2010

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:

image

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.

  1. Set objRootDSE = GetObject(„LDAP://rootDSE“)
  2. strDomain = objRootDSE.Get(„defaultNamingContext“)
  3. Set objDomain = GetObject(„LDAP://“ & strDomain)
  4. WScript.Echo GetADBackupDate(objDomain)
  5.  
  6. Function GetADBackupDate(objDom)
  7.     Dim ReplValue, Subvalue, DSASignature
  8.     Dim timeLeft, timeRight, DCLeft, DCRight
  9.     Dim TimeVal, DCName, BackupDate, BackupTime
  10.    
  11.     systemBias = GetSystemBias
  12.    
  13.     ‚ the attribute was introduced in Windows 2003, so we’ll catch errors
  14.     On Error Resume Next
  15.     objDom.GetInfoEx Array(„msDS-ReplAttributeMetaData“),0
  16.     ReplValue = objDom.Get(„msDS-ReplAttributeMetaData“)
  17.     If Err.number <> 0 Then
  18.         GetADBackupDate = „(keine Information vorhanden)“
  19.         Exit Function
  20.     End If
  21.     On Error Goto 0
  22.  
  23.     DSASignature = „“
  24.     For Each Subvalue In ReplValue
  25.         if instr(LCase(SubValue), „dsasignature“) >0 then DSASignature = Subvalue
  26.     Next
  27.     ‚ this is not too pretty but after all we do not need an XML parser here
  28.     If DSASignature <> „“ Then
  29.         timeLeft = InStr(LCase(DSASignature), LCase(„<ftimeLastOriginatingChange>“)) + Len(„<ftimeLastOriginatingChange>“)
  30.         timeRight = InStr(timeLeft, LCase(DSASignature), LCase(„</ftimeLastOriginatingChange>“))
  31.         DCLeft = InStr(LCase(DSASignature), LCase(„<pszLastOriginatingDsaDN>“)) + Len(„<pszLastOriginatingDsaDN>“) + Len(„CN=NTDS Settings,CN=“)
  32.         DCRight = InStr(DCLeft, DSASignature, „,“)
  33.         TimeVal = Mid(DSASignature, timeLeft, timeRight – timeLeft)
  34.         DCName = Mid(DSASignature, DCLeft , DCRight – DCLeft)
  35.         BackupDate = Left(TimeVal, InStr(TimeVal, „T“)1)
  36.         BackupTime = Mid(TimeVal, InStr(TimeVal, „T“) + 1)
  37.         BackupTime = Left(BackupTime, Len(BackupTime)1)
  38.         BackupTime = CDate(BackupDate & “ „ & BackupTime)
  39.         BackupTime = DateAdd(„n“, –(systemBias), BackupTime)
  40.         GetADBackupDate = BackupTime & “ von „ & DCName
  41.     Else
  42.         ‚ AD seems not to have been backed up yet
  43.         GetADBackupDate = „bislang nicht gesichert“
  44.     End If
  45.    
  46. End Function
  47.  
  48. Function GetSystemBias
  49.     Dim biasKey, k
  50.  
  51.     Dim objShell : Set objShell = CreateObject(„WScript.Shell“)
  52.     biasKey = objShell.RegRead(„HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias“)
  53.     Set objShell = Nothing
  54.  
  55.     If (LCase(TypeName(biasKey)) = „long“) Then
  56.         GetSystemBias = biasKey
  57.     ElseIf (LCase(TypeName(biasKey)) = „variant()“) Then
  58.         GetSystemBias = 0
  59.         For k = 0 To UBound(biasKey)
  60.             GetSystemBias = GetSystemBias + (biasKey(k) * 256^k)
  61.         Next
  62.     End If
  63. End Function
  64.  

© 2005-2019 bei faq-o-matic.net. Alle Rechte an den Texten liegen bei deren Autorinnen und Autoren.

Jede Wiederveröffentlichung der Texte oder von Auszügen daraus - egal ob kommerziell oder nicht - bedarf der ausdrücklichen Genehmigung durch die jeweiligen Urheberinnen oder Urheber.

Das Impressum findet sich unter: http://www.faq-o-matic.net/impressum/

Danke, dass du faq-o-matic.net nutzt. Du hast ein einfaches Blog sehr glücklich gemacht!