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

« 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.

« nach oben

« 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. :twisted:

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). :lol:

Genug gelästert...

« nach oben

« 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.

« nach oben

« 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? 8-)

' 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

« nach oben

« 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

  1. Bezeichnung
  2. Laufwerksbuchstabe
  3. 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

« nach oben

« 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.

« nach oben

« 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.

« nach oben

« 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.

« nach oben

« 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

  Download logon.vbs.txt

« nach oben

« 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... ;-)

« nach oben

« zurück (Gesammelte Anleitungen)