WSH mit VBScript ohne UML

Werbung
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
Herunterladen