NAWLogon Helper

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanziieren, wenn die 32bit Version von CSCRIPT/WSCRIPT genutzt wird, welcher unter C:\Windows\SysWOW64\cscript.exe liegt.

Wichtig:
Version 1.4 löst ein Problem, wenn Gruppen in sich selbst Mitglied sind. Das kann man per AD Users & Computers nicht einstellen aber per ADSIEDIT und andere Tools sehr wohl: Ebenfalls kann Gruppe1 in Gruppe 2 sein und Gruppe 2 wieder in Gruppe 1. In der Praxis machen solche Konstruktionen keinen Sinn, aber sind möglich. Version 1.4 erkennt dies nun und bleibt nicht hängen.

Anmeldeskripte sind  eine wichtige Komponente bei einem Netzwerk. Erlauben Sie doch dem Administrator verschiedene Programme zu starten und Aktionen auszuführen, während der Benutzer sich anmeldet. Windows kennt sehr viele Optionen, Programme auszuführen, von denen Sie als Administrator sich die passende Aussuchen können

Einstellung ab OS-Version Security Fokus durch Anwender änderbar Laufzeit

ComputerGPO: Startupskript

Win2000

System

PC

Nein

Computerstart

MSTaskplaner:Computerstart

Win2003/XP

System

PC

Nein

Computerstart

UserGPO: Logonscript

Win2000

System

User

Nein

Nach Anmeldung des Benutzers aber vor dem Start der Shell (Explorer)

Domäne:User-Anmeldeskript

Windows Domäne:
DOS, Win3,1, NT

User

User

Nein

Nach den Gruppenrichtlinien und vor oder zeitgleich zum Explorer
(Synchron oder Asyncron per GPO steuerbar

AllUsers: Autostartordner

Windows 2000

User

User

Nein

Nach dem Explorer

User: Autostartordner

Windows 2000

User

User

Ja

Nach dem Explorer

Registry:HKLM Run/Runconce

Windows 2000

User

User

Nein

Nach dem Explorer

Registry:HKLM Run/Runconce

Windows 2000

User

User

Ja

Nach dem Explorer

Es gibt noch weitere Stellen, an denen ein Admin (aber auch ein Virus) den Start einer Software hinterlegen kann, die aber für eine zentrale Verwaltung nicht relevant sind. Das Programm "Autoruns" (www.sysinternals.com) hilft hier bei der Suche und Analyse.

Wichtig sind neben der Laufzeit (d.h. wann und in welcher Reihenfolge die Skripte gestartet werden) vor allem die Security und der Fokus. Da normale Anwender eben keine "lokalen Administratoren" sind, können Sie Einstellungen, die das System betreffen (z.B. TCPIP-Optimierung, W32Time-Einstellungen etc.) Natürlich nur z.B. �ber ein Startup-Skript in der Computerrichtlinie ausführen.

Einstellungen, die sich aber auf das Profil des Benutzers auswirken (z.B. Laufwerke und Drucker verbinden) sind hingegen z.B. besser in der Benutzerrichtlinie aufgehoben, da diese vor der Shell (Explorer) gestartet wird.

Das normale Domain-Anmeldeskript ist hingegen der Platz, der bei nahezu allen Clients genutzt werden kann (bis zum MSClient für DOS). Auf einem Windows System startet das Anmeldeskript per Default aber "parallel" zur Shell, d.h. es kann passieren, dass Laufwerksverbindungen im Anmeldeskript mit permanenten Laufwerken im Explorer kollidieren, wenn Sie das Anmeldeskriptt nicht "synchron" ausführen lassen (Einstellung in der GPO)

Wenn der Explorer als Shell genutzt wird, dann startet dieser alle Programme der Autostartgruppen und der "RUN/RUNONCE"-Registrierungsschlüssel. Hiermit lassen sich also sehr einfach Programme starten, die eine fertig aufgebaute Umgebung erwarten, z.B. Outlook etc.

Batch oder VBScript oder ...

Lange Zeit waren "Batch-Dateien" das gebräuchlichste Mittel der Wahl, um Anmeldeskripte zu erstellen. Alle Administratoren "konnten" Batchfiles schreiben und mit einfachen IF-Abfragen und dem Aufruf von externen Programmen (z.B. IFMEMBER) verschiedene Entscheidungsbäume aufbauen.

Nachteilig ist hie aber eben, dass ein Batch fast nichts kann und für jede fortgeschrittene Funktion ein zusätzliches Programm erforderlich war, welches entweder lokal verteilt oder doch besser direkt vom Anmeldeserver gestartet wurde. Das kostet aber Bandbreite und Zeit da die Programme erst instanziert werden mussten. Fatal war z.B. "IFMEMBER" um die Mitgliedschaft in einer Gruppe zu prüfen, da jeder Aufruf sehr viele LDAP-Suchvorgänge verursacht hat. Das kann dann wie folgt aussehen (Auszug)

net use g: /delete /yes

\\domain.tld\netlogon\ifmember group1
if errorlevel 1 goto group2
net use g: \\domain.tld\dfs\home\%Username%
 
:group2
\\domain.tld\netlogon\ifmember fhb
if errorlevel 1 goto group3
net use g: \\domain.tld\dfs\home2\%Username%

Pfiffige Administratoren haben sich daher mit IFMEMBER oder WHOAMI die Liste der Gruppenmitgliedschaften einfach als Textdatei nach %TEMP% geschrieben und in der Folge nur noch mit "Find" darin gesucht.

Trotzdem möchte ich langsam ein Plädoyer für VB-Skript beginnen. Seit Windows 2000 ist VBScript per Default im Betriebssystem enthalten und selbst für Windows 95 und NT4 kann es nachinstalliert werden. Nur Windows 3.1 Clients etc. fallen dann hinten über.

Aber VBScript kann jedes lokal vorhandene COM-Objekt ansprechen und damit umfangreiche Funktionen ausüben, die weit über die BATCH-Logik hinaus gehen. Zudem erlaubt die Sprache umfangreichere Funktionen. Allerdings kann ein VBScript auch schnell unübersichtlich werden, wenn man immer wieder den gleichen mehrzeiligen Code schreiben muss. Hier kann man sich aber mit "Funktion" und "SUB-Routinen" helfen oder gleich eine eigene Klasse bauen, die die bereits ermittelten Werte dann auch vorhält.

Klasse: NAWLogonHelper

Genau das mach die Klasse NAWLogonHelper, die ich im laufe der Jahre immer erweitert habe. Sie erlaubt mit einen einfachen Zugriffe auf AD-Gruppe, Verbinden von Laufwerken etc. Bei Kunden, die bislang mit "IFMEMBER und NET USE" die verschiedenen Laufwerke im Anmeldeskript verbunden haben konnte ich damit teilweise die Laufzeit des Anmeldeskripte on 1-2 Minuten auf 5-15 Sekunden drücken. Besonders beim Einsatz über RAS/VPN-Verbindungen zählt nicht nur jedes Byte sondern auch die Latenzzeiten.

Das hier zum Download angebotene VBScript ist nur ein Beispiel um die Funktion der ebenfalls darin enthaltene Klasse zu demonstrieren. Durch den Einsatz einer Klasse bleibt das Skript selbst überschaubar aber vor allem kann die Klasse am Anfang einmal die benötigten Daten vom DC abrufen und dann immer wieder darauf zugreifen. Sie fungiert also als Cache

Die Klasse unterstützt dabei folgende Methoden:

  • MapDrive und MapDriveEx
    Verbindet oder trennt ein Netzwerklaufwerk, wenn die Bedingung (z.B. Mitglied einer Gruppe) zutrifft. Zudem kann eine Liste von Buchstaben mitgegeben werden, von denen dann der erste verfügbare Buchstabe verwendet wird. MapDriveEx erlaubt zusätzlich die Angabe von Anmeldedaten.
  • getUserproperty und getcomputerproperty
    Holt das angegebene Feld des aktuell angemeldeten Benutzer oder des Computers aus dem Active Directory.
  • IsMember
    prüft, ob der aktuelle Benutzer Mitglied der angegebenen Gruppe ist
  • GetEnv
    Liest die angegebene Umgebungsvariable aus und liefert das Ergebnis zurück
  • Run
    Startet das angegebene Programm
  • Logevent
    Schreibt einen Eintrag ins Eventlog. Dies ist eine gute Möglichkeit, den Fortschritt oder Fehler zu protokollieren.
  • Debug, Debugfile und Addstatus
    Erlaubt die detaillierte Protokollierung für Fehlersuche

Vielleicht schaffe ich es später noch die Funktion auf Drucker zu erweitern. Sie können dies aber auch gerne selbst machen. VBScript lässt sich ja kaum schützen. Ein Musterskript kann dann wie folgt aussehen:

dim objNAWLogonHelp

set objNAWLogonhelp = new NAWLogonHelper
objNAWLogonhelp.logevent 0 , "NAWLogon gestartet"
objNAWLogonhelp.Addstatus "NAWLogon gestartet"
objNAWLogonhelp.debug = 0
objNAWLogonhelp.debugfile = "\\server\log$\login-" & objNAWLogonhelp.getUserproperty("name") & "@" & objNAWLogonhelp.getcomputerproperty("name") & ".log"

wscript.echo "-----------------------"
wscript.echo "-------   LOGON  ------"
wscript.echo "-----------------------"
wscript.echo "Datum/Zeit    :" & now()
wscript.echo "Anmeldename   :" & objNAWLogonhelp.getUserproperty("name")
wscript.echo "dn            :" & objNAWLogonhelp.getUserproperty("distinguishedName")
wscript.echo "Benutzername  :" & objNAWLogonhelp.getUserproperty("displayname")
wscript.echo "HomeDirectory :" & objNAWLogonhelp.getUserproperty("HomeDirectory")
wscript.echo "Computer      :" & objNAWLogonhelp.getcomputerproperty("name")
wscript.echo "-----------------------"

wscript.echo "Entferne alte Laufwerke"
objNAWLogonhelp.mapdrive "FGHIJKLMNPTU", "",""

wscript.echo "Verbinde Heimatverzeichnis"
objNAWLogonhelp.mapdrive "H", "\\server\User1",		"User1"
objNAWLogonhelp.mapdrive "H", "\\server\User2",		"User2"

wscript.echo "Verbinde Verzeichnis mit expliziten Anmeldedaten"
objNAWLogonhelp.mapdriveEx "I", "\\server\test","User",false,"domain\User","password"

wscript.echo "Starte EXE"
objNAWLogonhelp.logevent 0 , "Start Inventory.exe"
objNAWLogonHelp.run "\\server\share\Inventory.exe",7
objNAWLogonhelp.logevent 0 , "Ende Inventory.exe"

wscript.echo "NAWLogon beendet"
objNAWLogonhelp.logevent 0 , "NAWLogon beendet"
set objNAWLogonhelp = nothing

Der Download enthält diese Zeilen und Natürlich die benötigte Klasse

nawlogon.vbs.txt (10kb)
Beispiel Anmeldeskript mit der Klasse "NAWLogonHelper"

Weitere Links