NAWLogon Helper

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanzieren, 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 for 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:

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

Keywords:Anmeldeskript NAWLogon