TechNet Magazine > Home > Alle Ausgaben > 2008 > Juli >  Hey, Scripting Guy! Der Adrenalinschub
Hey, Scripting Guy! Der Adrenalinschub
Die Scripting Guys von Microsoft


Zweifellos ist das Schreiben für das TechNet Magazin unserer Meinung nach eine hochgradig angesehene und lohnenswerte Aufgabe. (Es wäre natürlich noch viel besser, wenn wir dafür Geld sehen würden, aber das ist eine Sache für sich.) Wie angesehen ist denn nun diese Aufgabe? Sagen wir es mal so: Überall auf der Welt schauen Kinder, die gerade ins Bett gesteckt werden, in diesem Moment zu ihren Müttern hoch und sagen: „Mami, wenn ich groß bin, will ich jeden Monat die Skripting-Rubrik für das TechNet Magazin schreiben.“
Anmerkung: Allerdings glauben eine ganze Menge Leute bereits, dass diese Rubrik sowieso von Kindern geschrieben wird. Aber darum geht es hier nicht.
Die Scripting Guys genießen es wirklich, wenn sie von anderen wegen ihrer Artikel im TechNet Magazin bewundert werden. Selbst mit Autogrammjägern und Paparazzi können sie inzwischen umgehen. Aber eigentlich geht es uns bei der Arbeit nicht um Ruhm und Ehre. Uns reizt der pure Adrenalinschub, den die Skriptprogrammierung für die Systemverwaltung mit sich bringt.
Zugegeben, Sie werden die Ausdrücke „purer Adrenalinschub“ und „Skriptprogrammierung für die Systemverwaltung“ nicht oft im selben Satz hören. (Es sei denn, der pure Adrenalinschub ergibt sich daraus, dass letztere bisher überhaupt nicht vorhanden war.)
Der Durchschnittsbenutzer hält die Skriptprogrammierung für die Systemverwaltung für äußerst nützlich, aber vermutlich nicht für besonders spannend. Wahrscheinlich findet er das Ganze etwas langweilig. Der Grund dafür: Keiner dieser Benutzer hat je versucht, Startkonfigurationsdatenskripts für Windows Vista® oder Windows Server® 2008 zu schreiben.
Ah, da schlägt Ihr Herz gleich etwas schneller, nicht wahr? Wie die meisten von Ihnen wahrscheinlich wissen, wurde in Windows Vista und Windows Server 2008 die alte boot.ini-Datei zugunsten eines neuen Startkonfigurations-Datenspeichers verworfen, der eine flexiblere Verwaltung des Startvorgangs (und mehr Funktionen) bietet.
Das ist schon toll. Aber wirklich fantastisch ist Folgendes: Dank eines neuen Windows® Verwaltungsinstrumentations-Anbieters (Windows Management Instrumentation, WMI) kann jetzt auf den Startkonfigurations-Datenspeicher (Boot Configuration Data, BCD) problemlos zugegriffen und dieser mithilfe von Skripts vollständig verwaltet werden.
Sie fragen sich, was das merkwürdige Gefühl ist, das Ihnen über den Rücken läuft? So fühlt sich ein purer Adrenalinschub an. Daran werden Sie sich gewöhnen müssen, wenn Sie erst einmal mit BCD-Skripts arbeiten.
Zunächst sollte an dieser Stelle darauf hingewiesen werden, dass wir nicht einmal ansatzweise alles behandeln können, was mit dem BCD-Anbieter möglich ist, zumindest nicht in diesem einen Artikel. (Wir schickten den Herausgebern des Magazins eine E-Mail, in der wir eine Doppelausgabe des Magazins anregten, die sich ausschließlich dem Schreiben von Startkonfigurations-Datenspeicherskripts widmet, aber wir haben bis heute noch keine Antwort erhalten.)
Wenn Sie detailliertere Informationen suchen, sollten Sie sich die Dokumentation zum BCD WMI-Anbieter unter go.microsoft.com/fwlink/?LinkId=116953 genauer ansehen. In der Zwischenzeit zeigen wir Ihnen einige Beispielcodes, die für Mehrfachstartcomputer entworfen wurden, also für Computer, auf denen mehr als ein Betriebssystem installiert ist.
Leider funktionieren diese Skripts nur unter Windows Vista und Windows Server 2008. Wie bereits erwähnt, sind dies die beiden einzigen Betriebssysteme, die BCD momentan unterstützen.
Werfen Sie zunächst einen Blick auf ein Skript, das angibt, welches Betriebssystem derzeit auf dem Computer verwendet wird. Zugegeben, den BCD-Anbieter auf diese Art zu verwenden ist nicht besonders aufregend. Schließlich können Sie bereits mit der WMI-Klasse „Win32_OperatingSystem“ herausfinden, welches Betriebssystem aktuell auf dem Computer verwendet wird. Dieses relativ einfache Skript (zumindest, was die Größe des BCD-Skripts betrifft) ist aber ein gutes Beispiel, um die grundlegenden Techniken beim Arbeiten mit BCD zu demonstrieren. (Techniken, die gelinde gesagt ein bisschen … ungewöhnlich sind.)
Außerdem dürfen wir in unserer Rubrik nicht zu viel Aufregung einbauen: TechNet Magazin hat uns bereits mitgeteilt, dass wir für sämtliche Schäden gerade stehen müssen, die von erregten und übereifrigen Fans von „Hey, Scripting Guy!“ verursacht werden. In Anbetracht des allgemeinen Chaos, das auf der ganzen Welt nach dem Artikel über reguläre Ausdrücke ausgebrochen ist, können wir uns etwas Ähnliches nun nicht mehr leisten.
Hinweis: Erinnern Sie sich noch an die Videos, auf denen die Beatles von ihren Fans umlagert wurden, und an die Bilder der Mädchen, die kreischten und ohnmächtig wurden, als sie John, Paul, George und Ringo zu Gesicht bekamen? Das ist ziemlich genau das, was uns nach der Veröffentlichung eines neuen Artikels immer passiert.
Na gut, zugegeben, das ist vielleicht etwas übertrieben. Aber zweifellos gibt es viele Leser, sowohl männlichen als auch weiblichen Geschlechts, die nach der Lektüre eines unserer Artikel tief ergriffen sind.
Wie auch immer, schauen Sie sich das Skript in Abbildung 1 an. Hier wird mithilfe des BCD-Anbieters ermittelt, welches Betriebssystem derzeit auf dem Computer verwendet wird. Beachten Sie vor der Ausführung dieses Skripts, dass es nur erfolgreich als Administrator ausgeführt werden kann.
Const BcdLibraryString_Description = &h12000004
Const Current = "{fa926493-6f1c-4193-a414-58f0b2456d1e}"

strComputer = "."

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
 strComputer & "\root\wmi:BcdStore")

objStoreClass.OpenStore "", objStore
objStore.OpenObject Current, objDefault

objDefault.GetElement BcdLibraryString_Description, objElement
Wscript.Echo "Current operating system: " & objElement.String
Das heißt nicht, dass Sie sich einfach mit einem Konto anmelden, das Administratorrechte besitzt. Es bedeutet vielmehr, dass Sie ein Eingabeaufforderungsfenster öffnen müssen, indem Sie im Startmenü mit der rechten Maustaste auf Eingabeaufforderung klicken und „Als Administrator ausführen“ auswählen. Dann können Sie dieses Skript von der Eingabeaufforderung aus ausführen.
Also, wie funktioniert dieses Skript? Wir haben schon befürchtet, dass Sie das fragen. Kein Problem: Wir werden versuchen, es Ihnen so gut wie möglich zu erklären (was zumindest die Aufregung auf ein Minimum reduzieren dürfte, zumindest für eine Weile).
Zunächst werden zwei Konstanten definiert: BcdLibraryString_Description und Current. BcdLibraryString_Description verweist auf das Objekt, das abgerufen werden soll. In diesem Fall enthält das Objekt die Beschreibung (den Namen) des aktuellen Betriebssystems.
Das ist übrigens eine der netten Eigenarten bei der Arbeit mit dem BCD-Anbieter. In der Regel rufen Sie den Wert einer Eigenschaft nicht einfach nur ab, Sie verwenden stattdessen einen dieser konstanten Werte (und die GetElement-Methode), um ein anderes Objekt abzurufen, und geben dann den Wert der Eigenschaft, die zu diesem Objekt gehört, wieder zurück. Sicher, das ist etwas merkwürdig, aber wie heißt es so schön: Der Weg ist das Ziel.
Anmerkung: Wobei man sich fragen könnte, wohin es hier eigentlich geht.
Was die Current-Konstante angeht, so ist sie einfach eine GUID, die das aktuell verwendete Betriebssystem repräsentiert. Der Wert
 {fa926493-6f1c-4193-a414-58f0b-2456d1e} 
wird als „bekannte“ GUID angesehen (was zumindest beweist, dass die Leute bei Microsoft tatsächlich Sinn für Humor haben).
Trotz der Tatsache, dass dies eine bekannte GUID ist, gingen wir einen Schritt weiter und nahmen den Wert für den Fall auf, dass sich einige von Ihnen beim Lesen nicht daran erinnern können, welcher der beiden folgenden Werte korrekt ist:
{fa926493-6f1c-4193-a414-58f0b2456d1e} 
{fa926493-6f1c-4193-a414-58f0b2456d1f}
Anmerkung: Falls Sie sich fragen, wie GUID ausgesprochen wird: entweder wie „gwid“ oder wie „guu-id“. Wir könnten Ihnen sogar noch mehr erzählen, so etwa die Tatsache, dass die obige GUID eine V1-GUID sein muss, weil die dritte Zifferngruppe mit einer 4 beginnt. Aber schließlich sollte die Aufregung ja auf ein Minimum reduziert werden. Ein solches Versprechen muss man einhalten.
Wie Sie vielleicht schon erraten haben, müssen Sie beim Arbeiten mit dem BCD-Anbieter relativ häufig Konstanten, hexadezimale Werte und GUIDs verwenden. In diesem Artikel können nicht sämtliche dieser Punkte behandelt werden, aber auf der bereits erwähnten BCD-Seite in MSDN® finden Sie weitere Informationen (go.microsoft.com/fwlink/?LinkId=116953). Das heißt, wenn Sie die ganze Aufregung aushalten können.
Nach der Definition der beiden Konstanten stellen Sie eine Verbindung zum WMI-Dienst des lokalen Computers her. Können Sie dieses Skript verwenden, um die Startkonfigurationsdaten eines Remotecomputers abzurufen? Aber selbstverständlich.
Ehrlich gesagt, wenn Sie das nicht könnten, wäre BCD kaum etwas wert. Sie können die Startkonfigurationsdaten eines Remotecomputers abrufen (auf dem entweder Windows Vista oder Windows Server 2008 ausgeführt wird), indem Sie einfach der Variablen „strComputer“ den Namen dieses Computers zuweisen:
strComputer = "atl-fs-001"
Weiterhin soll auf einige wichtige Elemente in der WMI-Verbindungszeichenfolge hingewiesen werden. Zunächst ist Ihnen vielleicht aufgefallen, dass sowohl die Berechtigungen „Backup“ als auch „Restore“ in die Verbindungszeichenfolge eingebaut wurden, nämlich in der Konstruktion {(Backup,Restore)}. Ist das wirklich wichtig? Wenn Ihr Skript funktionieren soll, dann ist das sehr wichtig: Wenn das Skript nicht explizit die beiden Berechtigungen enthält, tritt ein Fehler auf.
Beachten Sie weiterhin, dass keine Verbindung mit dem Namespace „root\cimv2“ hergestellt wird, also mit dem Namespace, der in Skripts zur Systemverwaltung am häufigsten verwendet wird. Stattdessen wird eine Verbindung mit dem Namespace „root\WMI“ hergestellt, der direkt an die BCDStore-Klasse gebunden wird. Das wird durch folgendes Codeelement erreicht:
"\root\wmi:BcdStore" 
Nein, das war nicht der aufregende Teil. Der aufregende Teil kommt noch.
Abgesehen von ein oder zwei Ausnahmen müssen für die meisten BCD-Skripts zunächst die folgenden drei Schritte ausgeführt werden: Definieren der Konstanten, Herstellen einer Verbindung zum WMI-Dienst und schließlich Öffnen des BCD-Speichers. Schritte 1 und 2 sind bereits abgeschlossen. Mit der folgenden Codezeile wird Schritt 3 ausgeführt:
objStoreClass.OpenStore "", objStore
Wie bereits erwähnt, wird hier der BCD-Speicher geöffnet, also die Betriebssystementität, in der die gesamten Startkonfigurationsinformationen gespeichert werden. Sie können den Speicher öffnen, indem Sie einfach die OpenStore-Methode aufrufen und ihr zwei Parameter übergeben:
  • Eine leere Zeichenfolge („“). Dadurch wird dem Skript mitgeteilt, dass der Standardspeicher geöffnet werden soll.
  • objStore. Dies ist ein „out“-Parameter, der dem Skript bereitgestellt wird. Die Methode erhält den Namen einer Variablen, und als Dank gibt die Methode ein Objekt zurück (in diesem Fall ein Objekt, das den BCD-Speicher repräsentiert), das diesen Variablennamen als Objektverweis verwendet.
Nach dem Öffnen des Speichers können Sie mit der OpenObject-Methode noch ein weiteres Objekt abrufen (wird im Out-Parameter „objDefault“ gespeichert):
objStore.OpenObject Current, objDefault
Worum handelt es sich bei diesem neuen Objekt? Richtig: Es ist das Betriebssystem, das gerade verwendet wird. Dies wissen Sie, weil Sie die Konstante „Current“ an OpenObject übergeben haben, also die bekannte GUID, die das aktuelle Betriebssystem repräsentiert.
Sie wissen damit also, welches Betriebssystem auf dem Computer verwendet wird, oder? Nun, fast jedenfalls. Zum Abrufen dieser Informationen verwenden Sie noch GetElement, um ein Objekt abzurufen, das die Beschreibung des Betriebssystems repräsentiert:
objDefault.GetElement _
  BcdLibraryString_Description, objElement
Sie müssen aber versprechen, dass Sie sich nicht übermäßig aufregen und vor Freude ein allgemeines Chaos anrichten. Gut. In diesem Fall können wir Ihnen mitteilen, dass Sie nun den Inhalt der String-Eigenschaft zurückgeben und schließlich das Betriebssystem bestimmen können, das derzeit auf dem Computer verwendet wird:
Wscript.Echo "Current operating system: " _
  & objElement.String
Bleiben Sie ganz ruhig. Erinnern Sie sich an Ihr Versprechen: Kein allgemeines Chaos. Ja, einfach ist das nicht. Sie sollten sich aber wirklich bemühen. Atmen Sie tief ein, das funktioniert bei uns immer, wenn wir BCD-Skripts schreiben.
Wie bereits erwähnt, ist dieser Vorgang für das reine Bestimmen des Betriebssystems ziemlich umständlich. Dazu gibt es einfachere Möglichkeiten. Aber jetzt verstehen Sie, wie ein BCD-Skript funktioniert. Sie können daher nun vieles bewerkstelligen, das Skriptentwicklern bisher vorenthalten blieb. (Bleiben Sie ruhig, ganz ruhig.) Zum Beispiel wird ein Betriebssystem auf einem Mehrfachstartcomputer immer als „Standard“ markiert. Wenn ein Computer neu startet und keine anderen Anweisungen vorliegen, wird automatisch das Standardbetriebssystem geladen. Vor Windows Vista (und dem BCD-Anbieter) gab es für einen Skriptentwickler keine Möglichkeit, das Standardbetriebssystem auf einem Computer festzulegen. Jetzt aber ist das genauso einfach, wie das Ausführen eines Skripts, wie das in Abbildung 2.
Const BcdLibraryString_Description = &h12000004
Const BootMgrId = "{9dea862c-5cdd-4e70-acc1-f32b344d4795}"
Const DefaultType = &h23000003

strComputer = "." 

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
    strComputer & "\root\wmi:BcdStore")
objStoreClass.OpenStore "", objStore

objStore.OpenObject BootMgrId, objBootMgr 

objBootMgr.GetElement DefaultType, objDefaultOSIdentifier
objStore.OpenObject objDefaultOSIdentifier.Id, objDefault

objDefault.GetElement BcdLibraryString_Description, objElement 
WScript.Echo "Default operating system: " & objElement.String
Sie haben Recht: Das verlangt nach ein bisschen allgemeinem Chaos. Aber wirklich nur ein bisschen! Dieses Skript wird hier nicht in allen Einzelheiten erläutert. Wenn Sie nicht die letzten 10 bis 12 Absätze übersprungen haben, dann müssten Sie der Logik folgen können. Sie haben vielleicht bemerkt, dass ein Zwischenschritt durchgeführt werden muss, um das Standardbetriebssystem abzurufen: Zum Öffnen einer Instanz des Startmanagerobjekts muss die OpenObject-Methode verwendet werden. Nach dem Öffnen des Startmanagers können Sie mit der DefaultType-Konstante ein Objekt abrufen, das das Standardbetriebssystem repräsentiert.
Zugegeben, das ist jetzt ziemlich aufregend: Sie können das aktuelle Betriebssystem bestimmen, und Sie können das Standardbetriebssystem bestimmen. Wissen Sie, was jetzt wirklich unglaublich wäre? Wenn eine Liste aller auf einem Computer installierten Betriebssysteme abgerufen werden könnte. Das wäre jetzt wirklich erstaunlich. Schnallen Sie sich an, und werfen Sie einen Blick auf Abbildung 3.
Wie funktioniert das alles? Zunächst werden zwei neue Konstanten definiert: WindowsImages, mit der Instanzen von allen Betriebssystemen abgerufen werden können, die BCD unterstützen (also Windows Vista und Windows Server 2008), und LegacyImages, mit der Instanzen von allen „Vorgänger“-Betriebssystemen auf dem Computer abgerufen werden können. Nach Herstellen einer Verbindung zum BCD-Speicher wird die EnumerateObjects-Methode verwendet, um alle Instanzen der BCD-fähigen Betriebssysteme abzurufen, die auf dem Computer installiert sind:
objStore.EnumerateObjects _
  WindowsImages, colObjects 
Const BcdLibraryString_Description = &h12000004
Const WindowsImages = &h10200003
Const LegacyImages = &h10300006

strComputer = "."

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
 strComputer & "\root\wmi:BcdStore")

objStoreClass.OpenStore "", objStore 

objStore.EnumerateObjects WindowsImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement BcdLibraryString_Description, objElement 
 Wscript.Echo objElement.String
Next
Wscript.Echo

objStore.EnumerateObjects LegacyImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement BcdLibraryString_Description, objElement 
 Wscript.Echo objElement.String
Next
Wenn EnumerateObjects seine Arbeit erledigt hat, richten Sie eine For-Each-Schleife ein, die alle Betriebssysteme dieser Sammlung durchläuft. Innerhalb dieser Schleife werden diese beiden Codezeilen verwendet, um erst die Beschreibung des Betriebssystems abzurufen und sie dann anzuzeigen:
objObject.GetElement _
  BcdLibraryString_Description, objElement 
Wscript.Echo objElement.String
Dann wiederholen Sie den Prozess für jedes Vorgänger-Betriebssystem, das auf dem Computer installiert wurde:
objStore.EnumerateObjects _
  LegacyImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement _
  BcdLibraryString_Description, objElement 
 Wscript.Echo objElement.String
Next
Anmerkung: Wir verstehen den damit verbundenen Nervenkitzel, aber führen Sie bitte Ihre BCD-Skripts verantwortungbewusst aus. Vermutlich kann der menschliche Körper nur eine begrenzte Anzahl an Adrenalinschüben aushalten. Aktuell, zukünftig oder vormals schwangere Frauen und Frauen, die in Wirklichkeit keine Frauen, sondern Männer sind, sollten BCD-Skripts nicht ohne Rücksprache mit ihrem Arzt ausführen.
Na gut, Sie müssen sich nicht sofort mit Ihrem Arzt besprechen. Aber die Meinung eines Arztes über das Ausführen von BCD-Skripts wäre sicherlich interessant.
Jetzt kommt etwas wirklich Verrücktes: Sie sollen versuchen, ob Sie das Standardbetriebssystem ändern können. Nehmen Sie zum Beispiel an, es liegt ein Dual-Boot-Computer vor, auf dem sowohl Windows Vista als auch Windows Server 2008 ausgeführt wird. Windows Vista soll als Standardbetriebssystem festgelegt werden. Wie können Sie vorgehen? Sehen Sie sich Abbildung 4 an. Darin wird eine Möglichkeit aufgezeigt.
Const BootMgrId = "{9dea862c-5cdd-4e70-accl-f32b344d4795}"
Const BcdLibraryString_Description = &h12000004
Const DefaultType = &h23000003
Const WindowsImages = &h10200003

strComputer = "."

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
 strComputer & "\root\wmi:BcdStore")

objStoreClass.OpenStore "", objStore 
objStore.EnumerateObjects WindowsImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement BcdLibraryString_Description, objElement 
 If Instr(objElement.String, "Vista") Then
  objStore.OpenObject BootMgrId, objBootMgr 
  objBootMgr.SetObjectElement DefaultType, objObject.ID 
 End If
Next
Mit diesem Skript öffnen Sie noch einmal den BCD-Speicher und rufen dann mit EnumerateObjects eine Sammlung aller BCD-fähigen Betriebssysteme ab, die auf dem Computer installiert sind. Danach richten Sie eine For-Each-Schleife ein, die mithilfe der folgenden (Ihnen mittlerweile vertrauten) Codezeile alle Elemente der Sammlung durchläuft, um eine Beschreibung aller Betriebssysteme zu erhalten:
objObject.GetElement _
  BcdLibraryString_Description, objElement
Sobald die Beschreibung für ein bestimmtes Betriebssystem vorliegt, ermitteln Sie mithilfe der InStr-Funktion, ob das Wort „Vista“ irgendwo in dieser Zeichenfolge enthalten ist:
If Instr(objElement.String, "Vista") Then
Sie haben Recht, das wirkt vielleicht etwas plump. Es wäre elegant, die GUID für Windows Vista zu verwenden, und dann direkt das Betriebssystem zu öffnen, ohne erst alle Betriebssysteme auf dem Computer aufzuzählen und durchlaufen zu müssen.
Leider müssten Sie dafür die GUID von Windows Vista kennen. So brauchen Sie überhaupt nichts zu wissen (für die Scripting Guys immer ein Bonus). Sie suchen lediglich so lange, bis Sie ein Betriebssystem mit dem Wort „Vista“ im Titel finden.
Anmerkung: Was ist, wenn mehrere Instanzen von Windows Vista auf dem Computer installiert sind? In dem Fall sollten Sie vielleicht nach einer Zeichenfolge wie „Vista Ultimate“ oder „Vista Enterprise“ suchen.
Wenn Sie Windows Vista gefunden haben, verwenden Sie diese beiden Codezeilen, um den Windows-Startmanager zu öffnen, und legen dann das Standardbetriebssystem auf Windows Vista fest:
objStore.OpenObject BootMgrId, objBootMgr 
objBootMgr.SetObjectElement _
  DefaultType, objObject.ID 
Das ist genug für diesen Monat. Schließlich können sogar die Scripting Guys nicht rund um die Uhr mit Nonstop-Aufregung umgehen. Keine Sorge, im nächsten Monat wird mit einer weiteren aufregenden Ausgabe von „Hey, Scripting Guy!“ aufgewartet. Mit etwas Glück haben Sie sich bis dahin erholt.
Der Scripting Perplexer von Dr. Scripto
Die monatliche Herausforderung, die nicht nur Ihr Talent zum Rätsellösen testet, sondern auch Ihre Skriptingfähigkeiten.

Juli 2008: VBScript-Quadrate
Na ja, es sind wohl eher Rechtecke als Quadrate, aber das ist nebensächlich. Lösen Sie dieses Rätsel, indem Sie jedes Quadrat zur Rechten in ein leeres Quadrat zur Linken einsetzen und so die Namen von VBScript-Funktionen erzeugen. Jedes Quadrat darf nur ein Mal verwendet werden. Hier ist ein Beispiel:
Sie lösen dieses Beispiel, indem Sie das OU-Quadrat (Rechteck) in das leere Quadrat im ersten Wort sowie MS und OX in die leeren Quadrate im zweiten Wort verschieben. Dies ergibt die VBScript-Funktionen „UBound“ und „MsgBox“, wie hier gezeigt:
Jetzt versuchen Sie es:

Show Answer

Die Scripting Guys arbeiten für Microsoft (oder sind zumindest dort angestellt). Wenn sie nicht gerade ihrem Hobby, dem Baseball (oder verschiedenen anderen Aktivitäten) nachgehen, betreiben sie das TechNet-Skriptcenter. Besuchen Sie es unter www.scriptingguys.com.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig
Page view tracker