Windows Scripting Host mit VBScript Inhaltsverzeichnis 1. WSH - Windows Script Host 5.6.......................................................................................................... 1 1.1 Einführung...................................................................................................................................... 1 1.2 Erstellung und Ausführung von Skripten ....................................................................................... 1 2. Einführung in VBScript ........................................................................................................................ 3 2.1 Variablen und Kostanten................................................................................................................ 3 2.2 Operatoren..................................................................................................................................... 5 2.2.1 Arithmetische Operatoren ....................................................................................................... 5 2.2.2 Vergleichsoperatoren .............................................................................................................. 6 2.2.3 Logische Operatoren............................................................................................................... 6 2.3 Kontrollstrukturen........................................................................................................................... 7 2.3.1 Der Strukturblock "Elementare Anweisung"............................................................................ 7 2.3.2 Sequenz .................................................................................................................................. 7 2.3.3 Verzweigung............................................................................................................................ 7 2.3.4 Fallunterscheidung .................................................................................................................. 8 2.3.5 Schleifen.................................................................................................................................. 8 2.4 Arrays (Datenfelder)..................................................................................................................... 10 2.5 Funktionen und Prozeduren ........................................................................................................ 13 2.5.1 Prozeduren............................................................................................................................ 13 2.5.2 Funktionen............................................................................................................................. 13 2.5.3 Gültigkeitsbereiche von Variablen......................................................................................... 14 2.5.4 Übersicht über die Standard-Funktionen von VBScript ........................................................ 15 3. Verwendung von Klassen und Objekten ........................................................................................... 16 4. Anwendungsbeispiele........................................................................................................................ 19 4.1 Arbeiten mit dem Dateisystem..................................................................................................... 19 4.1.1 Laufwerke anzeigen .............................................................................................................. 19 4.1.2 Verzeichnisse anlegen, verschieben, löschen ...................................................................... 20 4.1.3 Dateien anlegen, kopiern, löschen........................................................................................ 21 4.1.4 Dateien bearbeiten ................................................................................................................ 22 4.2 Arbeiten mit den Netzwerkressourcen......................................................................................... 24 4.3 Arbeiten mit der ADSI (Active Directory Services Interface) ....................................................... 26 4.3.1 Einführung ............................................................................................................................. 26 4.3.2 Organisatorische Einheiten verwalten .................................................................................. 29 4.3.3 Gruppen verwalten ................................................................................................................ 30 4.3.4 Benutzerkonten verwalten..................................................................................................... 32 Windows Script Host 1. WSH - Windows Script Host 5.6 1.1 Einführung Ein Skript (oder engl. Script) ist ein Programm, welches in einer Skriptsprache wie zum Beispiel VBScript oder JavaScript geschrieben worden ist. Skriptssprachen sind besser geeignet, um kurze Anwendungen zu entwickeln, die schnelle Lösungen für kleinere Probleme liefern. Skripte werden meistens dazu benutzt, um manuelle Aufgaben zu automatisieren. So kann man zum Beispiel mit WSH: • • • • • Dateien kopieren, verschieben oder löschen Verknüpfungen anlegen Netzwerklaufwerken verbinden und trennen Auf die Objekte des Active Directory zugreifen (etwa, um neue Benutzerkonten anzulegen) Installationsskripte erstellen Gegenüber der Stapelprogrammierung (Batchprogrammierung) ist die Programmierung von Skripten bei einfachen Aufgaben etwas aufwendiger. Doch dafür können Skripte eine ganze Menge mehr. Während VBScript eine Untermenge von Visual Basic für Applikationen (VBA), der Programmiersprache aus Visual Basic und Microsoft Office ist, handelt es sich bei JScript, um eine Sprache, die eher den Programmiersprachen Java und C++ ähnelt. Für welche Programmiersprache sich Skriptprogrammierer entscheiden ist bei Windows 2000 zweitrangig. Neben VBScript und JScript werden eine Reihe weiterer Skriptsprachen angeboten, beispielsweise Perl, Python und Rexx Der WSH besteht aus zwei Dateien. Die Datei WScript.exe stellt den Windows-basierenden Host zur Ausführung von Skripten dar. Das bedeutet, dass das Skript unter Windows ausgeführt wird. Die Datei CScript.exe hingegen erlaubt die Skriptausführung von der Eingabeaufforderung aus. 1.2 Erstellung und Ausführung von Skripten Ein Skript kann mit einem normalen Editor erstellt werden und mit der Endung .vbs (VBScript) oder .js (JavaScript) gespeichert werden. Je nachdem, ob es mit WScript.exe oder mit CScript.exe ausgeführt werden soll. Bei der WScript.exe würde ein Doppelklick im Explorer auf die Datei genügen und bei der CScript.exe müsste die Eingabeaufforderung gestartet werden, der Dateiname eingegeben und mit Enter bestätigt werden. 1. Öffnen Sie einen Windows-Editor. Zum Beispiel notepad.exe (MS Word 2000 oder ähnliche Textverarbeitungsprogramme sind ungeeignet, weil hier unter Umständen Formatierungen mit gespeichert werden) 2. Geben Sie folgenden Code ein: 3. Speichern Sie die Datei in einem Ordner auf der Festplatte mit der Dateiendung .vbs 4. Beim Doppelklick führt Windows das Skript aus Petra Treubel Seite 1 Windows Script Host Erklärung: ********* Sie sollten am Anfang Ihres Skriptes eine Übersicht einfügen, die das Skript beschreibt und die Objekte, Prozeduren, Algorithmen, Dialogfelder und andere Systemabhängigkeiten auflistet. ' weist die Zeile als Kommentarzeile aus MsgBox Zeigt eine Meldung in einem Dialogfeld an und wartet darauf, dass der Benutzer auf eine Schaltfläche klickt. Syntax: MsgBox(Eingabeaufforderung[, Schaltflächen][, Titel][, Hilfedatei, Kontext]) Soll ein Skript in eine HTML-Seite eingebunden werden, wird VBScript-Code in einer HTML-Seite zwischen paarweisen <SCRIPT>-Tags abgelegt. Eine Prozedur zur Bildung einer Summe könnte beispielsweise folgendermaßen aussehen: <HTML> <HEAD> <TITLE>Geben Sie Ihre Zahlen ein</TITLE> <SCRIPT LANGUAGE="VBScript"> <!-Function Summe() Summe = intZahl1 + intZahl2 End Function --> </SCRIPT> </HEAD> <BODY> ... SCRIPT-Blöcke können überall auf einer HTML-Seite untergebracht werden. Es ist jedoch sinnvoll, sämtlichen allgemeinen Scripting-Code im HEAD-Abschnitt unterzubringen, um den gesamten Code beisammen zu halten. Wenn Sie Ihren Code im HEAD-Abschnitt unterbringen, wird sichergestellt, dass der gesamte Code gelesen und dekodiert wird, bevor er von einem Aufruf im BODY-Abschnitt benötigt wird. Im Windows Script Host gibt es fertige Objektmodelle, mit denen die Systemumgebung beschrieben wird. Die Definitionen der Klassen und Methoden sind in einer sogenannten Klassenbibliothek enthalten. WSH ist modular aufgebaut, das heißt, die Objektmodelle sind in verschiedenen Dateien realisiert. Skript.vbs WScript (Script Host) (wscript.exe) VBScript (Sprachengine) (vbscript.dll) Skript.vbs (Scripting.FileSystem Object) (scrrun.dll) Abb. 1: Drei wichtige Stützpfeiler von WSH Petra Treubel Seite 2 Windows Script Host 2. Einführung in VBScript 2.1 Variablen und Kostanten Eine Variable ist ein Platzhalter, der auf eine Stelle im Arbeitsspeicher des Computers verweist, an der Daten, die sich während der Ausführung des Skriptes möglicherweise ändern, gespeichert werden können. Dabei ist vollkommen unwichtig, wo eine Variable im Arbeitsspeicher abgelegt wird. Eine Variable wird durch die Anweisung Dim variable vereinbart. Wichtig ist dabei, dass eine Variable einen bestimmten Typ besitzt, den sogenannten Datentyp. Abweichend von Visual Basic oder VBA kennt VBScript nur den Datentyp Variant. Dies ist ein spezieller Datentyp, der verschiedene Formen von Informationen aufnehmen kann. Wird dieser Variablen jetzt ein Wert zugewiesen, erkennt der VBScript-Interpreter einen bestimmten Subtyp. Dieser kann dann numerisch oder vom Typ Zeichenkette sein. Die folgende Tabelle zeigt die verschiedenen Untertypen von Daten, die ein Variant enthalten kann. Subtyp Beschreibung Empty Variant ist nicht initialisiert. Der Wert ist 0 bei numerischen Variablen und eine Nullzeichenfolge ("") bei Zeichenfolgenvariablen. Null Variant enthält absichtlich keine gültigen Daten. Boolean Enthält entweder True oder False. Byte Enthält eine Ganzzahl von 0 bis 255. Integer Enthält eine Ganzzahl von -32.768 bis 32.767. Currency -922.337.203.685.477,5808 bis 922.337.203.685.477,5807. Long Enthält eine Ganzzahl von -2.147.483.648 bis 2.147.483.647. Single Enthält eine Fließkommazahl einfacher Genauigkeit von -3,402823E38 bis -1,401298E-45 für negative Werte und von 1,401298E-45 bis 3,402823E38 für positive Werte. Double Enthält eine Fließkommazahl doppelter Genauigkeit von 1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte und von 4,94065645841247E-324 bis 1.79769313486232E308 für positive Werte. Date (Time) Enthält eine Zahl, die ein Datum vom 1. Januar 100 bis zum 31. Dezember 9999 darstellt. String Enthält eine Zeichenfolge variabler Länge, die bis zu etwa 2 Milliarden Zeichen lang sein kann. Object Enthält ein Objekt. Error Enthält eine Fehlernummer. Petra Treubel Seite 3 Windows Script Host Um ein Programm besser lesbar zu gestalten sollten die Variablennamen immer durch entsprechende Präfixe gekennzeichnet sein. Untertyp Präfix Beispiel Boolean bln blnGefunden Byte byt bytRasterDaten Date (Time) dtm dtmStart Double dbl dblToleranz Error err errBestellNr Integer int intAnzahl Long lng lngEntfernung Object obj objAktuell Single sng sngDurchschnitt String str strVorname Berücksichtigen Sie bei der Benennung von Variablen folgende Punkte: • Die Deklaration jeder wichtigen Variablen sollte einen Kommentar im Code enthalten, der die Verwendung der deklarierten Variablen beschreibt. • Variablen, Konstanten und Funktionen/Prozeduren sollten so klar benannt werden, dass Kommentare im Code nur noch für komplexe Implementierungsdetails nötig sind. Sie können eine Variable auch indirekt deklarieren, indem Sie einfach ihren Namen an einer beliebigen Stelle in Ihrem Skript verwenden. Dies gilt allgemein als schlechter Programmierstil, weil Sie den Variablennamen an der einen oder anderen Stelle falsch eingeben könnten, was bei der Ausführung des Skriptes zu unerwarteten Ergebnissen führt. Aus diesem Grund gibt es die Option Explicit-Anweisung, mit der Sie die explizite Deklaration aller Variablen erzwingen können. Die Option Explicit -Anweisung sollte die erste Anweisung innerhalb Ihres Skriptes sein. Konstanten können während der Laufzeit des Programms ihren Wert nicht verändern. Es gibt sogenannte integrierte Konstanten, die von der Anwendung zur Verfügung gestellt werden. Petra Treubel Seite 4 Windows Script Host Integrierte Konstanten: Datums- und Uhrzeitkonstanten Farbkonstanten VBScript-Konstanten Zeichenfolgenkonstanten Datumsformat-Konstanten MsgBox-Konstanten VarType-Konstanten Vergleichskonstanten In VBScript können Sie benutzerdefinierte Konstanten mit der Const-Anweisung definieren. Die ConstAnweisung ermöglicht das Definieren von Zeichenfolgenkonstanten oder numerischen Konstanten mit aussagekräftigen Namen und das Zuweisen von Literalwerten. (siehe unten: Datumsliteral) Beispiel: Const conEndDatum = #12-31-99# Konstantennamen können mit einem Präfix "vb" oder "con" versehen. 2.2 Operatoren 2.2.1 Arithmetische Operatoren Zu diesen numerischen Datentypen gehören die folgenden Operatoren: ^ * / \ Mod + - Potenzierung Multiplikation Division ganzzahlige Division Modulo-Operator (Rest bei ganzzahliger Division) Addition, (auch positives Vorzeichen) Subtraktion, (auch negatives Vorzeichen) Beispiel: 24 / 4 * 3 liefert 18 Für alphanumerische Daten steht folgender Operator zur Verfügung: & Die Zeichenketten werden aneinander gehängt. Beispiel: " Guten " & " Tag" liefert "Guten Tag" Bei der Auswertung von Ausdrücken gilt die übliche Regel "Punktrechnung vor Strichrechnung". Ferner können in üblicher Weise runde Klammern eingesetzt werden. Genauer gilt folgende Reihenfolge der Prioritäten: ( ) vor ^ vor Vorzeichen vor * / \ Mod vor - + Bei gleicher Priorität wird von links nach rechts ausgewertet. Beispiel: 3+4*5 (3 + 4) * 5 Petra Treubel liefert 23 liefert 35 Seite 5 Windows Script Host 2.2.2 Vergleichsoperatoren Aussagen und Aussageformen können in Visual Basic mit Hilfe der Vergleichsoperatoren formuliert werden. Die Vergleichsoperatoren können auf alle Datentypen angewendet werden; dabei können Werte aller numerischen Datentypen untereinander verglichen werden. Bei Zeichenketten wird von links beginnend Zeichenweise der Code der Zeichen verglichen. Es gibt die folgenden Operatoren: = Gleichheit <> Ungleichheit < Kleiner > Größer <= Kleiner oder Gleich >= Größer oder Gleich Wenn Variablen oder Ausdrücke als Operanden vorkommen, wird zunächst ihr Wert bestimmt und dann der Vergleich ausgeführt. Priorität: =, <>, <, >, <=, >= 2.2.3 Logische Operatoren VBScript stellt auch logische Operatoren zur Verfügung. Mit Hilfe der logischen Operatoren lassen sich zwei oder mehr Bedingungen miteinander verknüpfen. Es gibt die folgenden Operatoren: Not Negation, der Wahrheitswert wird negiert (aus wahr wird falsch und aus falsch wahr) And und, beide Bedingungen müssen wahr sein, damit der gesamte Ausdruck wahr ist Or oder, mindestens eine Bedingung muss wahr sein, damit der gesamte Ausdruck wahr ist Xor exklusives oder, nur eine Bedingung darf wahr sein, damit der gesamte Ausdruck wahr ist Priorität: Not, And, Or, Xor Petra Treubel Seite 6 Windows Script Host 2.3 Kontrollstrukturen 2.3.1 Der Strukturblock "Elementare Anweisung" Der Strukturblock "elementare Anweisung" wird als ein einfaches Rechteck dargestellt, in das die auszuführende Anweisung eingetragen ist. anweisung anweisung Beispiel: dim intZahl1, intZahl2 intZahl1 = intZahl2 * 7 2.3.2 Sequenz Eine Sequenz von Anweisungen wird durch Zusammensetzen von Strukturblöcken dargestellt. Die Aneinanderreihung wird nach folgender Regel vorgenommen: anweisung1 anweisung2 anweisung1 anweisung2 Beispiel: dim intErgebnis, intZahl intErgebnis = intZahl * 7 MsgBox intErgebnis 2.3.3 Verzweigung Eine Verzweigung wird benutzt, um aufgrund eines Vergleichs entweder anweisung1 und anweisung2 auszuführen oder anweisung3. If bedingung Then anweisung1 anweisung2 Else anweisung3 End If bedingung? T anweisung1 anweisung2 F anweisung3 Beispiel: dim intZahl, intErg, intDivi If intZahl > 0 Or intZahl < 0 Then intErg = intDivi / intZahl Else MsgBox "Fehler: Division durch Null!!!" End If Petra Treubel Seite 7 Windows Script Host 2.3.4 Fallunterscheidung Mit einer Fallunterscheidung kann zum Beispiel eine Variable auf mehrere Werte überprüft werden. In Abhängigkeit von dem Wert, den die Variable wirklich hat, wird die entsprechende Anweisung ausgeführt. Select Case ausdruck Case wert1 anweisung1 anweisung2 Case wert2 anweisung3 anweisung4 wert1 anweisung1 anweisung2 ausdruck wert2 anweisung3 anweisung4 Case Else anweisung5 anweisung6 sonst anweisung5 anweisung6 End Select Beispiel: dim strZeichen Select Case strZeichen Case "+" MsgBox "Das Zeichen ist ein Plus" Case "-" MsgBox "Das Zeichen ist ein Minus" Case Else MsgBox "Das Zeichen ist kein Plus oder Minus!" End Select 2.3.5 Schleifen Schleifen werden dazu benutzt, um gleiche Anweisungen mehr als einmal auszuführen. Es ist dabei wichtig, dass es ein definiertes Ende der Durchläufe gibt. Dies könnte zum Beispiel eine festgelegte Anzahl an Durchläufen oder ein Dateiende sein. Petra Treubel Seite 8 Windows Script Host abweisende Schleife (auch kopfgesteuerte Schleife) Do While bedingung anweisung1 anweisung2 Loop solange Bedingung anweisung1 anweisung2 Beispiel: dim intZahl intZahl = 0 Do while intZahl < 11 intZahl = intZahl + 1 Loop "Zähl"-Schleife Verwendet einen Zähler, der angibt, wie häufig Anweisungen ausgeführt werden. For Zähler = Start To Ende [Step Schritt] anweisung1 anweisung2 Next Beispiel: dim intIndex, intAnzahl For intIndex = 0 To 10 Step 1 intAnzahl = intAnzahl + 1 Next nicht abweisende Schleife (auch fußgesteuerte Schleife) Do anweisung1 anweisung2 Loop While bedingung anweisung1 anweisung2 solange Bedingung Beispiel: dim intZahl intZahl = -1 Do intZahl = intZahl + 1 Loop while intZahl <= 11 Petra Treubel Seite 9 Windows Script Host 2.4 Arrays (Datenfelder) In manchen Situationen werden mehrere Variablen benötigt, die alle mit demselben Programmabschnitten bearbeitet werden sollen. Zum Beispiel sollen in einem Programm die stündlichen Messwerte für die nominale Geschwindigkeit im LAN verarbeitet werden. Hier wäre z. B. eine Prozedur für die Eingabe ausreichend, die nacheinander für alle Variablen verwendet werden kann. Wir gehen von folgenden Werten aus: Index 0 1 2 3 4 5 6 7 8 Uhrzeit 8:00 9:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 Messwert 58 45 48 48 46 55 74 85 63 Eine für diesen Zweck geeignete Datenstrukturen wird durch ein Array bereit gestellt. Ein Array kann man als eine Liste von Variablen betrachten, die als Ganzes mit einem Namen (z. B. Messwert) bezeichnet wird. Die Variablen dieser Liste werden durchnumeriert (z. B. von 0 bis 8) und durch den Namen der Liste zusammen mit ihrer jeweiligen Nummer angesprochen. Diese Zahl bezeichnet man als Index; der Index wird in runden Klammern hinter den Arraynamen geschrieben. Beispiele: Messwert(0), Messwert(4) Zu unterscheiden ist zwischen dem Wert des Index und dem Wert des Arrayelements an der entsprechenden Stelle. Beispiel: Im Ausdruck Messwert(4) ist 4 der Wert des Index, dagegen ist 46 der Wert des zugehörigen Arrayelementes. Ein Index braucht nicht immer ein konstanter Wert zu sein, man kann auch eine Variable oder einen anderen Ausdruck als Index einsetzen. Dann wird zunächst der Wert dieses Ausdrucks bestimmt und dann das entsprechende Element im Array aufgesucht. Beispiel: Betrachtet werde eine ganzzahlige Variable M Wenn M den Wert 5 hat, bedeutet der Ausdruck Messwert(M) die sechste Variable im Array. (Im Beispiel hat dieser Ausdruck den Wert 55.) Wenn M den Wert 1 hat, bedeutet der Ausdruck Messwert(M) die zweite Variable im Array. (Im Beispiel hat dieser Ausdruck den Wert 45.) Wenn M den Wert 4 hat, bedeutet der Ausdruck Messwert(2*M - 1) den Wert der achten Variablen im Array. (Im Beispiel hat dieser Ausdruck den Wert 85.) Wenn M den Wert 15 hat, ist der Ausdruck Messwert(M) fehlerhaft, denn es gibt nur die Elemente Messwert(0), Messwert(1), ..., Messwert(8) im Array. Petra Treubel Seite 10 Windows Script Host Zur Deklaration wird die DIM-Anweisung verwendet. Wir benutzen folgende Form: Dim Arrayname(maxIndex) • • Arrayname ist der Name des Arrays. maxIndex ist ein konstanter, ganzzahliger Wert, der den höchsten verwendeten Index beschreibt. Da in VBScript der kleinste Index 0 darstellt, wird mit dieser Deklaration Speicherplatz für ein Array mit 9 Elementen reserviert. Beispiel: Dim intIndex Dim arrMesswert(8) ' Eingabe der neun Messwerte For intIndex = 0 To 8 arrMesswert(IntIndex) = InputBox("Bitte Messwert: ") Next Sie können auch Arrays deklarieren, deren Größe sich während des Ablaufs Ihres Skriptes ändern kann. Solche Arrays werden als dynamische Arrays bezeichnet. Das Array wird anfänglich mit einer Dim-Anweisung oder mit einer ReDim-Anweisung deklariert. Der Unterschied besteht darin, dass zwischen den Klammern keine Größe oder Anzahl von Dimensionen angegeben wird. Beispiel: Dim Messwert() oder ReDim Messwert() Um ein dynamisches Datenfeld verwenden zu können, müssen Sie anschließend die Zahl der Dimensionen und deren Größen mit ReDim bestimmen. Beispiel: ReDim Messwert(20) oder Dim intIndex intIndex = 20 ReDim Messwert(intIndex) Petra Treubel Seite 11 Windows Script Host Arrays oder Datenfelder sind nicht auf eine einzige Dimension beschränkt. Sie können mehrdimensionale Arrays mit bis zu 60 Dimensionen angeben. Allerdings ist es meist nicht sinnvoll mehr als eine zweidimensionale Tabelle zu verwenden. Hier würde die erste Zahl die Zeile und die zweite die Spalte bezeichnen. Beispiel: Dim intIndex1, intIndex2 Dim strText Dim arrTab(2,3) 'Tabelle mit 3 Zeilen, 4 Spalten strText = "" For intIndex1 = 0 To 2 For intIndex2 = 0 To 3 arrTab(IntIndex1, intIndex2) = InputBox("Bitte Zahl: ") Next Next 'Ausgabe: For intIndex1 = 0 To 2 For intIndex2 = 0 To 3 strText = strText & arrTab(IntIndex1, intIndex2)& vbTab Next strText = strText & vbCrLf Next MsgBox strText, , "Tabelle" Petra Treubel Seite 12 Windows Script Host 2.5 Funktionen und Prozeduren 2.5.1 Prozeduren Eine Prozedur ist eine Folge von VBScript-Anweisungen, die zwischen den Anweisungen Sub und End Sub eingeschlossen sind und Aktionen ausführen, aber keine Werte zurückgeben. Eine Prozedur kann Argumente (Konstanten, Variablen oder Ausdrücke, die von einer aufrufenden Prozedur übergeben wurden) übernehmen. Wenn eine Prozedur keine Argumente hat, muss die SubAnweisung ein leeres Klammernpaar () enthalten. Die Übergabe eines Datenelements an Prozeduren erfolgt über ein Argument. Argumente dienen als Platzhalter für die an die Prozedur zu übergebenden Daten. Als Bezeichner für Argumente kann jeder als Variablennamen gültiger Bezeichner verwendet werden. Alle Argumente werden zwischen den Klammern angegeben und durch Kommas getrennt. Beispiel: Sub Summe(zahl1, zahl2) MsgBox "Die Summe ist " & (zahl1 + zahl2) End Sub ' Aufruf von Prozeduren: Summe intNum1, intNum2 ' oder Call Summe(34, intNum2) 2.5.2 Funktionen Eine Funktion ist eine Folge von VBScript-Anweisungen, die zwischen den Anweisungen Function und End Function eingeschlossen sind. Eine Funktion ist einer Prozedur ähnlich, kann aber einen Wert zurückgeben. Eine Funktion gibt Werte zurück, indem ihrem Namen in einer oder mehreren Anweisung(en) der Funktion ein Wert zugewiesen wird. Der Typ des Rückgabewertes einer Funktion ist immer ein Variant. Beispiel: Function Celsius(GradF) Celsius = (GradF - 32) * 5 / 9 End Function ' Aufruf von Funktionen: sngCelsius = Celsius(sngGradFahren) ' oder MsgBox "In Celsius wären das " & Celsius(74.74) Petra Treubel Seite 13 Windows Script Host 2.5.3 Gültigkeitsbereiche von Variablen Je nachdem, wo eine Variable deklariert wird, ändert sich der Gütigkeitsbereich der Variablen. Der Gültigkeitsbereich ist der Teil im Programm, in dem eine Variable bekannt ist und benutzt werden kann. Gibt es eine Fehlermeldung, weil die Variable angeblich nicht vereinbart worden ist, könnte man die Variable mit dem gleichen Namen noch mal deklarieren, aber es wäre dann eine neue. Option Explicit Ausgabe 9, 3 Sub Ausgabe(intParam1, intParma2) MsgBox "Das Ergebnis ist " & CStr(Divi(intParam1, intParma2)) End Sub Function Divi( intNenner, intZaehler ) If intNenner <> 0 then Divi = intZaehler / intNenner Else Divi = 0 End If End Function Die Variablen mit dem Namen intNenner und intZaehler sind lokale Variablen. Das bedeutet, dass sie nur innerhalb der Funktion Divi benutzt werden können. In einer anderen Funktion oder Prozedur, die im gleichen Skript angelegt worden ist, sind diese Variablen unbekannt. Falls man eine Variablen in mehreren Funktionen oder Prozeduren in einem Skript verwenden möchte, muss sie im allgemeinen Teil des Skripts angelegt werden. In diesem Fall handelt es sich um eine globale Variable. Beispiel: Dim dblGlobalzahl dblGlobalzahl = 0 Divi 9, 3 Ausgabe Sub Divi( intNenner, intZaehler) ... dblGlobalzahl = intZaehler / intNenner ... End Sub Sub Ausgabe( ) MsgBox "Das Ergebnis ist " End Sub Petra Treubel & dblGlobalzahl Seite 14 Windows Script Host 2.5.4 Übersicht über die Standard-Funktionen von VBScript In VBScript stehen uns eine Reihe von Standard-Funktionen zur Verfügung. Verschaffen Sie sich mit der Hilfe einen Überblick. Abs Array CBool CByte CDbl Chr Conversions Cos Date DateAdd DateSerial DateValue Eval Exp FormatDateTime FormatNumber GetObject GetRef InputBox InStr IsArray IsDate IsNumeric IsObject LCase Left Log LTrim; RTrim; and Trims Minute Month Now Oct Right Rnd ScriptEngineBuildVersion ScriptEngineMajorVersion SetLocale Sgn Split Sqr Tan Time TimeValue TypeName VarType Weekday Petra Treubel Asc CCur CInt CreateObject DateDiff Day Filter FormatPercent Hex InStrRev IsEmpty Join Len Maths MonthName Replace Round ScriptEngineMinorVersion Sin StrComp Timer UBound WeekdayName Atn CDate CLng CSng DatePart Derived Maths FormatCurrency GetLocale Hour Int, Fixs IsNull LBound LoadPicture Mid MsgBox RGB ScriptEngine Second Space String TimeSerial UCase Year Seite 15 Windows Script Host 3. Verwendung von Klassen und Objekten Um die Erstellung und Verwendung von Klassen und Objekten in VBSrcipt deutlich zu machen, soll die unten angegebene Klasse Mitarbeiter dienen. Im Hauptprogramm auf der nächsten Seite wird ein Objekt m der Klasse Mitarbeiter angelegt. class Mitarbeiter public strName public intTelefon private intUrlaub ' Name des Mitarbeiters / der Mitarbeiterin ' dienstliche Telefonnummer ' restliche Urlaubstage public sub init (strN, intT, intU) strName = strN intTelefon = intT intUrlaub = intU end sub public sub aendertName (strNeuerName) strName = strNeuerName end sub public sub NeueTelNr (intNeuNr) intTelefon = intNeuNr end sub public function nimmtUrlaub (intTage) dim intUrlaubstage if intUrlaub < intTage then intUrlaubstage = 0 ' falls nicht mehr genügend ' Urlaubsanspruch besteht ' keinen Urlaubstage geben else intUrlaub = intUrlaub - intTage intUrlaubstage = intTage end if nimmtUrlaub = intUrlaubstage end function ' sonst bearbeiten public function info() info = strName & ", Tel: " & intTelefon &_ ", " & intUrlaub & " Tage Urlaub" end function end class Da die Eigenschaft intUrlaub geschützt ist und in der Methode nimmtUrlaub geprüft wird, ob die Zahl der Urlaubstage negativ wird, kann nach der Initialisierung keine negative Zahl von Urlaubstagen im Objekt stehen. Ein Objekt einer selbstdefinierten Klasse wird in VBS mit dem Befehl new erzeugt. Zuvor muss aber eine Variable deklariert worden sein, die einen Verweis auf dieses Objekt speichern kann. Petra Treubel Seite 16 Windows Script Host Zur Veranschaulichung dient das folgende einfache Programm zur Benutzung dieser Klasse ' Hauptprogramm dim m ' Objekt der Klasse Mitarbeiter set m = new Mitarbeiter ' Erzeugen des Objekts m.init "Hansen", 2298, 20 msgbox m.info() m.strName = "Meier" msgbox m.info() m.nimmtUrlaub(5) m.intUrlaub = 30 msgbox m.info() ' Belegen des Objekts mit Werten ' unerwünscht, geht aber wegen public ' geht nicht wegen private Wie schon in Abbildung 1 auf Seite 2 angegeben gibt es in WSH fertige Klassen, die wir benutzen können. Als Beispiel betrachten wir einen kleinen Ausschnitt der Klassenbeschreibungen des File System Objects, welcher zur Darstellung des Inhalts eines Verzeichnissses verwendet werden. Folder Files count Name files subfolders ... Subfolders File Name ... Copy ... count Copy ... Die Klasse Folder enthält u. a. als Attribut den Namen des Ordners und zwei Auflistungen für die enthaltenen Dateien (files) sowie die enthaltenen Unterverzeichnisse (subfolders). Ferner enthält die Klasse z. B. eine Methode Copy zum Kopieren des Verzeichnisses. Die Auflistung Files enthält Objekte der Klasse File; die als Attribute u. a. den Namen der Datei und als Methode z. B. eine Methode zum Kopieren der Datei haben. Ferner enthält sie ein Attribut count, das die Anzahl der in der Auflistung enthaltenen Dateien angibt. Die Klasse hat keine Methoden. Die Auflistung Subfolders enthält wieder Objekte der Klasse Folder. Ferner enthält sie ein Attribut count, das die Anzahl der in der Auflistung enthaltenen Unterverzeichnisse angibt. Die Klasse hat keine Methoden. Petra Treubel Seite 17 Windows Script Host Der Umgang mit diesen Klassen erfolgt im Prinzip genauso wie in den obigen Beispielen. Um die Verarbeitung der Objekte zu vereinfachen, gibt es aber in VBS zusätzliche Befehle. Zum Erzeugen von Objekten von Klassen aus der Klassenbibliothek wird der Befehl createObject anstelle von new verwendet. Einige Auflistungen sind nicht mit einem Array realisiert und bieten keine Möglichkeit, mit einer for ... next-Schleife auf die Objekte der Auflistung zuzugreifen. Zum Ansprechen aller Elemente einer Collection gibt es eine andere Variante der for-Schleife: die for each ... in ... – Schleife, einer Variante der for-Schleife. Nach in wird eine Auflistung angegeben; nach each folgt eine Variable, die nacheinander alle Objekte der Auflistung als Werte annimmt. Der Zugriff auf ein Verzeichnis erfolgt in diesem Beispiel durch Verwendung eines Objekts der Klasse FileSystemObject; diese Klasse hat eine Methode GetFolder, die nach Angabe eines Verzeichnisnamens das Objekt liefert, das dieses Verzeichnis repräsentiert. Beispiel: Anzeigen des Inhalts eines Verzeichnisses dim dim Dim dim dim dim FSO oFolder osubfolder oFile strName strErgebnis ' ' ' ' ' ' as as as as as as ScriptingFileSystemObject - Objekt ScriptingFolder ScriptingFolder ScriptingFile string string set FSO = createObject("Scripting.FileSystemObject") strName = inputbox ("Verzeichnisname: ") if strName <> "" then set ofolder = FSO.getFolder(strName) strErgebnis = "Dateien" & vbcrlf for each ofile in oFolder.Files strErgebnis = strErgebnis & ofile.Name & vbcrlf next StrErgebnis = strErgebnis & vbcrfl & " Unterverzeichnisse" & vbcrlf for each osubfolder in ofolder.subfolders strErgebnis = strErgebnis & osubfolder.name & vbcrlf next msgbox strErgebnis end if Petra Treubel Seite 18 Windows Script Host 4. Anwendungsbeispiele 4.1 Arbeiten mit dem Dateisystem 4.1.1 Laufwerke anzeigen Unter Windows werden Verzeichnisse (Ordner) unterhalb von Laufwerken angelegt. Mit Hilfe der in der Klasse FileSystemObject implementierten Klasse Drive können Sie sich Informationen zu den verschiedenen in das System eingebundenen physischen oder Netzlaufwerken anzeigen lassen. Es gibt eine Drives-Auflistung, mit der wir uns alle auf dem lokalen Rechner verfügbaren Laufwerke anzeigen lassen können. Die Eigenschaft Objekt.DriveLetter eines Objekts Drive zeigt den Laufwerksbuchstaben an. Dim Dim Dim Dim fso oLaufwerke oLW strText strText = "" Set fso = CreateObject("Scripting.FileSystemObject") Set oLaufwerke = fso.Drives For Each oLW in oLaufwerke strText = strText & oLW.DriveLetter & vbCrLf Next MsgBox strText Die variable oLW enthält nacheinander alle vorhandenen Objekte (hier: die vorhandenen Laufwerke) der Drives-Auflistung. Sie könnten dann mttels der Variablen oLW auf alle Eigenscheiften des DriveObjekts zugreifen und zum Beispiel den Type des Laufwerks (Objekt.DriveType), den zugeordneten Laufwerknamen (Objekt.VolumeName) oder die Größe des Laufwerks (Objekt.TotalSize) anzeigen. (siehe Beispiel: Laufwerke.vbs) Petra Treubel Seite 19 Windows Script Host 4.1.2 Verzeichnisse anlegen, verschieben, löschen Wie schon unter Punkt 3.3 beschrieben können wir mit Hilfe der FileSystemObject-Klasse auch auf die Verzeichnisse und Unterverzeichnisse des lokalen Rechners zugreifen. a.) Ordner anlegen Mit der Methode Objekt.CreateFolder des FileSystemObjects kann ein neuer Ordner angelegt werden. Um sicher zu gehen, dass es nicht zu einem Laufzeitfehler kommt, sollte man zuerst prüfen, ob der neue Ordner vielleicht schon existiert. Set fso = CreateObject("Scripting.FileSystemObject") If not fso.FolderExists("C:\Neuer Ordner") Then Set oOrdner = fso.CreateFolder("C:\Neuer Ordner") . . . b.) Ordner verschieben Bei der Methode Objekt.MoveFolder des FileSystemObjects muss als Parameter zuerst die Quelle des zu verschiebenden Ordners und dann das Ziel, wohin der Ordner verschoben werden soll, angegeben werden. Setzen Sie bei der Angabe des Zielpfads unbedingt aam Ende des Pfades den Backslash! ("c:\windows\desktop \ ") Set fso = CreateObject("Scripting.FileSystemObject") fso.MoveFolder "c:\Neuer Ordner", "c:\windows\desktop\" Alternativ könnte man auch die Methode Objekt.Move verwenden. Dies ist eine Methode der File- und Folder-Klasse. Set fso = CreateObject("Scripting.FileSystemObject") Set oOrdner = fso.GetFolder("C:\Neuer Ordner") oOrdner.Move "c:\windows\desktop\" c.) Ordner löschen Natürlich kann ein vorhandener Ordner auch wieder gelöscht werden. Set fso = CreateObject("Scripting.FileSystemObject") fso.DeleteFolder("c:\windows\desktop\Neuer Ordner") Alternativ könnten Sie auch hier wieder die Methode Objekt.Delete verwenden. Falls Sie das Verzeichnis mit Objekt.Move vorher verschoben haben, können Sie trotzdem noch auf die Objektvariable oOrdner zugreifen, um das Verzeichnis zu löschen. Set fso = CreateObject("Scripting.FileSystemObject") Set oOrdner = fso.GetFolder("C:\Neuer Ordner") oOrdner.Delete Bitte beachten Sie, dass Verzeichnisse, die Sie mit VBScript löschen, nicht im Papierkorb erscheinen. Petra Treubel Seite 20 Windows Script Host 4.1.3 Dateien anlegen, kopiern, löschen Mit der in Punkt 3.3 erwähnte Klasse File können Sie Dateien erstellen, kopieren, verschieben oder löschen. Die Dateiattribute (schreibgeschützt, versteckt...) können abgefragt oder gesetzt werden. a.) Dateien anlegen Mit der Methode Objekt.CreateTextFile der Klasse File kann eine Textdatei angelegt werden. Falls der Parameter True mit angegeben wird oder ohne Angabe eines zweiten Parameters, würde eine vorhandene Datei überschrieben werden. Mit false wird die Datei nicht überschrieben und es käme zu einem Laufzeitfehler. Set fso = CreateObject("Scripting.FileSystemObject") Set oDatei = fso.CreateTextFile("c:\testdatei.txt", True) If Not fso.FileExists(dateiAngabe) Then Set oDatei = fso.CreateTextFile("c:\testdatei.txt", false) . . . b.) Dateien kopieren Es kann eine Datei oder mehrere Dateien gleichzeitig kopiert werden. Bei der Dateiangabe dürfen auch Platzhalter oder Wildcards (*, ?) gesetzt werden. Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile "c:\Eigene Dateien\Briefe\*.doc", "c:\temp\" Alternativ kann hier auch wieder die Methode Objekt.Copy, die wir schon von der Klasse Folder kennen benutzt werden. Achten Sie darauf, dass voher mit der Methode Objekt.GetFile ein Objekt der Datei erzeugt worden ist. Set oDatei = fso.GetFile("c:\testdatei.txt") oDatei.Copy ("c:\windows\desktop\") c.) Dateien löschen Es kann eine Datei oder mehrere Dateien gleichzeitig gelöscht werden. Bei der Dateiangabe dürfen auch Platzhalter oder Wildcards (*, ?) gesetzt werden. Falls der Parameter true zusätzlich angegeben wird, werden auch Dateien mit gesetztem Schreibschutz-Attribut gelöscht. Set fso = CreateObject("Scripting.FileSystemObject") fso.DeleteFile "c:\Eigene Dateien\Briefe\*.doc", True Auch hier kann wieder die Methode Objekt.Delete verwendet werden. Dabei wäre dann kein Parameter oder true bzw. false zu übergeben. Set oDatei = fso.GetFile("c:\testdatei.txt") oDatei.Delete(true) Petra Treubel Seite 21 Windows Script Host 4.1.4 Dateien bearbeiten Das FileSystemObject stellt uns bisher nur die Möglichkeit zur Verfügung Textdateien zu bearbeiten. dabei werden Unicode- und ASCII-Dateien unterschieden. Unter Punkt 4.1.3 a.) Dateien anlegen wurde schon gezeigt, wie ein Datei erstellt werden kann. Nachdem diese Datei im angegebenen Verzeichnis erstellte wurde, enthält die Variable oDatei ein Objekt der Klasse Textstream. Set oDatei = fso.CreateTextFile("c:\testdatei.txt", True) Unter einem Textstream kann man sich einen Strom von Zeichen vorstellen, der entweder Zeichen für Zeichen, zeilenweise oder alles aufeinmal in die Datei oder aus der Datei "herausströmt". Unter Herausströmen wird das Lesen bzw. Schreiben gemeint. Man muss dabei immer die Reihenfolge beachten: 1. Öffnen der Datei zum Lesen, Schreiben oder Anhängen 2. Lesen, Schreiben oder Anhängen zeichenweise, zeilenweise oder des gesamten Inhalts 3. Schließen der Datei a.) Öffnen von Dateien Wenn eine Datei bearbeitet werden soll, muss sie zuerst geöffnet werden. Gleichzeitig erhält man dadurch einen Zugriff auf ein Objekt der Klasse Textstream. Beim Öffnen einer Datei sollte man auch gleich angeben, ob aus der Datei nur gelesen werden soll, ob ein neuer Inhalt in die Datei geschrieben werden soll oder ob an den vorhandenen Inhalt etwas Neues anghängt werden soll. Dies wird auch als Eingabe-/Ausgabe-Modus bezeichnet. Um die Programme leichter lesbar zu machen, sollte man statt der Zahlenwerte selbstdefinierte Konstanten verwenden. Standardmäßig wird die Datei zum Lesen geöffnet. Konstante ForReading ForWriting Wert Beschreibung 1 Öffnet eine Datei nur zum Lesen. Schreibzugriffe sind nicht möglich. 2 Öffnet eine Datei zum Schreiben. Existiert eine Datei mit demselben Namen, wird der vorherige Inhalt überschrieben. ForAppending 8 Öffnet eine Datei und schreibt an das Dateiende. Set fso = CreateObject("Scripting.FileSystemObject") Set oDatei = fso.OpenTextFile("c:\test.txt", ForWriting, true) Auch hier könnte mit dem dritten Parameter angegeben werden. ob die Datei erstellt werden soll, wenn sie noch nicht vorhanden ist (true) oder ob nicht (false). Wird der Parameter weg gelassen und die Datei ist nicht vorhanden, wird ein Laufzeitfehler angezeigt und die Datei nicht angelegt. Im letzten Parameter kann angegeben werden, ob die Datei im ASCII- oder Unicode-Format geöffnet werden soll. Default ist als ASCII-Datei. Petra Treubel Seite 22 Windows Script Host b.) Schreiben in Dateien Zuerst muss die Datei geöffnet werden. Beim Öffnen muss entschieden werden, ob der vorhandene Inhalt der Datei gelöscht werden soll oder ob hier der neue nur angehängt werden soll. (E/A-Modus: ForWriting oder ForAppending) In diese Datei kann entweder ohne oder mit Zeilenumbruchzeichen (Carriage Return + Line Feed) geschrieben werden. dafür werden die Methoden Object.Write (Ohne nachstehendes Zeilenumbruchzeichen) bzw. Object.WriteLine (mit nachstehendem Zeilenumbruchzeichen) benutzt. Set fso = CreateObject("Scripting.FileSystemObject") Set oDatei = fso.OpenTextFile("c:\test.txt", ForWriting) 'Eine Zeile mit Zeilenumbruchzeichen schreiben. oDatei.WriteLine("Dies ist die erste Zeile.") 'Drei Leerzeilen, bzw. Zeilenumbruchzeichen in die Datei schreiben. oDatei.WriteBlankLines(3) 'Eine Zeile schreiben. oDatei.Write ("Zweite Zeile") c.) Lesen aus Dateien Falls aus einer Datei gelesen werden soll, muss man sich zwischen dem Lesen • eines oder mehrere Zeichen mit der Methode Object.Read(AnzahlZeichen), • einer Zeile mit der Methode Object.ReadLine oder • einer ganzen Datei mit der Methode Object.ReadAll entscheiden. Set oDatei = fso.OpenTextFile("c:\test.txt", ForReading) ' genau fünf Zeichen: strWort = oDatei.Read(5) 'bis zum nächsten Zeilenumbruchzeichen, aber ohne das: strZeile = oDatei.ReadLine 'der gesamte Inhalt: strText = oDatei.ReadAll Eine Methode, um eine größere Textdatei auszulesen, von der nicht bekannt ist, wieviele Zeilen sie enthält, ist eine Schleife. Dabei wird die Eigenschaft Object.AtEndOfStream als Bedingung benutzt. Diese Eigenschft wird wahr, wenn das Ende der Datei erreicht ist. Do While oDatei.AtEndOfStream <> True strText = strText & oDatei.ReadLine & vbCrLf Loop MsgBox strText d.) Schließen von Dateien Nachdem eine Datei bearbeitet worden ist oder bevor der E/A-Modus gewechslt wird, sollte sie immer geschlossen werden. oDatei.Close Petra Treubel Seite 23 Windows Script Host 4.2 Arbeiten mit den Netzwerkressourcen Mit Hilfe der Klasse WshNetwork können Netzwerkressourcen des lokalen Rechners bearbeitet werden. Das heißt, es können Netzwerkdrucker eingerichtet oder entfernt werden. Ebenso können freigegebene Verzeichnisse mittels UNC einem Netzlaufwerk zugewiesen werden oder ein Netzlaufwerk kann wieder freigegeben werden. Mit Hilfe der Eigenschaften des WshNetworks-Objekts können benötigte Informationen wie zum Beipiel der Computername oder der Benutzername des angemeldeten Benutzers ermittelt werden. a.) Informationen des lokalen Computers abfragen Falls es wichtig ist, in einem Skript Informationen über den Computer zu bekommen, auf welchem das Skript ausgeführt wird. Kann dafür die Klasse WshNetwork benutzt werden. Set oNetzwerk = WScript.CreateObject("WScript.Network") MsgBox "Domäne = " & oNetzwerk.UserDomain MsgBox "Computername = " & oNetzwerk.ComputerName MsgBox "Benutzername = " & oNetzwerk.UserName b.) Informationen über Netzwerklaufwerke ermitteln Mit der Methode objDrives = object.EnumNetworkDrives kann man die aktuellen Zuordnungen der Netzlaufwerk auflisten. Die Auflistung, die von der Methode zurückgegeben wird, ist ein Array, in dem die lokalen Namen der Netzlaufwerke und die ihnen zugeordneten UNC-Namen - einander paarweise zugeordnet sind. Elemente mit geraden Nummern in der Auflistung stellen lokale Namen von logischen Laufwerken dar. Elemente mit ungeraden Nummern stellen die zugeordneten UNCFreigabenamen dar. Set oNetzwerk = WScript.CreateObject("WScript.Network") Set oNetzLW = oNetzwerk.EnumNetworkDrives strText = "Zuordnungen der Netzlaufwerke:" & vbCrLf For intIndex = 0 to oNetzLW.Count - 1 If (intIndex Mod 2) = 0 Then strText = strText & "Laufwerk " & oNetzLW.Item(intIndex) Else strText = strText & " - " & oNetzLW.Item(intIndex) & vbCrLf End If Next MsgBox strText Petra Treubel Seite 24 Windows Script Host c.) Netzwerklaufwerke einrichten und trennen Unter Windows 2000 können Netzlaufwerke innerhalb der Netzwerkumgebung mit dem KontextmenüBefehl Verbinden... zuordnen. Innerhalb eines Skripts kann dies mit der Methode Object.MapNetworkDrive erledigt werden. Es sollte nur darauf geachtet werden, dass der Laufwerksbuchstabe noch zur Verfügung steht und der UNC korrekt ist, weil das Skript sonst zu einem Laufzeitfehler führen würde. Set oNetzwerk = WScript.CreateObject("WScript.Network") oNetzwerk.MapNetworkDrive "H:", "\\HUGO\USERS" Soll das verbundene Netzlaufwerk wieder getrennt werden, gibt es die Methode Object.RemoveNetworkDrive. Als erster Parameter wird der Laufwerksbuchstabe angegeben. Der zweite Parameter ist optional. Falls das Netzlaufwerk noch benutzt wird, wird es mit dem Parameter true auf jeden Fall getrennt. Set oNetzwerk = WScript.CreateObject("WScript.Network") oNetzwerk.RemoveNetworkDrive "H:" c.) Netzwerkdrucker auflisten, einrichten und trennen Ähnlich wie die Netzlaufwerke können auch Drucker behandelt werden. Siehe Beispiel unten: Dim Dim Dim Dim Dim oNetzwerk oDrucker arrDrucker() intIndex intMax Set oNetzwerk = WScript.CreateObject("WScript.Network") Set oDrucker = WshNetwork.EnumPrinterConnections intMax = oDrucker.Count \ 2 ReDim arrDrucker(intMax) For intIndex = 0 to oDrucker.Count - 1 Step 2 arrDrucker(intIndex) = oDrucker.Item(intIndex+1) Next For intIndex = 0 To intMax oNetzwerk.RemovePrinterConnection arrDrucker(intIndex), true Next oNetzwerk.AddWindowsPrinterConnection "\\HUGO\NeuDrucker" Petra Treubel Seite 25 Windows Script Host 4.3 Arbeiten mit der ADSI (Active Directory Services Interface) 4.3.1 Einführung Mit dem Active Directory Service Interface (ADSI) bietet Microsoft eine COM-Komponente für den Zugriff auf Verzeichnisdienste an. Unter anderem wird auch LDAP in seiner aktuellen Version 3 unterstützt. Ursprünglich war LDAP als leichtgewichtige Alternative zum X.500-Zugriffsprotokoll DAP gedacht. X.500 soll einen Standard für einen globalen, verteilten Verzeichnisdienst definieren, der Informationen über Objekte enthält. Dabei kann es sich um reale Objekte wie Personen oder Geräte sowie um logische Objekte wie Gruppen handeln. Jedes Objekt hat ein oder mehrere Attribute und zugehörige Werte, zum Beispiel einen Vornamen mit dem Wert Hugo. Je nach Netzwerksystem hat sich ein unterschiedlicher Verzeichnisdienst etabliert. Unter Windows NT wird mit den UNC-Namen im Netzwerk gearbeitet. Novell Netware ab der Version 4 benutzt den Netware Directory Services (NDS). Unter Windows 2000 wurden erstmals die Verzeichnisdienste mittels LDAP (Leightweight Directory Access Protocol) realisiert. Damit Sie unterschiedliche Servertypen mit den jeweiligen Namensräumen mit ADSI bearbeiten können, gibt es verschiedene ProgID's, die auch als Moniker bezeichnet werden. ProgId des Providers WinNT: LDAP: NDS: Verwendung Windows NT-Namensraum Zugriff auf Benutzer, Gruppen auf einzelnen W2k-Computern Windows 2000 und Windows Exchange ab 5.5 Nur für Active Directory Objekte Netware Directory Services ab Netware 4 Achtung: Bei den ProgID's muss die Groß- und Kleinschreibung beachtet werden. Der folgende Programmausschnitt zeigt alle zur Verfügung stehenden Provider an. Set oProviders = GetObject("ADs:") For each oProvider in oProviders strText = strText & oProvider.Name & vbCrLf Next Msgbox strText Der Zugriff auf die verschiedenen Methoden und Eigenschaften wird immer über ein Objekt, welches mit der ProgID und dem gewünschten Pfad referenziert wird, realisiert. 'Zugriff auf den Computer COMP123 in der Domäne NT4DOMAIN: Set oCompi = GetObject("WinNT://NT4DOMAIN/COMP123") 'Zugriff auf den Benutzer Adminstrator in der Domäne it-team-d.de: Set oAdi = GetObject("LDAP://cn=Administrator, cn=Users, _ dc=it-team-d, dc=de") Die ProgID wird auch Providername genannt. Der Pfad, der sich der ProgID, bzw. dem Providernamen anschliesst, ist abhängig von dem verwendeten Provider. Über die Methode GetObject erhält man dann Zugriff auf die entsprechenden Objekte des Verzeichnisdienstes. Petra Treubel Seite 26 Windows Script Host Der an die Get-Object-Methode übergebene Parameter spezifiziert den Provider und den Pfad zum Objekt als Zeichenkette. Diese Zeichenkette wird wird manchmal auch als Active Directory Service Path (ADsPath) bezeichnet. Set adsDomain = GetObject("LDAP://ou=Ausbildung,dc=it-team-d,dc=de") Auf Objekte unter Active Directory kann auch über den Windows-NT-Provider zugegriffen werden. Allerdings stehen dann nur die unter Windows-NT bekannten Klassen und Attribute zur Verfügung. So steht nur eine flache Hierarchie ohne Organisationseinheiten zur Verfügung. Die Verwaltung von Freigaben, Diensten und Sitzugen kann aber genauso gut mit dem Windows-NT-Provider realisiert werden. Um auf Objekte des Active Directory zu zugreifen, verwendet ADSI Pfade in der Form: LDAP://[ servername][:port][/DN] wobei alle Bestandteile in den eckigen Klammern wahlweise zu verwenden sind. Ohne servername sucht der Active Directory Locator Service mit Hilfe von DNS den Domänen Controller, der am besten geeignet ist. Fehlt die Angabe zum port wird der Standard LDAP-Port 389 verwendet. Fehlt die Angabe einer Domäne wird der DefaultNamingContext der aktuellen Domäne verwendet. Im ADS-Objektmodell bietet der DefaultNamingContext die Sicht auf den Verzeichnisdienst, wie es auch vom Snap-In Active Directory-Benutzer und –Computer ermöglicht wird. domainDNS user container group organizationalUnit computer printQueue volume2 Petra Treubel Seite 27 Windows Script Host In der unten angebenen Tabelle sind einige Active Directory-Klassen mit den dazu gehörigen Schlüsselattributen angegebenen. Diese werden für den Verzeichniseintrag Domänenbestandteil Organisationseinheit Container Gruppe Benutzer Computer LDAP-Name DomainDS organizationalUnit container group user Computer Schlüsselattribut dc ou cn cn cn cn Der Pfad für das Benutzerkonto Administrator, welches sich standardmäßig im Container Users befindet, würde also folgendermaßen angegeben werden: LDAP://cn=Administrator,cn=Users,dc=it-team-d,dc=de") Das untenstehende Beispiel würde alle Elemente (Benutzer, Gruppen ...) der Domäne auflisten. Ganz egal, ob es sich um eine Windows NT oder 2000 Domäne handelt. Ab jetzt sollten Sie sich angewöhnen, Objekt, die an das Skript gebunden wurden, auch wieder frei zu geben. Beispiel: Dim strText Dim oDomain Dim oElement Set oDomain = GetObject("LDAP://dc=it-team-d, dc=de") For Each oElement in oDomain strText = strText & oElement.Class & ", " & oElement.Name & vbCrLf Next MsgBox strText ' Freigabe des Objekts Set oDomain = Nothing Set oElement = Nothing Entsprechend würde auch der Windows-NT-Provider funktionieren: Set oDomain = GetObject("WinNT://it-Team-d") Petra Treubel Seite 28 Windows Script Host 4.3.2 Organisatorische Einheiten verwalten a.) Organisatorische Einheiten anlegen Zuerst muss ein Zugriff über ein Objekt erzeigt werden. Je nachdem, wo die Organisationseinheit angelegt werden soll, muss der ADS-Path entsprechend angepasst werden. Hier wird direkt unterhalb der Domäne eine Organisationseinheit angelegt. ADSI hält das zu erstellende Objekt zunächst in einem Zwischenspeicher (Property Cache) des Clients, auf dem das Skript ausgeführt wird. Erst nachdem die Methode SetInfo() aufgerufen worden ist, wird das zu erstellende Objekt aus dem Cache gelöscht und in das Active Directory geschrieben. Die Methode SetInfo() sollt für jedes zu erstellende Objekt und jedes geänderte Objekt angewendet werden, um sicher zu stellen, dass die Änderungen auch wirklich stattfinden. Dim oDomain Dim oOU Set oDomain = GetObject("LDAP://dc=it-team-d, dc=de") Set oOU = oDomain.create("organizationalunit", "ou=NeueOU") 'Objekt wegschreiben oOU.SetInfo ' Freigabe des Objekts Set oDomain = Nothing Set oOU = Nothing b.) Organisatorische Einheiten löschen Dim oDomain Dim oOU Set oDomain = GetObject("LDAP://dc=it-team-d, dc=de") Set oOU = GetObject("LDAP:// ou=NeueOU, dc=it-team-d, dc=de") 'Objekt löschen oDomain.Delete "organizationalunit", oOU.Name ' Freigabe des Objekts Set oDomain = Nothing Set oOU = Nothing Petra Treubel Seite 29 Windows Script Host 4.3.3 Gruppen verwalten a.) Gruppen anlegen Wenn nicht anders angegeben wird eine Gruppe als globale Sicherheitsgruppe angelegt. Ansonsten kann der Typ durch die Methode Put() eingestellt werden. Gruppentyp domänenlokale Verteilergruppe globale Verteilergruppe universale Verteilergruppe numerische Konstante 4 2 8 Das Setzen der Eigenschaft sAMAccountName ist bei der Anlage einer Gruppe notwendig, obwohl dieser eigentlich nur in NT erscheint und für die Kommunikation mit älteren Server benötigt wird. Option Explicit Const ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 4 Const ADS_GROUP_TYPE_GOBAL_GROUP = 2 Dim oDomain Dim oGruppe Set oDomain = GetObject("LDAP://ou=neueOU,dc=it-team-d,dc=de") Set oGruppe = oDomain.create("group", "cn=neueGruppe") oGruppe.Put "sAMAccountName", "neueGruppe oGruppe.Put "groupType", ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP oGruppe.Description = "Neue Systemgruppe, mit Skript erstellt" oGruppe.SetInfo b.) Gruppenmitglieder auflisten Set oGruppe = GetObject("LDAP://cn=neueGruppe,ou=neueOU, dc=it-team-d,dc=de") For Each oUser in oGruppe.Members strText = strText & oUser.Name & " (" & oUser.Class & " )" & vbCrLf Next MsgBox strText c.) Benutzerkonten Gruppen hinzufügen Das Benutzerkonto Muster soll hier zur Gruppe neueGruppe hinzugefügt werden. Set oGruppe = GetObject("LDAP:// cn=neueGruppe,ou=neueOU, dc=it-team-d,dc=de") oGruppe.Add("LDAP://cn=Muster,ou=Ausbildung,dc=it-team-d,dc=de") Petra Treubel Seite 30 Windows Script Host d.) Benutzerkonten entfernen Set oGruppe = GetObject("LDAP:// cn=neueGruppe,ou=neueOU, dc=it-team-d,dc=de") oGruppe.Remove("LDAP://cn=Muster,ou=Ausbildung,dc=it-team-d,dc=de") e.) Gruppen löschen 1.Möglichkeit: Dim oGruppe Dim oOU Set oOU = GetObject("LDAP:// ou=NeueOU, dc=it-team-d, dc=de") Set oGruppe = GetObject("LDAP:// cn=neueGruppe,ou=neueOU, dc=it-team-d,dc=de") oOu.Delete "group", oGruppe.Name 2.Möglichkeit: Dim oOU Set oOU = GetObject("LDAP:// ou=NeueOU, dc=it-team-d, dc=de") oOu.Delete "group", "neueGruppe" Petra Treubel Seite 31 Windows Script Host 4.3.4 Benutzerkonten verwalten a.) Benutzerkonten anlegen Um einen Benutzer anlegen zu könne, muss zuerst eine Bindung an ein Objekt, in welchem das Benutzerkonto angelegt werden soll, realisiert werden. Dann müssen bestimmte Eigenschaften unbedingt gesetzt werden. Die Eigenschaft darf nicht vergessen werden, weil sonst bis zur Version Windows 2000 das Anlegen der Benutzers mit einem Fehler beendet wird. Es soll hier die Kompatilität zu Windows NT-Versionen gewährleistet werden, auch wenn der Server im einheitlichen Modus arbeitet. Falls vergessen wird die Eigenschaft IADsUsers.AccountDisabled auf False zu setzen, ist das Benutzerkonto erst mal deakiviert. Entweder wird es dann per Hand aktiviert oder über ein Skript. Diese Eigenschaft kann jedoch nur gesetzt werden, wenn das neue Objekt schon vom Zwischenspeicher in das Verzeichnis geschrieben worden ist. Set oDomain = GetObject("LDAP://ou=Test,ou=Ausbildung, dc=it-team-d,dc=de") Set oUser = oDomain.create("user", "cn=Mustermann") 'Setzt den Benutzeranmeldenamen (Windows NT 3.5x/4.0): oUser.Put "sAMAccountName", "Mustermann" 'Setzt den Benutzeranmeldenamen: oUser.Put "userPrincipalName", "[email protected]" oUser.SetInfo 'Konto ist nicht deaktiviert oUser.AccountDisabled = False oUser.SetInfo MsgBox "Benutzerkonto " & strUser & " wurde erstellt!" Standardmäßig muss das Kennwort des Benutzers bei der ersten Anmeldung geändert werden. Mit der Eigenschaft erhält der Benutzer ein Kennwort und muss dieses nicht mehr bei der ersten Anmeldung ändern. oUser.SetPassword "12345" Dabei muss darauf geachtet werden, dass diese Änderungen noch mal vom Eigenschaftszwischenspeicher in das Verzeichnis geschrieben werden muss. Mit der Eigenschaft ADsPath kann der vollständige Verzeichnispfad des Benutzerkontos angezeigt werden: MsgBox "Benutzerkonto " & oUser.AdsPath & " wurde erstellt!" Petra Treubel Seite 32 Windows Script Host Daneben gibt es noch eine Vielzahl von Benutzereigenschaften, die mittels Skript gesetzt oder verändert werden können. Beschreibung Beschreibung des Benutzerkontos Anzeigename (sonst Name) vollständiger Name Vorname Nachname Beispiel oUser.Description = "Ein neuer Benutzer" oUser.DisplayName = "Harry Hirsch" oUser.FullName = "Prof. Harry S. Hirsch" oUser.FirstName = "Harry" oUser.LastName = "Hirsch" Mit den folgenden Angaben können der Pfad für das Benutzerverzeichnis gesetzt werden: oUser.Homedirectory = "\\Server-E103\User\Mustermann" oUser.Put "homedrive", "H:" b.) Benutzer einer Gruppe hinzufügen Set oGruppe = GetObject("LDAP:// cn=neueGruppe,ou=neueOU, dc=it-team-d,dc=de") oGruppe.Add(oUser.ADsPath) c.) Benutzer aus einer Gruppe entfernen Set oGruppe = GetObject("LDAP:// cn=neueGruppe,ou=neueOU, dc=it-team-d,dc=de") oGruppe.Remove(oUser.ADsPath) d.) Benutzerkonto löschen Set oDomain = GetObject("LDAP://ou=Test,ou=Ausbildung, dc=it-team-d,dc=de") oDomain.Delete "user", "cn=Mustermann" Petra Treubel Seite 33 Windows Script Host e.) Benutzereigenschaften setzen Einige Eigenschaften der Benutzerkonten sind in der Eigenschaft userAccountControl als Bitmuster codiert. Um hier eine Änderung solcher Eigenschaften herbei zu führen, müssen die gesetzten/nicht gesetzten Bits von userAccountControl eingelesen werden, die Bits gesetzt (auf 1) oder gelöscht (auf 0) gesetzt werden. Dabei ist zu beachten, dass einige Bits nicht verändert werden können. Beschreibung Hexadezimal Konto ist deaktiviert Kennwort mit reversibler Verschlüsselung speichern Kennwort läuft nie ab Benutzer muss sich mit einer Smartcard anmelden Konto wird für Delegierungszwecke vertraut Konto kann nicht delegiert werden DES-Verschlüsselungstyp für dieses Konto verwenden Keine Kerberos-Präauthentifizierung erforderlich 1 4 8 1 0 2 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 2 0 0 0 0 0 0 0 Zuerst können die aktuellen Einstellungen mit der Methode IADs.Get eingelesen werden. Der zurückgegebene Datentyp ist ein long-Untertyp und kann in einer Variablen gespeichert werden. intUserflags = oUser.Get("userAccountControl") Für ein Standard-Benutzerkonto ohne weitere Einstellungen ist der zurückgegebene Wert: &H200 (hexadezimal), bzw. &B0010 0000 0000 (binär). Hinter einer einstelligen, hexadezimalen Zahl verstecken sich genau 4 Bits. Hexadezimal Binär 8 1000 4 0100 2 0010 1 0001 Sollen die Bits verändert werden, benutzt man die Methode IADs.Put. Dabei wird durch eine logische Or-Verknüpfung das Bit gesetzt. 'Setzen eines Bits: oUser.Put "userAccountControl", intUserflags Or &H400000 oUser.SetInfo Nach der Ausführung dieser Befehle hat sich der zurückgegebene Wert verändert: &H400200 (hexadezimal), bzw. &B0100 0000 0000 0010 0000 0000 (binär). Einige Eigenschaften kann man nun über diese Bits codieren oder direkt über die Eigenschaft. Zum Beispiel lässt sich ein Konto über die Eigenschaft AccountDisabled oder über das 2.Bit setzen. Andere Bits lassen sich nicht verändern. So muss das Häckchen für die Einstellung "Benutzer muss das Kennwort bei nächster Anmeldung ändern" über oUser.Put "pwdLastSet", 0 gesetzt werden Petra Treubel Seite 34