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 http://faq-o-matic.net/?p=2158 Zitatlink
Kategorie Kategorie: Active Directory, AD: Erweiterte Abfragen, Datensicherung, Monitoring, Scripting, VBScript   Translate with Microsoft Translator Translate EN
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.  

Verwandte Beiträge:

  1. Ein AD-Attribut zu einem Logon-Namen herausfinden
    Das folgende Skript gibt den Wert eines beliebigen Attributs aus dem Active Directory für einen User zurück, dessen Logon-Name (SAM-Name,...
  2. Anmeldezeiten für AD-Benutzer per Skript ausgeben
    Seit jeher lässt Windows zu, für einen Benutzer Anmeldezeiten zu definieren – seit Windows NT und auch jetzt in Active...
  3. Festplatte fast voll? Per Skript Warnung verschicken
    Als Administrator weiß man doch lieber vor den Nutzern, wenn etwas nicht mehr funktioniert. Noch besser ist natürlich, wenn man...
  4. Exchange Server 2003: Das Datenbanklimit per Skript setzen
    Seit dem Service Pack 2 für Exchange Server 2003 ist die Datenbankgröße der Standard Edition nicht mehr auf 16 GB...
  5. Wie kann ich zu einem SID den Namen herausfinden?
    Wenn ein SID bekannt ist (beispielsweise weil er in einer Berechtigungsliste auftaucht), aber der Name dazu fehlt, kann man sich...

© 2005-2012 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!