Windows Loginskript mit Visual Basic
Einleitung
Loginskripte werden benutzt, um benutzerabängig irgendwelche Aufgaben zu erledigen, die einmalig bei der Anmeldung durchgeführt werden sollen. Darunter fallen z. B. Dinge wie das Kopieren von Dateien oder das Verbinden von Netzlaufwerken, auf die der Benutzer Zugriff haben soll.
Unter Windows verwendet man normalerweise normales Batchskripting (command.com, Dateiendung BAT) oder die modernere (seit Windows NT) cmd.exe, Dateiendung CMD, die für sich alleine aber nicht gerade mit Features glänzen.
Man kann aber auch Visual Basic Script (Dateiendung VBS) verwenden und damit auf eine Vielzahl von Vorteilen zurückgreifen, da für viele Systemaufgaben bereits vorgefertigte Klassen zur Verfügung gestellt werden, die man direkt benutzen kann.
Es folgt eine kleine Sammlung an dokumentierten Funktionen, mit denen man verschiedene Aufgaben erledigen kann, die bei einer Benutzeranmeldung am Netzwerk durchzuführen sind.
« zurück (Gesammelte Anleitungen)
Inhalt
- Vorbemerkung
- Allgemeines zu Visual Basic
- Das Grundgerüst
- Hilfsfunktion: Gruppen des Benutzers aus dem Active Directory auslesen
- Funktion: Netzlaufwerk verbinden und Namen setzen
- Funktion: Netzlaufwerk trennen
- Funktion: Netzwerkdrucker einbinden
- Funktion: Kopieren von Daten
- Alles in Einem
- Nachwort
« zurück (Gesammelte Anleitungen)
Vorbemerkung
Zuallererst: Ich bin kein Visual Basic Programmierer und habe mir die Code-Schnipsel mehr oder weniger zusammengesucht. Ich bin dabei auf programmiertechnische Unschönheiten gestoßen, die mir noch bei keiner anderen Programmiersprache untergekommen sind. Darauf gehe ich hier aber nicht weiter ein... naja, vielleicht ein bisschen.
Das am Ende stehende Loginskript beinhaltet alle hier vorgestellten Hilfsfunktionen mit ein oder mehreren Beispielen zur Anwendung. Wer also nur eine fertige Lösung sucht, sollte hier einsteigen: Download logon.vbs.txt.
Wer sich mit den Hintergründen und der Funktionsweise der einzelnen Helferlein auseinandersetzen möchte und sich das Skript auf die benötigten Teile zurechtschneiden will, sollte weiterlesen.
« zurück (Gesammelte Anleitungen)
Allgemeines zu Visual Basic
Zum Verständnis des Skripts gehe ich hier doch noch auf ein paar Kleinigkeiten ein, die mich Zeit gekostet haben, weil sie in dieser Form in anderen Programmiersprachen anders gelöst oder unüblich sind (milde ausgedrückt).
Lange Zeilen und der Zeilenumbruch
Man kann lange Programmzeilen auf mehere Zeilen aufteilen und miteinander verbinden. Im Gegensatz zu fast jeder anderen Programmiersprache, die den \ (Backslash) benutzen, nimmt an in Visual Basic den _ (Unterstrich):
If objNetwork.UserName = "Administrator" _ Or objNetwork.UserName = "Administratorin" [... tu was Sinnvolles ...] End If
Variablen
Variablen und Objekte werden vor der ersten Benutzung dimensioniert (deklariert). Hierfür schreibt man einfach an den Anfang einer Funktion eine DIM-Anweisung:
Dim meineVariable
Zuweisen kann man einfach durch Gleichheitszeichen, bei Objekten muss das Schlüsselwort Set vorangestellt werden:
' eine Variable meineVariable = 0 ' ein Objekt Set meinObject = CreateObject("Shell.Application")
Rückgabewert einer Funktion
Hier wird's komisch...
Den Rückgabewert einer Funktion erreicht man, indem man dem Funktionsnamen den zurückzugebenden Wert zuweist:
Public Function isTrue() isTrue = True End Function
In diesem Fall liefert also der Aufruf der Funktion isTrue den Wert True zurück.
Fehlerbehandlung
In Visual Basic kann man die Fehlerbehandlung umgehen, d. h. man kann die Anweisung geben, dass im Falle von Fehlern das Programm das einfach ignoriert, und somit kein Fehlerfensters aufpoppt. Für das Debuggen eines Programmes ist das natürlich nicht zu empfehlen, aber eine aufpoppende Fehlermeldung beim Anmeldevorgang des Benutzers ist erst recht unerwünscht.
Aufheben der Fehlerbehandlung für eine Funktion:
Public Function isTrue() ON ERROR RESUME NEXT isTrue = True End Function
Die Zeile bewirkt, dass im Fehlerfalle einer Zeile einfach zur nächsten Anweisung gesprungen wird. Das kann
natürlich zu Folgefehlern führen, aber das macht nichts, denn die werden ja auch ignoriert.
Die Fehlerbehandlung kann man auch wiederherstellen, z. B. zum Debuggen von Fehlern, die man bis eben nicht sah:
Public Function isTrue() ON ERROR GOTO 0 isTrue = True End Function
Ja, da wäre ich auch gleich gekommen: Im Fehlerfalle springe zu Zeile 0. Klingt komisch, ist aber so:
MSDN: On Error-Anweisung (Visual Basic).
Genug gelästert...
« zurück (Gesammelte Anleitungen)
Das Grundgerüst
Ein Programm besteht meistens aus mehreren Teilen. Es beginnt mit ein paar Kopfzeilen, die Name, Beschreibung, Version, Datum und Autor des Programms beinhalten. Diese Kopfzeilen ermöglichen es, bei mehrfachem Einsatz des Skriptes auf einen Blick den Entwicklungsstand des Programmes zu ermitteln, ohne dass man sich durch meist undokumentierte Änderungen hangeln muss.
Es folgen die globalen Variablen und Objekte, deren Verwendung man meiden sollte, da sie von allen anderen Funktionen gelesen und geschrieben werden können. In einem Loginskript ohne Abhängigkeiten zu anderen Programmmodulen können wir das aber vernachlässigen.
Als Nächstes kommen die Definitionen der Hilfsfunktionen, die im Hauptteil (in vielen Programmiersprachen die Funktion oder Methode mit dem Namen main) für verschiedene Aufgaben aufgerufen werden. Diese Funktionen sind weiter unten im Einzelnen beschrieben.
Kurz vor dem Ende steht der Hauptteil, in dem die benutzten Objekte instanziiert (initialisiert) und die eigentlichen Aufgaben erledigt werden.
Anschließend wird mit der Methode WScript.Quit die Skriptverarbeitung beendet. Alle folgenden Zeilen haben keine Auswirkungen auf den Programmablauf mehr.
Hier das Code-Fragment, das nur das Grundgerüst beinhaltet:
' ---------------------------------------------------------------------- ' Name: ' logon.vbs ' Beschreibung: ' Allgemeines Loginskript für alle Benutzer ' Version: ' 1.0 ' Datum: ' 2009-09-20 ' Autor: ' Kai Hildebrandt ' ---------------------------------------------------------------------- ' 1) Globale Definitionen ' Alle benutzten Variablen müssen vorher DIMensioniert werden Option Explicit ' Global verwendete Objekte Dim objShell, objNetwork, wshShell, objFile ' 2) Funktionsdefinitionen [... Definition der benötigten Hilfsfunktionen ...] ' ---------------------------------------------------------------------- ' main() ' ---------------------------------------------------------------------- Set objShell = CreateObject("Shell.Application") Set wshShell = CreateObject("WScript.Shell") Set objNetwork = CreateObject("WScript.Network") Set objFile = CreateObject("Scripting.FileSystemObject") ' 3) Hauptprogramm [... Erledigen der Aufgaben ...] ' ---------------------------------------------------------------------- ' Ende ' ---------------------------------------------------------------------- WScript.Quit
Anmerkung: Um das Einordnen der folgenden Code-Fragemente zu erleichtern, werden darin auch immer die drei Bereiche "1) Globale Definitionen", "2) Funktionsdefinitionen" und "3) Hauptprogramm" verwendet.
« zurück (Gesammelte Anleitungen)
Hilfsfunktion: Gruppen des Benutzers aus dem Active Directory auslesen
Oft ist es notwendig, über den momentan angemeldeten Benutzer mehr zu erfahren, um dann darauf basierend eine Aufgabe auszuführen. Die folgende Hilfsfunktion isMemberOfGroup ermittelt die Gruppenmitgliedschaften des Benutzers direkt aus dem ActiveDirectory. Damit das aber nicht für jede einzelne Verzweigung der Domain Controller mit Anfragen bombardiert wird, ist noch ein Array als Zwischenspeicher eingebaut, d. h. ab der zweiten Anfrage holt sich die Funktion die benötigten Informationen aus seinem Zwischenspeicher.
Extrem cool, ist es nicht?
' 1) Globale Definitionen ' Zeigt an, ob die Gruppenliste des aktuellen Benutzers befüllt ist Dim initGroupFlag ' Gruppenliste des aktuellen Benutzers Dim groupList() ' Gruppenmitgliedschaft noch nicht geprüft initGroupFlag = False ' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function isMemberOfGroup(strMyGroup) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT Dim retVal Dim index Dim objADSysInfo Dim strUser, objUser Dim strGroup, objGroup If initGroupFlag = False Then ' Array mit der Gruppenzugehörigekeit beim ersten Aufruf dieser Funktion ' initialisieren ' init: Benutzer ist nicht Mitglied der Gruppe retVal = False ' Benutzerobjekt aus AD holen Set objADSysInfo = CreateObject("ADSystemInfo") strUser = objADSysInfo.UserName Set objUser = GetObject("LDAP://" & strUser) ' Gruppenmitgliedschaft dieses Benutzers holen index = 0 For Each strGroup In objUser.GetEx("memberOf") ' Mit Vector oder Queue wäre das nicht passiert ;-) ReDim Preserve groupList(index+1) index = Ubound(groupList) ' Gruppenname in Array speichern Set objGroup = GetObject("LDAP://" & strGroup) groupList(index) = objGroup.CN ' Gruppenmitgliedschaft pröfen If groupList(index) = strMyGroup Then retVal = True End If Next ' nächstes Mal in Array nachsehen und nicht DC belästigen ;-) initGroupFlag = True isMemberOfGroup = retVal Exit Function Else ' Ab dem zweiten Aufruf dieser Funktion werden die Vergleiche mit dem ' beim Erstaufruf vorbereiteten Array durchgeführt ' Gruppenmitgliedschaft prüfen For index = 1 To UBound(groupList) If groupList(index) = strMyGroup Then isMemberOfGroup = True Exit Function End If Next ' Benutzer ist nicht Mitglied der Gruppe isMemberOfGroup = False Exit Function End If End Function
Die Funktion nimmt als Parameter den Namen einer Gruppe. Die Funktion prüft, ob der sich anmeldende Benutzer in dieser Gruppe Mitglied ist. Ist er Mitglied der Gruppe, liefert sie den Rückgabewert True, sonst False.
Hier ein kleines Anwendungsbeispiel:
' Nur Leute der Gruppe 'homies' bekommen Heimlaufwerke gemappt If isMemberOfGroup("homies") = True Then ' Die Homeverzeichnisse aller User mapAndRenameMyDrives objNetwork.UserName, "H:", "\\fileserver\" & objNetwork.UserName End If
« zurück (Gesammelte Anleitungen)
Funktion: Netzlaufwerk verbinden und Namen setzen
Normalerweise lagert man die Nutzerdaten in Netzlaufwerke aus, so dass diese nicht im Benutzerprofil liegen und im Falle von servergespeicherten Profilen bei der An- und Abmeldung vom System abgeglichen werden müssen.
Die folgende Funktion verbindet ein Netzlaufwerk von einem Dateiserver und weist dem Laufwerk einen Laufwerksbuchstaben und einen Namen zu, die dann im Windows Explorer erscheinen:
' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function mapAndRenameMyDrives(strMyDrivename, strMyDriveLetter, strMyRemotePath) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.RemoveNetworkDrive strMyDriveLetter, True, True objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath objShell.NameSpace(strMyDriveLetter).Self.Name = strMyDrivename mapAndRenameMyDrives = "" End Function
Die Parameter der Funktion sind
- Bezeichnung
- Laufwerksbuchstabe
- UNC-Pfad zur Freigabe
Die Anwendung ist einfach und wurde bereits weiter oben gezeigt, hier leicht abgewandelt, mit fester Bezeichnung:
mapAndRenameMyDrives "Home Sweet Home", "H:", "\\fileserver\" & objNetwork.UserName
Sollte man die Bezeichnung der Freigabe nicht benötigen, kann man die Funktion auch um eine Zeile kürzen:
' ---------------------------------------------------------------------- Public Function mapMyDrives(strMyDriveLetter, strMyRemotePath) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.RemoveNetworkDrive strMyDriveLetter, True, True objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath mapMyDrives = "" End Function
Anwendung wie oben, nur ohne den ersten Parameter:
mapMyDrives "H:", "\\fileserver\" & objNetwork.UserName
« zurück (Gesammelte Anleitungen)
Funktion: Netzlaufwerk trennen
Um sicherzustellen, dass ein Laufwerksbuchstabe nicht schon durch ein Netzlaufwerk belegt ist, kann man den Laufwerksbuchstaben vorher trennen, sofern es sich dabei um ein Netzlaufwerk handelt.
Ein größeres Problem heute sind die Kartenlesegeräte für x verschiedene Kartentypen, die gleich mehrere Laufwerksbuchstaben auf einmal reservieren und dadurch die unteren Laufwerksbuchstaben belegen. Das kann man leider nicht durch eine Funktion abfangen bzw. ich habe hierfür noch keine Lösung gefunden.
' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function unmapMyDrives(strMyDriveLetter) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.RemoveNetworkDrive strMyDriveLetter, True, True unmapMyDrives = "" End Function
Die Funktion nimmt einen Laufwerksbuchstaben als Parameter, der getrennt werden soll:
unmapMyDrives "H:"
Hier wird das Netzlaufwerk getrennt, dass momentan noch als Laufwerksbuchstabe H: eingebunden ist.
« zurück (Gesammelte Anleitungen)
Funktion: Netzwerkdrucker einbinden
Was mit Netzlaufwerken funktioniert, kann man auch mit Netzwerkdruckern machen. Der Name wird hierbei vom anbietenden Druckserver vorgegeben, also ist die Funktion recht einfach:
' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function mapNetworkPrinter(strMyUNCPrinter) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.AddWindowsPrinterConnection strMyUNCPrinter mapNetworkPrinter = "" End Function
Die Funktion nimmt einen UNC-Pfad zum Drucker als Parameter, der verbunden werden soll:
mapNetworkPrinter "\\printserver\DR_HPLJ1100_SW_A4"
Hier wird der Drucker "DR_HPLJ1100_SW_A4", der auf dem Druckserver "printserver" freigegeben ist, verbunden.
« zurück (Gesammelte Anleitungen)
Funktion: Kopieren von Daten
Hier noch eine weitere Funktion, die aus der Notwendigkeit geboren wurde, dass bei der Anmeldung ein neues Profil für Lotus Notes von einem Vorlagenlaufwerk kopiert werden soll, sofern dieses Profil noch nicht existiert.
Zugegeben, ein Spezialfall, aber man kann hieraus sehr gut andere Fälle für das Kopieren von Dateien ableiten.
Für diese Aufgabe benötigt man noch eine weitere Hilfsfunktion, die ermittelt, ob in einem Verzeichnis Dateien mit einer bestimmten Endung darin vorhanden sind. Diese Hilfsfunktion wird jedes Mal aufgerufen, wenn Dateien mit einer bestimmten Endung kopiert werden sollen, da die Kopierfunktion sonst einen Fehler ausgeben würde. Dank der bereits kennengelernten "genialen" Fehlerbehandlung in Visual Basic wäre das an sich nicht notwendig, aber es ist so deutlich robuster.
' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function existsInDir(myDir, myExt) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT Dim folderList Set folderList = objFile.GetFolder(myDir) existsInDir = False For Each File In Folder.Files If objFile.GetExtensionName(File) = myExt Then existsInDir = True Exit Function End If Next End Function
Die Übergabeparameter sind das Verzeichnis und die Dateiendung, auf die in dem Verzeichnis geprüft werden soll. Die Anwendung dieser Hilfsfunktion findet in der eigentlichen Kopierfunktion statt:
' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function copyData() ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT Dim srcDir, dstDir, oldDstDir srcDir = "K:\template\" dstDir = "H:\path\to\destination\" oldDstDir = "H:\path\to\old\destination\" If objFile.FolderExists(dstDir) = True Then ' Aktuelle Konfiguration existiert bereits... Abbruch Exit Function End If ' Neues Datenverzeichnis anlegen und befüllen objFile.CreateFolder(dstDir) objFile.CopyFile srcDir & "*.*", dstDir ' Existiert bereits ein altes Profilverzeichnis? If objFile.FolderExists(oldDstDir) = True Then ' Ja... alte Profildaten ins neue Profil übernehmen If existsInDir(oldDstDir, "id") = True Then objFile.CopyFile oldDstDir & "*.id", dstDir End If If existsInDir(oldDstDir, "nsf") = True Then objFile.CopyFile oldDstDir & "*.nsf", dstDir End If If objFile.FileExists(oldDstDir & "desktop6.ndk") = True Then objFile.CopyFile oldDstDir & "desktop6.ndk", dstDir End If End If End Function
Die Funktion selbst benötigt keine Parameter und ist, wie bereits erwähnt, ein Spezialfall. Von diesen Code-Fragmenten kann man aber sehr einfach Kopierfunktionen ableiten, denn die meistgebrauchten Methoden der Klasse Scripting.FileSystemObject werden in diesem Beispiel verwendet.
Wem das nicht reichen sollte, findet in der Referenz Hilfe: MSDN: FileSystemObject Basics.
« zurück (Gesammelte Anleitungen)
Alles in Einem
Hier nun das Loginskript mit allen Hilfsfunktionen und deren Anwendungsfällen:
' ---------------------------------------------------------------------- ' Name: ' logon.vbs ' Beschreibung: ' Allgemeines Loginskript für alle Benutzer ' Version: ' 1.0 ' Datum: ' 2009-09-20 ' Autor: ' Kai Hildebrandt ' ---------------------------------------------------------------------- ' 1) Globale Definitionen ' Alle benutzten Variablen müssen vorher DIMensioniert werden Option Explicit ' Global verwendete Objekte Dim objShell, objNetwork, wshShell, objFile ' Zeigt an, ob die Gruppenliste des aktuellen Benutzers befüllt ist Dim initGroupFlag ' Gruppenliste des aktuellen Benutzers Dim groupList() ' Gruppenmitgliedschaft noch nicht geprüft initGroupFlag = False ' 2) Funktionsdefinitionen ' ---------------------------------------------------------------------- Public Function isMemberOfGroup(strMyGroup) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT Dim retVal Dim index Dim objADSysInfo Dim strUser, objUser Dim strGroup, objGroup If initGroupFlag = False Then ' Array mit der Gruppenzugehörigekeit beim ersten Aufruf dieser Funktion ' initialisieren ' init: Benutzer ist nicht Mitglied der Gruppe retVal = False ' Benutzerobjekt aus AD holen Set objADSysInfo = CreateObject("ADSystemInfo") strUser = objADSysInfo.UserName Set objUser = GetObject("LDAP://" & strUser) ' Gruppenmitgliedschaft dieses Benutzers holen index = 0 For Each strGroup In objUser.GetEx("memberOf") ' Mit Vector oder Queue wäre das nicht passiert ;-) ReDim Preserve groupList(index+1) index = Ubound(groupList) ' Gruppenname in Array speichern Set objGroup = GetObject("LDAP://" & strGroup) groupList(index) = objGroup.CN ' Gruppenmitgliedschaft pröfen If groupList(index) = strMyGroup Then retVal = True End If Next ' nächstes Mal in Array nachsehen und nicht DC belästigen ;-) initGroupFlag = True isMemberOfGroup = retVal Exit Function Else ' Ab dem zweiten Aufruf dieser Funktion werden die Vergleiche mit dem ' beim Erstaufruf vorbereiteten Array durchgeführt ' Gruppenmitgliedschaft prüfen For index = 1 To UBound(groupList) If groupList(index) = strMyGroup Then isMemberOfGroup = True Exit Function End If Next ' Benutzer ist nicht Mitglied der Gruppe isMemberOfGroup = False Exit Function End If End Function ' ---------------------------------------------------------------------- Public Function existsInDir(myDir, myExt) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT Dim folderList Set folderList = objFile.GetFolder(myDir) existsInDir = False For Each File In Folder.Files If objFile.GetExtensionName(File) = myExt Then existsInDir = True Exit Function End If Next End Function ' ---------------------------------------------------------------------- Public Function mapAndRenameMyDrives(strMyDrivename, strMyDriveLetter, strMyRemotePath) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.RemoveNetworkDrive strMyDriveLetter, True, True objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath objShell.NameSpace(strMyDriveLetter).Self.Name = strMyDrivename mapAndRenameMyDrives = "" End Function ' ---------------------------------------------------------------------- Public Function mapMyDrives(strMyDriveLetter, strMyRemotePath) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.RemoveNetworkDrive strMyDriveLetter, True, True objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath mapMyDrives = "" End Function ' ---------------------------------------------------------------------- Public Function unmapMyDrives(strMyDriveLetter) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.RemoveNetworkDrive strMyDriveLetter, True, True unmapMyDrives = "" End Function ' ---------------------------------------------------------------------- Public Function mapNetworkPrinter(strMyUNCPrinter) ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT objNetwork.AddWindowsPrinterConnection strMyUNCPrinter mapNetworkPrinter = "" End Function ' ---------------------------------------------------------------------- Public Function copyData() ' ---------------------------------------------------------------------- ON ERROR RESUME NEXT Dim srcDir, dstDir, oldDstDir srcDir = "K:\template\" dstDir = "H:\path\to\destination\" oldDstDir = "H:\path\to\old\destination\" If objFile.FolderExists(dstDir) = True Then ' Aktuelle Konfiguration existiert bereits... Abbruch Exit Function End If ' Neues Datenverzeichnis anlegen und befüllen objFile.CreateFolder(dstDir) objFile.CopyFile srcDir & "*.*", dstDir ' Existiert bereits ein altes Profilverzeichnis? If objFile.FolderExists(oldDstDir) = True Then ' Ja... alte Profildaten ins neue Profil übernehmen If existsInDir(oldDstDir, "id") = True Then objFile.CopyFile oldDstDir & "*.id", dstDir End If If existsInDir(oldDstDir, "nsf") = True Then objFile.CopyFile oldDstDir & "*.nsf", dstDir End If If objFile.FileExists(oldDstDir & "desktop6.ndk") = True Then objFile.CopyFile oldDstDir & "desktop6.ndk", dstDir End If End If End Function ' ---------------------------------------------------------------------- ' main() ' ---------------------------------------------------------------------- Set objShell = CreateObject("Shell.Application") Set wshShell = CreateObject("WScript.Shell") Set objNetwork = CreateObject("WScript.Network") Set objFile = CreateObject("Scripting.FileSystemObject") ' 3) Hauptprogramm ' Netzlaufwerke gibt es nur fuer Mitglieder der Gruppe 'firma' If isMemberOfGroup("firma") = True Then ' Heimverzeichnis des Benutzers verbinden mapAndRenameMyDrives objNetwork.UserName, "H:", "\\filer\" & objNetwork.UserName ' Laufwerk fuer Programmdaten verbinden mapAndRenameMyDrives "Programme", "K:", "\\filer2\programme" ' Öffentliches Arbeitsverzeichnis verbinden mapAndRenameMyDrives "Public", "P:", "\\filer2\public" ' Ein Laufwerk nur für die Administratoren If objNetwork.UserName = "Administrator" _ Or objNetwork.UserName = "meier_admin" _ Or objNetwork.UserName = "mueller_admin" Then mapAndRenameMyDrives "Chef", "Q:", "\\filer\adminshare" End If ' Und eins nur für Mitglieder der Abteilung (Gruppe) Buchhaltung If isMemberOfGroup("buchhaltung") = True Then mapAndRenameMyDrives "Buchhaltung", "U:", "\\filer\buchhaltung" End If ' Aktualisierung von Lotus Notes copyData End If ' ---------------------------------------------------------------------- ' Ende ' ---------------------------------------------------------------------- WScript.Quit
« zurück (Gesammelte Anleitungen)
Nachwort
Mit den obigen Beispielen lässt sich der eine oder andere Anwendungsfall realisieren, die mit einem herkömmlichen Loginskript in Batch- oder CMD-Syntax nicht ohne Hilfsprogramme möglich sind.
Da ich wie gesagt mit Visual Basic nicht programmiere, bin ich über Hinweise auf Fehler dankbar. Außerdem freue ich mich über Erweiterungen, die ich hier zu diesem Thema veröffentlichen darf. Die Quelle wird selbstverstädlich genannt und verlinkt, sofern das gewünscht ist. Allerdings sollte es sich hierbei nicht gerade um besonders trickreiche Sonderfälle handeln, sondern eine bestimmte, für Andere auch interessante Aufgabe handeln.
Bei den Recherchen zu diesem Skript und seinen Funktionen bin ich an so manche Ecke und Unschönheit von Visual Basic gestoßen, die teilweise eben einfach nur anders gelöst oder "by design" Mist sind.
Oder anders ausgedrückt: Mehr als ein Loginskript würde ich in dieser Programmiersprache nicht umsetzen wollen und werde das wohl auch nicht tun.
So long...