Neben Klassen wie Win32_NetworkAdapterConfiguration und und ihren Funktionen enthält WMI noch weitere Klassen und Funktionen, die sich insbesondere bei der Verwaltung von Netzwerkclients als nützlich erweisen. Dieser Abschnitt befasst sich mit den fortgeschrittenen Skripterstellungstechniken und enthält die notwendigen Einzelschritte ebenso wie Beispielskripts für die folgenden Aufgaben: | • | Koordinieren der Systemzeit über das Netzwerk Verschiedene Klassen ermöglichen die Koordination von Systemdatum und -uhrzeit mithilfe von Skripts. | | • | Ändern von Netzwerkeinstellungen in der Registrierung Auf die Windows-Registrierung einschließlich aller Einstellungen kann unter Verwendung des WMI-Anbieters für die Systemregistrierung per Skript zugegriffen werden. |
Diese fortgeschrittenen Skripterstellungstechniken können außer für die TCP/IP-Vernetzung auch für die Erstellung von Skripts für andere Bereiche der Systemverwaltung eingesetzt werden. Auf dieser SeiteKoordinieren der Systemzeit über das NetzwerkEinige Funktionen des Betriebssystems und von Client-/Serveranwendungen sind von synchronisierten Datums- und Uhrzeitangaben auf den Computern im Netzwerk abhängig. Beispielsweise führt der Vergleich der Zeitstempel von Dateien oder Ereignissen auf unterschiedlichen Computern nur dann zu zuverlässigen Ergebnissen, wenn die Systemuhrzeiten auf den Computern übereinstimmen. Vorsicht Active Directory synchronisiert Datum und Uhrzeit auf Computern, die über Konten im Verzeichnisdienst verfügen, automatisch. Ändern Sie also nicht das Datum oder die Uhrzeit auf einem Computer, der Mitglied einer Active Directory-Domäne ist.
Anstatt Datums- und Uhrzeitfunktionen in einer oder zwei Klassen zu konzentrieren, verteilt WMI diese auf mehrere Klassen, von denen einige eher allgemeine Container darstellen: | • | So enthalten z. B. die Klassen Win32_ComputerSystem und Win32_OperatingSystem neben vielen anderen Eigenschaften und Methoden auch solche zum Verwalten von Datums- und Uhrzeiteinstellungen: | | • | Win32_TimeZone, Win32_CurrentTime, Win32_LocalTime und Win32_UTCTime (die drei zuletzt genannten sind unter Windows XP neu hinzugekommen) enthalten ebenfalls schreibgeschützte Eigenschaften, mit denen sich jede Komponente der Einstellungen von Datum und Uhrzeit, Zeitzone und Sommerzeit anzeigen lässt. | | • | Das SWbemDateTime-Objekt aus der WMI-Skriptingbibliothek, welches ebenfalls mit Windows XP neu eingeführt wurde, kann zudem in Verbindung mit den anderen Klassen verwendet werden, um Datums- und Uhrzeitobjekte zu manipulieren. |
Win32_OperatingSystemTabelle 39 enthält eine Liste der schreibgeschützten Eigenschaften, die mit der Klasse Win32_OperatingSystem für die Verwaltung von Datums- und Uhrzeiteinstellungen bereitstehen. Tabelle 39 Datums- und Uhrzeiteigenschaften von "Win32_OperatingSystem" CurrentTimeZone (schreibgeschützt) | sint16 | Gibt den Offset des Betriebssystems von GMT (Greenwich Mean Time) in Minuten an. Die Zahl ist positiv, negativ oder Null. | LocalDateTime (schreibgeschützt) | datetime | Das vom Betriebssytem verwendete Format für Datum und Tageszeit. |
Tabelle 40 erläutert die Methode der Klasse Win32_OperatingSystem zum Verwalten von Datums- und Uhrzeiteinstellungen. Tabelle 40 Datums- und Uhrzeitmethode von "Win32_OperatingSystem" SetDateTime | LocalDateTime – datetime Ein Zeitwert. | Legt die aktuelle Systemzeit auf dem Computer fest. Der aufrufende Prozess muss über das Recht SE_SYSTEMTIME_NAME verfügen. |
Diese Methode gibt eine positive Ganzzahl zurück. | • | 0 bedeutet: erfolgreicher Abschluss. | | • | Zahlen größer als 0 weisen auf einen Fehler hin. |
Win32_ComputerSystemTabelle 41 listet die Eigenschaften von Win32_ComputerSystem auf, von denen zwei gelesen und geschrieben werden können, um Datums- und Uhrzeiteinstellungen zu verwalten. Tabelle 41 Datums- und Uhrzeiteigenschaften von "Win32_ComputerSystem" CurrentTimeZone (Lesen/Schreiben) | sint16 Einheit: Minuten | Gibt den Offset des Computersystems von UTC (Coordinated Universal Time) in Minuten an. | DaylightInEffect (schreibgeschützt) | Boolean-Wert | Sommerzeitmodus ist aktiviert. | EnableDaylightSavingsTime (Lesen/Schreiben) Nur Windows XP und Windows Server 2003 | Boolean-Wert | Aktiviert die Sommerzeit (Daylight Saving Time, DST) auf einem Computer. Der Wert "Wahr" gibt an, dass die Systemzeit zu Beginn oder Ende der Sommerzeit eine Stunde zurück- oder vorgestellt wird. Der Wert "Falsch" gibt an, dass die Systemzeit zu Beginn oder Ende der Sommerzeit keine Stunde zurück- oder vorgestellt wird. Der Wert NULL gibt an, dass der Status DST auf dem System unbekannt ist. |
Win32_TimeZoneWin32_TimeZone umfasst die Zeitzoneninformationen eines Windows-Systems, wozu auch die Änderungen gehören, die für die Umschaltung auf Sommerzeit notwendig sind. Diese Klasse enthält mehrere Eigenschaften, die alle schreibgeschützt sind, jedoch keine Methoden. Zu den Eigenschaften gehören die Komponenten von Datum und Uhrzeit für Standard- und Sommerzeit sowie die jeweiligen Abweichungen. Win32_CurrentTime
Anstelle dieser Klasse empfiehlt sich die Verwendung der Klassen Win32_LocalTime oder Win32_UTCTime.
Neu in Windows XP und Windows Server 2003 Als abstrakte Klasse ohne Instanzen dient Win32_CurrentTime als Vorlage für die anderen Zeitklassen. Sie beschreibt einen bestimmten Zeitpunkt über Elemente wie Sekunden, Minuten, Stunden, Tagen, Tagen der Woche, Woche im Monat, Monaten, Quartalen und Jahren. Beachten Sie, dass die Eigenschaft Milliseconds im SDK zwar für diese Klasse aufgeführt wird, jedoch noch nicht implementiert wurde. Die Klassen Win32_LocalTime und Win32_UTCTime erben jeweils von der Klasse Win32_CurrentTime. Win32_LocalTimeNeu in Windows XP und Windows Server 2003 Die Klasse Win32_LocalTime repräsentiert die Ortszeit auf dem Computer. Diese Klasse erbt von Win32_CurrentTime und weist die gleichen Eigenschaften auf. Die Eigenschaft Hour gibt die Ortszeit im 24-Stunden-Format zurück. Beachten Sie, dass die Eigenschaft Milliseconds im SDK zwar für diese Klasse aufgeführt wird, jedoch noch nicht implementiert wurde. Win32_UTCTimeNeu in Windows XP und Windows Server 2003 Die Klasse Win32_UTCTime repräsentiert die Ortszeit auf dem Computer. Diese Klasse erbt von Win32_CurrentTime und weist die gleichen Eigenschaften auf. Die Eigenschaft Hour gibt die UTC-Zeit (Coordinated Universal Time) im 24-Stunden-Format zurück. Beachten Sie, dass die Eigenschaft Milliseconds im SDK zwar für diese Klasse aufgeführt wird, jedoch noch nicht implementiert wurde. Objekt "SWbemDate Time" aus der WMI-SkriptingbibliothekNeu in Windows XP und Windows Server 2003 Dieses Hilfsobjekt analysiert und konvertiert WMI-Datums-/Uhrzeitwerte (z. B. die Eigenschaft LocalDateTime Von der Klasse Win32_OperatingSystem) in und aus anderen Formaten. Weitere Informationen enthält der Abschnitt "SWbemDateTime" im WMI SDK unter http://go.microsoft.com/fwlink/?LinkId=29997 (englischsprachig). VBScript-Funktion "Now"Diese Funktion extrahiert das aktuelle Systemdatum und die Systemuhrzeit des Computers mithilfe eines Skripts. Abrufen der aktuellen Uhrzeit mithilfe der VBScript-Funktion "Now"Das nachstehende Skript ruft die aktuelle Systemzeit eines Computers mithilfe der VBScript-Funktion Now ab. Listing 52 Time-get.vbs
1
|
WScript.Echo "Current Date and Time: " & Now
|
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-get.vbs Current Date and Time: 5/19/2004 2:46:29 PM Abrufen der Ortszeit mithilfe von WMIWMI bietet eine etwas komplexere, dafür aber auch flexiblere Methode als die VBScript-Funktion Now zum Auslesen des lokalen Datums und der Uhrzeit. Die Klasse Win32_LocalTime umfasst Eigenschaften zur Darstellung von Jahr, Quartal, Monat, Woche im Monat, Datum, Tag der Woche, Stunde (basierend auf der 24-Stunden-Uhr), Minute und Sekunde der lokalen Systemzeit. Schritte zur Skripterstellung Mit Listing 53 wird die Ortszeit eines Computers mit der WMI-Klasse Win32_LocalTime abgerufen. Diese Klasse wurde für Windows XP neu eingeführt, daher kann das Skript nur unter Windows XP und Windows Server 2003 ausgeführt werden. 1. | Erstellen Sie eine Variable, und weisen Sie ihr den Namen eines Computers zu. Geben Sie beim lokalen Computer einfach "." als Computernamen an. Wenn Sie dieses Skript remote ausführen möchten, geben Sie den Namen eines verfügbaren Remotecomputers im Netzwerk an, für den Sie Administratorrechte besitzen. Der Name kann entweder aus einem Hostnamen oder einer IP-Adresse bestehen. | 2. | Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest. | 3. | Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_LocalTime. Hiermit wird eine aus einem Objekt bestehende Auflistung zurückgegeben, die die Ortszeit auf dem Computer repräsentiert. | 4. | Verwenden Sie die Eigenschaften des LocalTime-Objekts zum Anzeigen von Monat, Tag, Jahr, Quartal, Woche im Monat, Tag der Woche und Uhrzeit. |
Listing 53 Time-get-local.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colLocalTimes = objWMIService.ExecQuery("Select * from Win32_LocalTime")
For Each objLocalTime in colLocalTimes
Wscript.Echo "Date: " & objLocalTime.Month & "/" & objLocalTime.Day & _
"/" & objLocalTime.Year
Wscript.Echo "Quarter: " & objLocalTime.Quarter
Wscript.Echo "Week In the Month: " & objLocalTime.WeekInMonth
Wscript.Echo "Day Of the Week: " & objLocalTime.DayOfWeek
Wscript.Echo "Time: " & objLocalTime.Hour & ":" & objLocalTime.Minute & _
":" & objLocalTime.Second
Next |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-get-local.vbs Date: 5/19/2004 Quarter: 2 Week In the Month: 4 Day Of the Week: 3 Time: 16:55:39 Abrufen der UTC-Zeit mithilfe von WMIDie koordinierte Weltzeit (Coordinated Universal Time, UTC) ist die internationale Standardzeit und wird vom Observatorium in Greenwich/Großbritannien bereitgestellt. Die UTC weicht von der Ortszeit um die von der jeweiligen lokalen Zeitzone vorgegebenen Differenz ab, welche von anderen Klassen bereitgestellt wird, die an späterer Stelle in diesem Abschnitt beschrieben werden. Beim Vergleich der Systemzeiten von Computern in unterschiedlichen Zeitzonen kann sich UTC als nützlich erweisen, da es sich hierbei um die aktuelle Uhrzeit im Greenwich-Observatorium handelt und der Wert daher überall auf der Welt gleich ist. Schritte zur Skripterstellung Mit Listing 54 wird auf einem Computer unter Verwendung der WMI-Klasse Win32_UTCTime die aktuelle UTC abgerufen. Wie bei der Klasse Win32_LocalTime wird auch bei Win32_UTCTime die Zeit im 24-Stunden-Format dargestellt. Diese Klasse wurde für Windows XP neu eingeführt, daher kann das Skript nur unter Windows XP und Windows Server 2003 ausgeführt werden. 1. | Erstellen Sie eine Variable zur Angabe des Computernamens. | 2. | Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest. | 3. | Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_LocalTime. Hiermit wird eine aus einem Objekt bestehende Auflistung zurückgegeben, die die UTC auf dem jeweiligen Computer repräsentiert. | 4. | Verwenden Sie die Eigenschaften des UTC-Objekts zum Anzeigen von Monat, Tag, Jahr, Quartal, Woche im Monat, Tag der Woche und Uhrzeit. |
Listing 54 Time-get-utc.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colUTCTimes = objWMIService.ExecQuery("Select * from Win32_UTCTime")
For Each objUTCTime in colUTCTimes
Wscript.Echo "Date: " & objUTCTime.Month & "/" & objUTCTime.Day & _
"/" & objUTCTime.Year
Wscript.Echo "Quarter: " & objUTCTime.Quarter
Wscript.Echo "Week In the Month: " & objUTCTime.WeekInMonth
Wscript.Echo "Day Of the Week: " & objUTCTime.DayOfWeek
Wscript.Echo "Time: " & objUTCTime.Hour & ":" & objUTCTime.Minute & _
":" & objUTCTime.Second
Next |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-get-utc.vbs Date: 5/19/2004 Quarter: 2 Week In the Month: 4 Day Of the Week: 3 Time: 23:56:29 Abrufen der Uhrzeit von einem RemotecomputerWie bei anderen WMI-Klassen muss zum Abrufen der UTC oder der Ortszeit von einem Remotecomputer einfach nur der Name des Computers in der Variablen strComputer (siehe Zeile 3 des Skripts) in den eines Remotecomputers geändert werden, für den Sie über Verwaltungsrechte verfügen, und der Rest wird von WMI selbsttätig erledigt. Vergleichen der Ortszeiten zweier ComputerEine Möglichkeit zum Vergleichen von Systemdatum und -uhrzeit auf zwei Computern in der gleichen Zeitzone stellt die LocalDateTime-Eigenschaft der Klasse Win32_OperatingSystem bereit. Diese schreibgeschützte Eigenschaft gibt die lokale Datums- und Uhrzeiteinstellung des Betriebssystems einschließlich des Offsets von der GMT (Greenwich Mean Time) zurück, wodurch die Zeitzone angegeben wird. Diese Vorgehensweise funktioniert auf Netzwerken, in denen Computer mit Betriebssystemen vor Windows XP und Windows Server 2003 betrieben werden. Zum Vergleichen von Datum und Uhrzeit auf Computern in unterschiedlichen Zeitzonen kann dieses Skript zwecks Kompensation der Zeitzonen angepasst werden, indem der Unterschied zwischen den letzten vier Ziffern des von LocalDateTime zurückgegebenen Datum-/Uhrzeitwertes berechnet und angewendet wird. Diese Ziffern beginnen mit einem positiven oder negativen Vorzeichen, worauf ein dreistelliger Offsetwert folgt, der die Anzahl der Minuten angibt, um die die örtliche Zeitzone von UTC abweicht. Optional können die Angaben mit dem von der Klasse Win32_UTCTime zurückgegebenen Wert verglichen werden. Die so ermittelten Datums- und Uhrzeitangaben sind auf zwei synchronisierten Computern gleich, ungeachtet der Zeitzone. Diese Klasse wird mit Windows XP und Windows Server 2003 neu eingeführt. Schritte zur Skripterstellung Listing 55 ermöglicht den Vergleich von Datum und Uhrzeit auf zwei Computern, entweder auf einem lokalen und einem Remotecomputer oder auf zwei Remotecomputern. 1. | Erstellen Sie Variablen zur Angabe der Namen der beiden Computer. | 2. | Verwenden Sie auf jedem der beiden Computer einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest. | 3. | Verwenden Sie zudem auf beiden Computern die ExecQuery-Methode zum Abfragen der Klasse Win32_OperatingSystem. Hiermit werden zwei Auflistungen von Betriebssystemobjekten mit je einem Objekt pro Auflistung zurückgegeben. | 4. | Rufen Sie nach dem Eintreffen des Rückgabewertes jedes ExecQuery-Aufrufs die VBScript-Funktion Now auf, und weisen Sie die Sekunden jeder Zeitangabe einer Variablen zu. Die Funktion Now gibt das Systemdatum und die Systemuhrzeit zum Zeitpunkt der Ausführung zurück. | 5. | Wenn der Unterschied zwischen den beiden Zeitvariablen nicht 0 ist, weisen Sie diesen einer Variablen zu. Dies ist der Unterschied zwischen den Zeiten, zu denen die Ausführung der beiden Abfragen der Klasse Win32_OperatingSystem beendet war. Die mit der LocalDateTime-Eigenschaft auf jedem Computer abgerufene Zeit ist von dem exakten Zeitpunkt abhängig, zu dem die Abfrage ausgeführt wird. | 6. | Durchlaufen Sie jedes Betriebssystemobjekt in der Auflistung auf dem ersten Computer mit einer For Each-Schleife. | 7. | Durchlaufen Sie innerhalb der ersten For Each-Schleife jedes Betriebssystemobjekt in der Auflistung auf dem zweiten Computer mit einer verschachtelten For Each-Schleife. | 8. | Rufen Sie mithilfe der LocalDateTime-Eigenschaft die lokale Systemzeit von beiden Computern ab. | 9. | Kürzen Sie die von LocalDateTime zurückgegebenen Datums-/Uhrzeitobjekte auf die Datums-, Stunden- und Minutenwerte, und wenn es eine Differenz zwischen den beiden von Now zurückgegebenen Werten gibt, passen Sie anhand dieser Abweichung die erste Zeit an, bevor Sie beide Zeiten vergleichen. | 10. | Rufen Sie die Funktion WMIDateToString auf, um die beiden angepassten Systemdatums- und -uhrzeitangaben in einem besser lesbaren Format anzuzeigen. Weitere Informationen über WMIDateToString finden Sie im Abschnitt "Anzeigen von DHCP-Clientinformationen" an früherer Stelle in diesem Dokument. | 11. | Vergleichen Sie die beiden angepassten Datums- und Uhrzeitwerte, und geben Sie das Resultat des Vergleichs aus. Hinweis Die von diesen beiden Auflistungen zurückgegebenen Datums- und Uhrzeitwerte sind nach der Ausführung von ExecQuery() statisch. Das heißt, es handelt sich um einen Momentaufnahmen des Datums und der Uhrzeit zum Zeitpunkt der Ausführung der Abfrage. Unter der Voraussetzung, dass die Netzwerkverbindung gut ist und die beiden Computer nicht ausgelastet sind, liegt ggf. weniger als eine Sekunde zwischen den beiden Abfragen, und es ist nicht notwendig, diese Verzögerung zu kompensieren. Wenn zwischen dem ersten und dem zweiten Aufruf der Funktion Now jedoch mehr als eine Sekunde liegt, kompensiert das Skript die Verzögerung, indem die Differenz der vom ersten Computer abgerufenen Zeit (Zeile 28) hinzuaddiert wird.
|
Listing 55 Time-compare.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 |
On Error Resume Next
strComputer1 = "."
strComputer2 = "server-d1"
Set objWMIService1 = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer1 & "\root\cimv2")
Set objWMIService2 = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer2 & "\root\cimv2")
Set colOSes1 = objWMIService1.ExecQuery("Select * from " & _
"Win32_OperatingSystem")
strTime1 = Now
Set colOSes2 = objWMIService2.ExecQuery("Select * from " & _
"Win32_OperatingSystem")
strTime2 = Now
intSeconds1 = CInt(Left(Right(strTime1, 5), 2))
intSeconds2 = CInt(Left(Right(strTime2, 5), 2))
intDiff = 0
If intSeconds1 <> intSeconds2 Then
intDiff = intSeconds2 - intSeconds1
End If
For Each objOS1 in colOSes1
For Each objOS2 in colOSes2
intDateTime1 = Left(objOS1.LocalDateTime, 14)
intDateTime2 = Left(objOS2.LocalDateTime, 14)
If intDiff <> 0 Then
intDateTime1 = intDateTime1 + intDiff
End If
WScript.Echo "Adjusted time on " & strComputer1 & ": " & _
WMIDateToString(intDateTime1)
WScript.Echo "Adjusted time on " & strComputer2 & ": " & _
WMIDateToString(intDateTime2)
If intDateTime1 = intDateTime2 Then
Wscript.Echo "Dates and times are equal."
Else
Wscript.Echo "Dates and times are not equal."
End If
Next
Next
'******************************************************************************
Function WMIDateToString(dtmDate)
WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & _
Left(dtmDate, 4) & " " & _
Mid(dtmDate, 9, 2) & ":" & _
Mid(dtmDate, 11, 2) & ":" & _
Mid(dtmDate, 13, 2))
End Function |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-compare.vbs Adjusted time on .: 5/19/2004 5:01:26 PM Adjusted time on server1: 5/19/2004 5:05:52 PM Dates and times are not equal. Festlegen der Uhrzeit auf einem Computer mithilfe von BefehlszeilentoolsZum Einstellen des Systemdatums und der Uhrzeit auf einem lokalen Computer stehen zwei Befehlszeilentools, Date.exe und Time.exe, bereit. | • | Date.exe verwendet die folgende Syntax: dateDatumTag / Monat / Jahr Beispielsweise wird das Systemdatum mit der folgenden Befehlszeile auf den 8. März 2004 festgelegt: date 03/08/2004
Wird dieser Befehl ohne Argumente ausgeführt, gibt er das aktuelle Systemdatum zurück. | | • | Time.exe verwendet die folgende Syntax, wobei Stunden: Minuten im 24-Stunden-Format angegeben wird: timeStunden: Minuten Beispielsweise wird die Systemuhrzeit mit der folgenden Befehlszeile auf den 18:25 festgelegt:
time 18:25
Wird dieser Befehl ohne Argumente ausgeführt, gibt er die aktuell Systemuhrzeit zurück. |
Die Befehlszeilentools Date.exe und Time.exe stehen unter allen Windows-Betriebssystemen zur Verfügung. Der Befehl net time bietet Optionen zur Synchronisation der Zeit mit einem Zeitserver. Festlegen der Uhrzeit auf einem Computer mithilfe von WMIMit WMI können Uhrzeiten auf lokalen und auf Remotecomputern ausgelesen und eingestellt werden. Die WMI-Klasse Win32_OperatingSystem umfasst eine schreibgeschützte Eigenschaft, LocalDateTime, die die lokale Datums- und Uhrzeiteinstellung des Betriebssystems einschließlich des Offsets von der GMT (Greenwich Mean Time) zurückgibt, wodurch die Zeitzone angegeben wird. Vorsicht Active Directory synchronisiert Datum und Uhrzeit auf Computern, die über Konten im Verzeichnisdienst verfügen, automatisch. Ändern Sie also nicht das Datum oder die Uhrzeit auf einem Computer, der Mitglied einer Active Directory-Domäne ist.
Die Klasse Win32_OperatingSystem enthält zudem eine Methode, SetDateTime(), die ein Datum und eine Uhrzeit in Form eines DATETIME-Objekts als Parameter akzeptiert und diese Angabe als aktuelles Datum und Uhrzeit des Computers festlegt. SetDateTime() gibt den Wert 0 zurück, wenn die Ausführung erfolgreich war, im Falle eines Fehlers eine beliebige andere Zahl. Zum Ausführen von SetDateTime() muss das Script von einem Benutzer ausgeführt werden, dessen Anmeldeinformationen das Recht SE_SYSTEMTIME_NAME umfassen. Das folgende Skript verwendet die LocalDateTime-Eigenschaft und die SetDateTime()-Methode zum Festlegen eines neuen Datums und einer neuen Uhrzeit auf einem lokalen oder einem Remotecomputer. Das neue Datum und die neue Uhrzeit müssen im Format DATETIME vorliegen, einem WMI-Datentyp, bei dem es sich um eine Zeichenfolge mit fester Länge handelt, die in WMI ein bestimmtes Datum und eine bestimmte Uhrzeit repräsentiert. Die Zeichenfolge hat folgendes Format:
yyyymmddHHMMSS.mmmmmmsUUU
In Tabelle 42 sind die gültigen Werte für die DATETIME-Felder aufgeführt. Sämtliche Feldinhalte müssen den in der Tabelle angegebenen Feldlängen entsprechen. Verwenden Sie im Bedarfsfall führende Nullen. Tabelle 42 Beschreibungen zum DATETIME-Feld jjjj | Vierstellige Variable für die Jahreszahl (0000-9999) | mm | Zweistellige Variable für den Monat (01-12) | tt | Zweistellige Variable für den Tag des Monats (01-31) Dieser Wert muss für den jeweiligen Monat geeignet sein. Beispielsweise ist ein 31. Februar ungültig. Allerdings muss Ihre Implementierung die Daten nicht auf Gültigkeit prüfen. | HH | Zweistellige Variable für die Stunde des Tages bei Verwendung der 24-Stunden-Uhr (00-23) | MM | Zweistellige Variable für die Minuten der Stunde (00-59) | SS | Zweistellige Variable für die Sekunden der Minute (00-59) | mmmmmm | Sechsstellige Variable für die Mikrosekunden der Sekunde (000000–999999) | s | Pluszeichen (+) oder Minuszeichen (-), um einen positiven oder negativen Offset von UTC anzugeben. | UUU | Dreistelliger Offset, der die Anzahl der Minuten angibt, um die die Zeitzone von UTC abweicht. Bei WMI ist es ratsam, jedoch nicht zwingend, Zeitangaben in GMT (mit einem UTC-Offset von Null) umzuwandeln. |
Zum Füllen nicht verwendeter Felder oder als Platzhalter kann das Sternchen (*) verwendet werden. Beispielsweise kann ein Datum und eine Uhrzeit mit unbestimmten Jahr in jedem beliebigen Jahr auftreten, wie im folgenden Beispiel:
****0416******.******+***
Soll ein Feld unbestimmt bleiben, muss das gesamte Feld mit Sternchen gefüllt werden. Das folgende Beispiel zeigt gültige und ungültige Varianten der Verwendung von Sternchen:
19980416******.000000+*** ' Gültig
1998-04-16 ******:*** ' Ungültig
199*0416******.000000+*** ' Ungültig
199*-04-16 ******:*** ' Ungültig
Weitere Informationen über den Datentyp DATETIME finden Sie im WMI SDK im Abschnitt "Date and Time Format", aus dem auch diese Erläuterung übernommen wurde. Weitere Informationen über das Arbeiten mit Datums- und Uhrzeitangaben in Skripten enthalten die Abschnitte "Working with Dates and Times" in Kapitel 6 des Windows 2000 Scripting-Handbuchs unter /germany/technet/datenbank/articles/600362.mspx. Schritte zur Skripterstellung Mit Listing 56 wird die Systemzeit auf einem lokalen oder Remotecomputer eingestellt. Dieses Skript zeigt, wie die SetDateTime-Methode der Klasse Win32_OperatingSystem eingesetzt wird. Allerdings ist die Genauigkeit bei dieser Vorgehensweise in der Regel auf die Minute und nicht auf die Sekunde beschränkt, da hierbei die korrekte Zeit im letzten Moment eingegeben werden muss. 1. | Erstellen Sie eine Variable, und weisen Sie ihr den Namen eines Computers zu. | 2. | Erstellen Sie eine Variable, und weisen Sie ihr eine Zeichenfolge (im WMI-Format DATETIME) zu, die das Datum und die Uhrzeit repräsentiert, die festgelegt werden sollen. Ersetzen Sie kurz vor Ausführung des Skripts das WMI DATETIME-Format durch die tatsächliche Uhrzeit, die festgelegt werden soll. Als Beispieldatum/-uhrzeit wird im Skript der 7. Mai 2004, 17:01 mit einem negativen Offset von 8 Stunden (480 Minuten) von GMT verwendet. | 3. | Verwenden Sie einen GetObject()-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest. | 4. | Rufen Sei die ExecQuery-Methode zum Abfragen der Win32-OperatingSystem-Klasse auf. Hiermit wird eine Auflistung bestehend aus einem Objekt zurückgegeben, das das Betriebssystem repräsentiert. | 5. | Führen Sie für jedes Betriebssystemobjekt in der Auflistung die folgenden Aufgaben aus. | 6. | Rufen Sie die SetDateTime-Methode der Win32_OperatingSystem-Klasse auf, und übergeben Sie den Datums-/Uhrzeitwert. | 7. | Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgs- oder Fehlermeldung an. | 8. | Fragen Sie die Klasse Win32_OperatingSystem erneut ab, und rufen Sie die aktualisierte LocalDateTime-Eigenschaft ab, die die Änderung wiedergibt. | 9. | Rufen Sie die Funktion WMIDateToString auf, um den Datums-/Uhrzeitwert in einem besser lesbaren Format anzuzeigen. Weitere Informationen über diese Funktion finden Sie im Abschnitt "Anzeigen von DHCP-Clientinformationen" an früherer Stelle in diesem Dokument. |
Listing 56 Time-set.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
On Error Resume Next
strComputer = "."
dtmNewDateTime = "20040520151300.000000-480"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate, " _
& "(Systemtime)}!\\" & strComputer & "\root\cimv2")
Set colOSes = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objOS In colOSes
intSet = objOS.SetDateTime(dtmNewDateTime)
If intSet = 0 Then
Wscript.Echo "Successfully set new date and time."
Else
Wscript.Echo "Unable to set mew date and time."
End If
Next
Set colOSes = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objOS In colOSes
Wscript.Echo "New date and time: " & WMIDateToString(objOS.LocalDateTime)
Next
'******************************************************************************
Function WMIDateToString(dtmDate)
WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & _
Left(dtmDate, 4) & " " & _
Mid(dtmDate, 9, 2) & ":" & _
Mid(dtmDate, 11, 2) & ":" & _
Mid(dtmDate, 13, 2))
End Function |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-set.vbs Successfully set new date and time. New date and time: 5/20/2004 3:08:49 PM Synchronisieren der Uhrzeiten auf zwei ComputernDer Betrieb eines Netzwerkes setzt häufig voraus, dass die Systemzeiten netzwerkübergreifend synchronisiert werden. Einige Anwendungen wie solche, die Dateien basierend auf Zeitstempeln vergleichen, erfordern, dass die Zeiten auf unterschiedlichen Hosts weitestgehend übereinstimmen. Bei den fortschrittlicheren Methoden zur Sicherstellung einer akkuraten und synchronisierten Uhrzeit im gesamten Netzwerk kommen Tools zum Einsatz, die eine Synchronisation mit öffentlichen Zeitservern durchführen. In diesem Abschnitt soll jedoch gezeigt werden, wie mithilfe eines einfache Skripts die Zeiten auf zwei Computern verglichen werden können und, sofern keine Übereinstimmung vorliegt, die Zeit auf dem Zielcomputer auf die Zeit des Referenzcomputers festgelegt werden kann. Bei dieser Vorgehensweise wird davon ausgegangen, dass bereits auf eine externe Quelle zugegriffen und auf dem Referenzcomputer die korrekte Zeit eingestellt wurde. Mit einem komplexeren Skript könnte automatisch eine Referenzzeit von einer externen Quelle abgerufen und dann auf den Zielcomputern entsprechend eingestellt werden. Zwar wird diese Funktion von WMI nicht geboten, kann jedoch über ein Befehlszeilentool oder eine Webanwendung ausgeführt werden, das oder die über die WSH Exec-Methode ausgeführt wird. Vorsicht Active Directory synchronisiert Datum und Uhrzeit auf Computern, die über Konten im Verzeichnisdienst verfügen, automatisch. Ändern Sie also nicht das Datum oder die Uhrzeit auf einem Computer, der Mitglied einer Active Directory-Domäne ist.
Der Befehl net time bietet Optionen zur Synchronisation der Zeit mit einem Zeitserver. Schritte zur Skripterstellung In Listing 57 wird mithilfe der LocalDateTime-Eigenschaft der Klasse Win32_OperatingSystem die Systemzeit (zeitzonenbereinigt) auf zwei Computern verglichen Auf jedem Computer zieht das Skript die vierzehn ganz links befindlichen Zeichen von LocalDateTime heran (die, mit denen Datum und Uhrzeit sekundengenau angegeben werden) und vergleicht die gekürzten Zeichenfolgen Wenn die Zeit auf dem ersten Computer nicht mit der auf dem zweiten übereinstimmt, verwendet das Skript die SetDateTime-Methode der Win32-OperatingSystem-Klasse, um den zweiten Computer auf die Zeit des ersten einzustellen. Hierbei werden sommerzeitbedingte Unterschiede berücksichtigt, denn wenn sich beide Computer in der gleichen Zeitzone befinden und die Zeit die gleiche ist, muss auch die Sommerzeiteinstellung der Computer die gleiche sein. Bei Verwendung dieses Skripts ist die Genauigkeit der Zeitsynchronisation in der Regel auf die Minute und nicht auf die Sekunde beschränkt, da Netzwerklatenz und die Zeit zum Ausführen des Codes berücksichtigt werden müssen. Führen Sie dazu im Skript die folgenden Schritte aus: 1. | Erstellen Sie Variablen zur Angabe der Namen der beiden Computer. | 2. | Verwenden Sie auf jedem der beiden Computer einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest. Beachten Sie, dass dieses Skript nicht die Netzwerkkonnektivität zum jeweiligen Computer prüft. | 3. | Verwenden Sie auf beiden Computern die ExecQuery-Methode zum Abfragen der Win32_OperatingSystem-Klasse. Hiermit werden zwei Auflistungen von Betriebssystemobjekten mit je einem Objekt pro Auflistung zurückgegeben. | 4. | Rufen Sie nach dem Eintreffen des Rückgabewertes jedes ExecQuery-Aufrufs die VBScript-Funktion Now auf, und weisen Sie die Sekunden jeder Zeitangabe einer Variablen zu. Die Funktion Now gibt das Systemdatum und die Systemuhrzeit zum Zeitpunkt der Ausführung zurück. | 5. | Weisen Sie die Differenz zwischen den beiden Zeitvariablen einer weiteren Variablen zu, die die Differenz zwischen den Zeiten repräsentiert, zu denen die Abfragen von Win32_OperatingSystem ausgeführt wurden. Der Zeitpunkt, zu dem die jeweilige Abfrage ausgeführt wurde, bestimmt die Zeit, die die LocalDateTime-Eigenschaft von diesem Computer abruft. | 6. | Wenn die Differenz zwischen den beiden Zeitvariablen nicht 0 beträgt, weisen Sie diese einer Variablen zu, die die Differenz zwischen den Zeiten repräsentiert, zu denen die Ausführung der beiden Abfragen von Win32_OperatingSystem abgeschlossen war. Die mit der LocalDateTime-Eigenschaft auf jedem Computer abgerufene Zeit ist von dem exakten Zeitpunkt abhängig, zu dem die Abfrage ausgeführt wird. | 7. | Durchlaufen Sie jedes Betriebssystemobjekt in der Auflistung auf dem ersten Computer mit einer For Each-Schleife. | 8. | Durchlaufen Sie innerhalb der ersten For Each-Schleife jedes Betriebssystemobjekt in der Auflistung auf dem zweiten Computer mit einer verschachtelten For Each-Schleife. | 9. | Rufen Sie mithilfe der LocalDateTime-Eigenschaft die lokale Systemzeit von beiden Computern ab. | 10. | Weisen Sie die LocalDateTime-Eigenschaft des ersten (Referenz-)Computers einer Variablen zu, die verwendet wird, um die Zeit auf dem zweiten (Ziel-)Computer im Bedarfsfall einzustellen. | 11. | Kürzen Sie die von LocalDateTime zurückgegebenen Datums-/Uhrzeitobjekte auf den Datums-, Stunden- und Minutenwert. | 12. | Falls es eine Abweichung zwischen den beiden Now-Werten gibt, verwenden Sie diese zum Anpassen der Referenzzeit, bevor Sie die beiden Zeiten vergleichen. | 13. | Vergleichen Sie die beiden angepassten Datums- und Uhrzeitwerte. | 14. | Wenn Datums- und Uhrzeitangaben gleich sind, geben Sie eine Meldung aus. | 15. | Wenn Datums- und Uhrzeitangaben nicht gleich sind, rufen Sie auf dem Zielcomputer die SetDateTime-Methode von Win32-OperatingSystem auf. | 16. | Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgs- oder Fehlermeldung an. |
Listing 57 Time-sync.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
On Error Resume Next
strComputer1 = "."
strComputer2 = "client1"
Set objWMIService1 = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer1 & "\root\cimv2")
Set objWMIService2 = GetObject("winmgmts:{impersonationLevel=impersonate, " _
& "(Systemtime)}!\\" & strComputer2 & "\root\cimv2")
Set colOSes1 = objWMIService1.ExecQuery("SELECT * FROM Win32_OperatingSystem")
strTime1 = Now
Set colOSes2 = objWMIService2.ExecQuery("SELECT * FROM Win32_OperatingSystem")
strTime2 = Now
intSeconds1 = CInt(Left(Right(strTime1, 5), 2))
intSeconds2 = CInt(Left(Right(strTime2, 5), 2))
intDiff = 0
If intSeconds1 <> intSeconds2 Then
intDiff = intSeconds2 - intSeconds1
End If
For Each objOS1 in colOSes1
For Each objOS2 in colOSes2
dtmRefDateTime = objOS1.LocalDateTime
intDateTime1 = Left(dtmRefDateTime, 14)
intDateTime2 = Left(objOS2.LocalDateTime, 14)
If intDiff <> 0 Then
intDateTime1 = intDateTime1 + intDiff
End If
If intDateTime1 = intDateTime2 Then
Wscript.Echo "Dates and times on " & strComputer1 & " and " & _
strComputer2 & "are equal."
Else
intSet = objOS2.SetDateTime(dtmRefDateTime)
If intSet = 0 Then
Wscript.Echo "Successfully synchronized date and time on " & _
strComputer2 & " with reference (" & strComputer1 & ")."
Else
Wscript.Echo "Unable to set new date and time on " & strComputer2 & "."
End If
End If
Next
Next |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-sync.vbs Successfully synchronized date and time on client1 with reference (.). Synchronisieren der Uhrzeiten auf mehreren ComputernDie Erweiterung des Zeitvergleichs von zwei auf eine beliebige Anzahl Computer gestaltet sich relativ einfach. Im folgenden Skript wird grundlegend der gleiche Code wie in Time-sync.vbs verwendet. Allerdings wird eine Liste mit Computern aus einem Array abgerufen und dann eine Iteration durchgeführt, bei der die Systemzeiten mit der eines Referenzcomputers verglichen und im Bedarfsfall synchronisiert werden. Das Skript verwendet einen groben Algorithmus für Zeitvergleich und Synchronisation und zeigt so eine Möglichkeit zum Synchronisieren von Computerzeiten mithilfe von Skripten auf. Wenn die Netzwerklatenz jedoch zu hoch ist, könnten die Systemzeiten auf Computern, die mit dieser Methode synchronisiert wurden, allerdings in inakzeptabler Weise von der Referenzzeit abweichen. Vorsicht Active Directory synchronisiert Datum und Uhrzeit auf Computern, die über Konten im Verzeichnisdienst verfügen, automatisch. Ändern Sie also nicht das Datum oder die Uhrzeit auf einem Computer, der Mitglied einer Active Directory-Domäne ist.
Schritte zur Skripterstellung In Listing 58 wird die Systemzeit (zeitzonenbereinigt) auf mehreren Computern verglichen, deren Namen oder IP-Adresse aus einem Array abgerufen werden. Wenn die Zeit auf einem der Computer nicht mit der Standardzeit übereinstimmt, wird sie vom Skript zurückgesetzt. 1. | Erstellen Sie eine Variable zur Angabe des Namens des Referenzcomputers. | 2. | Erstellen Sie ein Array, das die Namen oder IP-Adressen der Zielcomputer aufnehmen soll. | 3. | Verwenden Sie auf dem Referenzcomputer einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest. | 4. | Durchlaufen Sie das Array mit den Zielcomputern mit einer Schleife und führen Sie für jeden Computer die folgenden Aufgaben durch. | 5. | Verwenden Sie die Exec-Methode des WshShell-Objekts, um per "Ping" zu prüfen, ob eine Verbindung zum Zielcomputer hergestellt werden kann. | 6. | Verwenden Sie auf jedem Computer die ExecQuery-Methode zum Abfragen der Win32_OperatingSystem-Klasse. Hiermit werden zwei Auflistungen von Betriebssystemobjekten mit je einem Objekt pro Auflistung zurückgegeben. | 7. | Rufen Sie nach dem Eintreffen des Rückgabewertes jedes ExecQuery-Aufrufs die VBScript-Funktion Now auf, und weisen Sie die Sekunden jeder Zeitangabe einer Variablen zu. Die Funktion Now gibt das Systemdatum und die Systemuhrzeit zum Zeitpunkt der Ausführung zurück. | 8. | Weisen Sie die Differenz zwischen den beiden Zeitvariablen einer weiteren Variablen zu, die die Differenz zwischen den Zeiten repräsentiert, zu denen die Abfragen von Win32_OperatingSystem ausgeführt wurden. Der Zeitpunkt, zu dem die jeweilige Abfrage ausgeführt wird, bestimmt die Zeit, die von der LocalDateTime-Eigenschaft auf diesem Computer zurückgegeben wird. | 9. | Wenn der Unterschied zwischen den beiden Zeitvariablen nicht 0 ist, weisen Sie diesen einer Variablen zu. Diese Variable repräsentiert den Unterschied zwischen den Zeiten, zu denen die Ausführung der beiden Win32_OperatingSystem-Abfragen beendet war. Die mit der LocalDateTime-Eigenschaft auf jedem Computer abgerufene Zeit ist von dem exakten Zeitpunkt abhängig, zu dem die Abfrage ausgeführt wird. | 10. | Durchlaufen Sie jedes Betriebssystemobjekt in der Auflistung auf dem ersten Computer mit einer For Each-Schleife. | 11. | Durchlaufen Sie innerhalb der ersten For Each-Schleife jedes Betriebssystemobjekt in der Auflistung auf dem zweiten Computer mit einer verschachtelten For Each-Schleife. | 12. | Rufen Sie mithilfe der LocalDateTime-Eigenschaft die lokale Systemzeit von beiden Computern ab. | 13. | Weisen Sie die LocalDateTime-Eigenschaft des ersten (Referenz-)Computers einer Variablen zu, die verwendet wird, um die Zeit auf dem zweiten (Ziel-)Computer im Bedarfsfall einzustellen. | 14. | Kürzen Sie die von LocalDateTime zurückgegebenen Datums-/Uhrzeitobjekte auf den Datums-, Stunden- und Minutenwert. | 15. | Falls es eine Abweichung zwischen den beiden Now-Werten gibt, verwenden Sie diese zum Anpassen der Referenzzeit, bevor Sie die beiden Zeiten vergleichen. | 16. | Vergleichen Sie die beiden angepassten Datums- und Uhrzeitwerte. | 17. | Wenn Datums- und Uhrzeitangaben gleich sind, geben Sie eine Meldung aus. | 18. | Wenn Datums- und Uhrzeitangaben nicht gleich sind, rufen Sie auf dem Zielcomputer die SetDateTime-Methode von Win32-OperatingSystem auf. | 19. | Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgs- oder Fehlermeldung an. |
Listing 58 Time-sync-multi.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
On Error Resume Next
strReference = "."
arrTargets = Array("client1", "client2", "192.168.0.1", "192.168.0.2")
Set objWMIService1 = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strReference & "\root\cimv2")
For Each strTarget In arrTargets
WScript.Echo VbCrLf & String(80, "-") & VbCrLf & "Target: " & strTarget _
& VbCrLf
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strTarget)
strPingResults = LCase(objExec.StdOut.ReadAll)
If InStr(strPingResults, "reply from") Then
Set objWMIService2 = GetObject("winmgmts:{impersonationLevel=" _
& "impersonate, (Systemtime)}!\\" & strTarget & "\root\cimv2")
Set colOSes1 = objWMIService1.ExecQuery("SELECT * FROM " & _
"Win32_OperatingSystem")
strTime1 = Now
Set colOSes2 = objWMIService2.ExecQuery("SELECT * FROM " & _
"Win32_OperatingSystem")
strTime2 = Now
intSeconds1 = CInt(Left(Right(strTime1, 5), 2))
intSeconds2 = CInt(Left(Right(strTime2, 5), 2))
intDiff = 0
If intSeconds1 <> intSeconds2 Then
intDiff = intSeconds2 - intSeconds1
End If
For Each objOS1 in colOSes1
For Each objOS2 in colOSes2
dtmRefDateTime = objOS1.LocalDateTime
intDateTime1 = Left(dtmRefDateTime, 14)
intDateTime2 = Left(objOS2.LocalDateTime, 14)
If intDiff <> 0 Then
intDateTime1 = intDateTime1 + intDiff
End If
If intDateTime1 = intDateTime2 Then
Wscript.Echo "Dates and times are equal."
Else
intSet = objOS2.SetDateTime(dtmNewDateTime)
If intSet = 0 Then
Wscript.Echo "Successfully synchronized date and time on " & _
strTarget & " with reference (" & strReference & ")."
Else
Wscript.Echo "Unable to set new date and time on " & strTarget & _
"."
End If
End If
Next
Next
Else
WScript.Echo strTarget & " did not respond to ping."
End If
Next |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>time-sync-multi.vbs -------------------------------------------------------------------------------- Target: client1 Successfully synchronized date and time on client1 with reference (.). -------------------------------------------------------------------------------- Target: client2 Successfully synchronized date and time on client2 with reference (.). -------------------------------------------------------------------------------- Target: 192.168.0.1 192.168.0.1 did not respond to ping. -------------------------------------------------------------------------------- Target: 192.168.0.2 192.168.0.2 did not respond to ping. Ändern von Netzwerkeinstellungen in der RegistrierungTCP/IP-Netzwerkeinstellungen können unter Verwendung der Registrierung abgerufen und geändert werden. Die Registrierung enthält einige Netzwerkeinstellungen, auf die nicht mithilfe von WMI-Klassen, Befehlszeilentools oder über die Windows-Oberfläche zugegriffen werden kann. Verwenden Sie zum Bearbeiten der Registrierung die Klasse StdRegProv des WMI-Anbieters für die Systemregistrierung. Diese Klasse befindet sich im Namespace \root\default, wohingegen sich alle Win32_-Klassen, die bis dato in diesem Dokument besprochen wurden, im Namespace \root\cimv2 befinden. Vorsicht Durch eine fehlerhafte Bearbeitung der Registrierung kann ernsthafter Schaden am System verursacht werden. Bevor Sie Änderungen an der Registrierung vornehmen, sollten Sie eine Sicherungskopie aller wichtigen Daten auf dem Computer erstellen.
Ändern Sie zur Verwendung dieser Klasse die Zeilen in Skripts, mit denen die Verbindung zu WMI hergestellt wird, wie folgt:
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")Geben Sie im GetObject-Aufruf, mit dem die Bindung zum WMI-Dienst hergestellt (ein Verweis erzeugt) wird, den Namespace \root\default (anstelle des Namespaces \root\cimv2) als Teil des Objektpfades an. Erstellen Sie anschließend direkt eine Instanz der Klasse, indem Sie einen Doppelpunkt und den Namen der StdRegProv-Klasse an das Ende des Objektpfades anhängen. Die Klasse StdRegProv gibt einen Verweis auf eine einzelne Instanz in Form eines SWbemObject-Objekts zurück, das die gesamte Registrierung repräsentiert (von der es immer nur eine pro Betriebssystem gibt). Hier liegt der Unterschied zur Auflistung von (oftmals) mehreren Instanzen in Form eines SWbemObjectSet-Objekts, wie es von Win32_NetworkAdapterConfiguration und den meisten anderen bis dato verwendeten Klassen zurückgegeben wird. Da es sich hier um ein SWbemObject- und nicht um ein SWbemObjectSet-Objekt handelt, muss nicht ExecQuery aufgerufen und mit einer Auflistung von Instanzen gearbeitet werden. Stattdessen kann wie im nachstehenden Beispiel gezeigt die punktierte Schreibweise zum direkten Aufrufen von Methoden der StdRegProv-Klasse für den Verweis verwendet werden:
objReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,strValue
Wenn Sie mit den Objekten SWBemObject und SWBemObjectSet als Teil des Objektmodells der WMI-Skriptingbibliothek noch nicht vertraut sind, schlagen Sie in den folgenden Referenzdokumenten nach: Die Klasse StdRegProv weist keine Eigenschaften auf. Tabelle 43 enthält Beschreibungen der Methoden der Klasse StdRegProv. Tabelle 43 Methoden von "StdRegProv" CheckAccess | Überprüft, ob der Benutzer über die angegebenen Zugriffsrechte verfügt. | CreateKey | Erstellt einen Unterschlüssel. | DeleteKey | Löscht einen Unterschlüssel. | DeleteValue | Löscht einen benannten Wert. | EnumKey | Erstellt eine Auflistung der Unterschlüssel. | EnumValues | Erstellt eine Auflistung der benannten Werte eines Schlüssels. | GetBinaryValue | Ruft den Binärdatenwert eines benannten Wertes ab. | GetDWORDValue | Ruft den DWORD-Datenwert eines benannten Wertes ab. | GetExpandedStringValue | Ruft den Datenwert der erweiterten Zeichenfolge eines benannten Wertes ab. | GetMultiStringValue | Ruft die Datenwerte mehrerer Zeichenfolgen eines benannten Wertes ab. | GetStringValue | Ruft den Datenwert der Zeichenfolge eines benannten Wertes ab. | SetBinaryValue | Legt den Binärdatenwert eines benannten Wertes fest. | SetDWORDValue | Legt den DWORD-Datenwert eines benannten Wertes fest. | SetExpandedStringValue | Legt den Datenwert der erweiterten Zeichenfolge eines benannten Wertes fest. | SetMultiStringValue | Legt die Werte mehrerer Zeichenfolgen eines benannten Wertes fest. | SetStringValue | Legt den Zeichenfolgewert eines benannten Wertes fest. |
Alle Methoden in der vorstehenden Tabelle geben eine positive ganze Zahl zurück: | • | 0 bedeutet: erfolgreicher Abschluss. | | • | Zahlen größer als 0 weisen auf einen Fehler hin. |
Weitere Informationen über die Klasse StdRegProv und deren Methoden finden Sie unter "StdRegProv" im WMI SDK unter http://go.microsoft.com/fwlink/?LinkId=29999 (englischsprachig). Die Methoden GetStringValue und GetDWORDValue geben über einen Ausgabeparameter Informationen an das Skript zurück, ein Mechanismus, der in diesem Dokument bis dato noch nicht erwähnt wurde. Zu diesem Zweck übergibt das Skript die ersten drei Parameter an die GetStringValue-Methode, um der Methode mitzuteilen, welcher Eingabe der Wert entnommen werden soll. Diese Informationen werden im letzten Parameter zurückgegeben, in diesem Fall in Form der Zeichenfolgenvariablen strValue. Nachdem die Zeile ausgeführt wurde, enthält die Variable den Wert des Registrierungseintrags "Hostname" an der Position HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters. Die letzte Zeile des Skripts zeigt diesen Wert an. Die Skripts in diesem Abschnitt rufen Zeichenfolgen- (REG_SZ) und DWORD-Werte (REG_DWORD, eine 32-Bit-Ganzzahl) aus der Registrierung ab und legen diese ebenso fest. Zum Abrufen und Festlegen von Zeichenfolgen- und DWORD-Typen werden verschiedene Methoden verwendet. Die Klasse StdRegProv umfasst darüber hinaus noch weitere Methoden für Mehrfachzeichenfolgen-, erweiterte Zeichenfolgen- und Binärwerte. Der Eintrag mit der Zeichenfolge (Hostname) lautet: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname Der Eintrag mit dem DWORD-Wert (DeadGWDetectDefault) lautet: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DeadGWDetectDefault Tabelle 44 beschreibt die Registrierungsunterschlüssel in Verbindung mit der TCP/IP-Clientvernetzung. Tabelle 44 Registrierungsunterschlüssel in Verbindung mit der TCP/IP-Clientvernetzung HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\Tcpip\Parameters | Enthält globale TCP/IP-Konfigurationseinstellungen, die sich auf alle Netzwerkadapter im Computer beziehen. | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\Tcpip\Parameters\Interfaces | Enthält TCP/IP-Konfigurationseinstellungen für jeden spezifischen Adapter (Schnittstelle) in seinen Unterschlüsseln, die mit GUIDs bezeichnet sind. | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\Dhcp\Parameters\Options | Enthält Konfigurationseinstellungen für DHCP-Optionen in seinen Unterschlüsseln. | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\Dnscache\Parameters | Enthält Konfigurationseinstellungen für den lokalen DNS-Cacheauflösungsdienst des DNS-Clients. | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\NetBT\Parameters | Enthält globale Konfigurationseinstellungen für NetBIOS über TCP/IP und WINS, die sich auf alle Netzwerkadapter im Computer beziehen. | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\NetBT\Parameters\Interfaces | Enthält Konfigurationseinstellungen für NetBIOS über TCP/IP und WINS für jeden spezifischen Adapter (Schnittstelle) in seinen Unterschlüsseln, die mit GUIDs bezeichnet sind. |
Weitere Informationen über die Verwendung von Skripts zum Konfigurieren der Registrierung sowie detaillierte Informationen über zahlreiche Registrierungseinträge finden Sie in den nachstehenden Referenzdokumenten: Abrufen eines Zeichenfolgenwertes aus der Registrierung mithilfe von WMIDieses Skript zeigt, wie eine TCP/IP-Netzwerkeinstellung (Hostname) aus einem Registrierungseintrag abgerufen wird, dessen Wert eine Zeichenfolge (REG_SZ) ist. Zu diesem Zweck verwendet das Skript die GetStringValue-Methode der Klasse StdRegProv des WMI-Anbieters für die Systemregistrierung. Schritte zur Skripterstellung 1. | Erstellen Sie eine Konstante zur Aufnahme des Hexadezimalwertes für HKEY_LOCAL_MACHINE. | 2. | Erstellen Sie eine Variable, und weisen Sie ihr den Namen des Computers zu. Der Name kann entweder aus einem Hostnamen oder einer IP-Adresse bestehen. | 3. | Erstellen Sie Variablen für den Pfad des Registrierungsschlüssels und den Namen des Eintrags. | 4. | Verwenden Sie einen GetObject-Aufruf, um auf dem angegebenen Computer eine Verbindung zum WMI-Namespace root\default herzustellen, legen Sie den Parameter "impersonationLevel" auf "impersonate" fest, erstellen Sie eine Instanz der Klasse StdRegProv, und weisen Sie diese der Variablen objReg zu. | 5. | Rufen Sie die GetStringValue-Methode der Klasse StdRegProv auf, übergeben Sie Parameter für Unterstruktur, Schlüsselpfad und Eintragsname, und weisen Sie den Ausgabeparameter für den Zeichenfolgenwert der Variablen strValue zu. | 6. | Zeigen Sie den Eintragsnamen und dessen Zeichenfolgenwert an. |
Listing 59 Reg-get-string.vbs
1
2
3
4
5
6
7
8
9
10 |
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
strEntryName = "Hostname"
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,strValue
Wscript.Echo strEntryName & ": " & strValue |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>reg-get-string.vbs Hostname: client1 Abrufen eines numerischen Wertes aus der Registrierung mithilfe von WMIDieses Skript zeigt, wie eine TCP/IP-Netzwerkeinstellung (DeadGWDetectDefault) aus einem Registrierungseintrag abgerufen wird, dessen Wert ein DWORD (REG_DWORD, eine 32-Bit-Ganzzahl) ist. Zu diesem Zweck verwendet das Skript die GetDWORDValue-Methode der Klasse StdRegProv des WMI-Anbieters für die Systemregistrierung. Schritte zur Skripterstellung 1. | Erstellen Sie eine Konstante zur Aufnahme des Hexadezimalwertes für HKEY_LOCAL_MACHINE. | 2. | Erstellen Sie eine Variable, und weisen Sie ihr den Namen des Computers zu. Der Name kann entweder aus einem Hostnamen oder einer IP-Adresse bestehen. | 3. | Erstellen Sie Variablen für den Pfad des Registrierungsschlüssels und den Namen des Eintrags. | 4. | Verwenden Sie einen GetObject-Aufruf, um auf dem angegebenen Computer eine Verbindung zum WMI-Namespace root\default herzustellen, legen Sie den Parameter "impersonationLevel" auf "impersonate" fest, erstellen Sie eine Instanz der Klasse StdRegProv, und weisen Sie diese der Variablen objReg zu. | 5. | Rufen Sie die GetDWORDValue-Methode der Klasse StdRegProv auf, übergeben Sie Parameter für Unterstruktur, Schlüsselpfad und Eintragsname, und weisen Sie den Ausgabeparameter für den DWORD-Wert der Variablen strValue zu. | 6. | Zeigen Sie den Eintragsnamen und dessen DWORD-Wert an. |
Listing 60 Reg-get-dword.vbs
1
2
3
4
5
6
7
8
9
10
|
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
strEntryName = "DeadGWDetectDefault"
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,dwValue
Wscript.Echo strEntryName & ": " & dwValue |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>reg-get-dword.vbs DeadGWDetectDefault: 1 Festlegen eines Zeichenfolgenwertes in der Registrierung mithilfe von WMIDieses Skript zeigt, wie eine TCP/IP-Netzwerkeinstellung (Hostname) in einem Registrierungseintrag festgelegt wird, dessen Wert eine Zeichenfolge (REG_SZ) ist. Zu diesem Zweck verwendet das Skript die SetStringValue-Methode der Klasse StdRegProv des WMI-Anbieters für die Systemregistrierung. Schritte zur Skripterstellung 1. | Erstellen Sie eine Konstante zur Aufnahme des Hexadezimalwertes für HKEY_LOCAL_MACHINE. | 2. | Erstellen Sie eine Variable, und weisen Sie ihr den Namen des Computers zu. Der Name kann entweder aus einem Hostnamen oder einer IP-Adresse bestehen. | 3. | Erstellen Sie Variablen für den Pfad des Registrierungsschlüssels und den Namen des Eintrags. | 4. | Verwenden Sie einen GetObject-Aufruf, um auf dem angegebenen Computer eine Verbindung zum WMI-Namespace root\default herzustellen, legen Sie den Parameter "impersonationLevel" auf "impersonate" fest, erstellen Sie eine Instanz der Klasse StdRegProv, und weisen Sie diese der Variablen objReg zu. | 5. | Rufen Sie die SetStringValue-Methode der Klasse StdRegProv auf, und übergeben Sie Parameter für Unterstruktur, Schlüsselpfad, Eintragsname und Zeichenfolgenwert. | 6. | Rufen Sie die GetStringValue-Methode der Klasse StdRegProv auf, übergeben Sie Parameter für Unterstruktur, Schlüsselpfad und Eintragsname, und weisen Sie den Ausgabeparameter für den Zeichenfolgenwert der Variablen strValue zu. | 7. | Zeigen Sie den Eintragsnamen und dessen Zeichenfolgenwert an. |
Listing 61 Reg-set-string.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
strEntryName = "Domain"
strValue = "fabrikam.com"
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strEntryName, strValue
objReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,strValue
Wscript.Echo strEntryName & ": " & strValue |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>reg-set-string.vbs Domain: fabrikam.com Festlegen eines numerischen Wertes in der Registrierung mithilfe von WMIDieses Skript zeigt, wie eine TCP/IP-Netzwerkeinstellung (DeadGWDetectDefault) in einem Registrierungseintrag festgelegt wird, dessen Wert ein DWORD (REG_DWORD, eine 32-Bit-Ganzzahl) ist. Zu diesem Zweck verwendet das Skript die SetDWORDValue-Methode der Klasse StdRegProv des WMI-Anbieters für die Systemregistrierung. Schritte zur Skripterstellung 1. | Erstellen Sie eine Konstante zur Aufnahme des Hexadezimalwertes für HKEY_LOCAL_MACHINE. | 2. | Erstellen Sie eine Variable, und weisen Sie ihr den Namen des Computers zu. Der Name kann entweder aus einem Hostnamen oder einer IP-Adresse bestehen. | 3. | Erstellen Sie Variablen für den Pfad des Registrierungsschlüssels und den Namen des Eintrags. | 4. | Verwenden Sie einen GetObject-Aufruf, um auf dem angegebenen Computer eine Verbindung zum WMI-Namespace root\default herzustellen, legen Sie den Parameter "impersonationLevel" auf "impersonate" fest, erstellen Sie eine Instanz der Klasse StdRegProv, und weisen Sie diese der Variablen objReg zu. | 5. | Rufen Sie die SetDWORDValue-Methode der Klasse StdRegProv auf, und übergeben Sie Parameter für Unterstruktur, Schlüsselpfad, Eintragsname und DWORD-Wert. | 6. | Rufen Sie die GetDWORDValue-Methode der Klasse StdRegProv auf, übergeben Sie Parameter für Unterstruktur, Schlüsselpfad und Eintragsname, und weisen Sie den Ausgabeparameter für den DWORD-Wert der Variablen dwValue zu. | 7. | Zeigen Sie den Eintragsnamen und dessen DWORD-Wert an. |
Listing 62 Reg-set-dword.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
strEntryName = "DeadGWDetectDefault"
dwValue = 1
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strEntryName, dwValue
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,dwValue
Wscript.Echo strEntryName & ": " & dwValue |
Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt: C:\scripts>reg-set-dword.vbs DeadGWDetectDefault: 1 Tools für die Netzwerkverwaltung mit fortgeschrittenen SkriptingtechnikenDas Windows-Betriebssystem stellt Tools und Registrierungsschlüssel für die Durchführung fortgeschrittener Skriptingverfahren bereit. Tabelle 45 enthält eine Liste der Befehlszeilentools, die in Verbindung mit den fortgeschrittenen Verfahren der Skripterstellung zur Verwaltung des Netzwerkes eingesetzt werden können. Tabelle 45 Tools und Verfahren für die fortgeschrittene Netzwerkverwaltung Befehlszeilentools | Ping.exe | Windows-Betriebssysteme1 | Befehlszeilentools | Remote.exe | Windows Server 2003-Supporttools | Befehlszeilentools | Remote Command Service (Rcmd.exe und Rcmdsvc.exe) | Windows 2000 Resource Kit | Befehlszeilentools | Remote Console | Windows 2000 Resource Kit | Befehlszeilentools | Rsh.exe und Rshsvc.exe: TCP/IP Remote Shell Service | Windows 2000 Resource Kit | Befehlszeilentools | Telnet.exe | Windows-Betriebssysteme | Befehlszeilentools | Timezone.exe: Tool zur Aktualisierung der Sommerzeit | Windows 2000 Resource Kit | Befehlszeilentools | Tzedit.exe: Zeitzoneneditor | Windows 2000 Resource Kit (GUI-Tool) | Befehlszeilentools | Wsremote.exe | Windows XP-Supporttools | WSH | WshController | | WMI | StdRegProv | | WMI | SWbemDateTime | Nur Windows XP und Windows Server 2003 | WMI | Win32_ComputerSystem | | WMI | Win32_CurrentTime | Nur Windows XP und Windows Server 2003 | WMI | Win32_LocalTime | Nur Windows XP und Windows Server 2003 | WMI | Win32_NetworkAdapterConfiguration | | WMI | Win32_NetworkAdapter | | WMI | Win32_OperatingSystem | | WMI | Win32_PingStatus | Nur Windows XP und Windows Server 2003 | WMI | Win32_TimeZone | | WMI | Win32_UTCTime | Nur Windows XP und Windows Server 2003 | ADSI | Keines | |
Tabelle 46 enthält eine Liste der Registrierungsschlüssel zum Verwalten des Netzwerkes bei Verwendung von fortgeschrittenen Verfahren zur Skripterstellung. Vorsicht Durch eine fehlerhafte Bearbeitung der Registrierung kann ernsthafter Schaden am System verursacht werden. Bevor Sie Änderungen an der Registrierung vornehmen, sollten Sie eine Sicherungskopie aller wichtigen Daten auf dem Computer erstellen.
Tabelle 46 Registrierungsunterschlüssel für das Verwalten von Netzwerken mit fortgeschritten Skriptingtechniken HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp\Parameters\Options | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces |
| |