Loginskripts und Active Directory
 
Verfasser: Nils Kaczenski
Quelle:
http://www.faq-o-matic.net/content/view/31/45/
(Minimal Textänderungen und Kommentare hinzugefügt)
 
Beispiele sind am Ende des Textes zu finden.
 
 

Typen von Anmeldeskripts
Active Directory unterstützt mehrere Typen von Anmeldeskripts und verwandten ausführbaren Dateien. Dies sind folgende:

- Klassische Anmeldeskripts, die einem Benutzerkonto zugewiesen sind und im NETLOGON-Verzeichnis des Domänencontrollers liegen.
- Logon-Skripts, die mit den Gruppenrichtlinien zugewiesen werden.
- Logoff-Skripts, die mit den Gruppenrichtlinien zugewiesen werden.
- Skripts, die beim Starten bzw. Herunterfahren des Computers ausgeführt werden. Diese werden ebenfalls über Gruppenrichtlinien zugewiesen.


Klassische Anmeldeskripts (NETLOGON)
Genau wie Windows NT unterstützt auch Active Directory die Zuweisung von Anmeldeskripts über die Eigenschaften des Benutzerkontos. Dabei wird nur die Angabe eines Dateinamen erwartet. Der Speicherort des Skripts ist die NETLOGON-Freigabe des Anmeldeservers.
 
Im Unterschied zu Windows NT 4.0 ist der Speicherpfad dieser Freigabe auf einem Windows-2000-Domänencontroller das Sysvol-Verzeichnis (Standard: %systemroot%\SYSVOL\sysvol\<Domänenname>\scripts). Achtung: Dies ist in der Onlinehilfe nicht korrekt dargestellt!
 
Unter Windows 2000 können Anmeldeskripts klassische Batchdateien sein (*.bat, *.cmd), aber auch WSH-Skripte (VBScript, Jscript usw.). Diese erweiterten Möglichkeiten setzen allerdings auch auf Client-Seite Windows 2000 voraus, bzw. benötigen den Windows Scripting Host (WSH) um diese Dateien auszuführen. Windows 9x und NT4 Clients bringen diese Option nicht von alleine mit. Der WSH kann hier heruntergeladen werden.
Weitere Einschränkungen bei Windows 9x:  Es sollte dran gedacht werden, daß beim Einsatz einer klassischen Stapelverarbeitungsdatei (*.bat, *.cmd), Windows 9x nicht mit der Endung .CMD zurechtkommt, sondern nur die .BAT Endung kennt. Zudem sind gerade bei den sehr gebräuchlichen NET-Befehlen die Optionen, die NT4/W2K/XP unterstützen nicht in der net.exe von 9x integriert.

Da Active Directory über einen leistungsfähigen Replikationsmechanismus verfügt, werden Logonskripts automatisch zwischen den Domänencontrollern repliziert; ein manuelles Kopieren oder Konfigurieren der Replikation ist daher nicht mehr notwendig.
 
Für Clients unter Windows NT 4.0 (bzw. Windows 9x/Me) ist diese Variante der Anmeldeskripts die einzige anwendbare, weil diese Betriebssysteme keine Gruppenrichtlinien ausführen können.
 
 
Skripts über die Gruppenrichtlinien
Als erweiterte (und empfohlene) Methode unterstützt Active Directory das Zuweisen von Skripts über die Gruppenrichtlinien (GPO, Group Policy Object). Diese Methode kann in größeren Umgebungen deutlich flexibler sein. Für folgende Zwecke lassen sich Skripts zuweisen:

- Start des Computers: Skripts werden in der Gruppenrichtlinie unter "Computereinstellungen / Windows-Einstellungen / Skripts (Start/Herunterfahren) / Starten" zugewiesen. Sie werden ausgeführt, wenn der betreffende Computer startet (am Ende des Bootvorgangs).

Hier kann es zu kleinen Verwirrungen führen, da das Script bei Default Einstellung nicht sichtbar ausgeführt wird. Um Script sichtbar auszuführen ist weiter unten die passende Richtlinie angegeben.
 
- Herunterfahren des Computers: Skripts werden in der Gruppenrichtlinie unter "Computereinstellungen / Windows-Einstellungen / Skripts (Start/Herunterfahren) / Herunterfahren" zugewiesen. Sie werden ausgeführt, wenn der betreffende Computer herunterfährt.
- Anmeldung eines Benutzers: Skripts werden in der Gruppenrichtlinie unter "Benutzereinstellungen / Windows-Einstellungen / Skripts (Anmelden/Abmelden) / Anmelden" zugewiesen. Sie werden ausgeführt, nachdem das Benutzerprofil geladen wurde.
- Abmeldung eines Benutzers: Skripts werden in der Gruppenrichtlinie unter "Benutzereinstellungen / Windows-Einstellungen / Skripts (Anmelden/Abmelden) / Abmelden" zugewiesen. Sie werden ausgeführt, wenn der Benutzer sich abmeldet.


Im Normalfall muss folgende Methode zum Zuweisen der Skripts angewandt werden, weil sonst die Skripts nicht ausgeführt werden:

1. Anlegen und Testen des Skripts, Speichern an beliebigem Speicherort. Das Skript darf nicht im Unicode-Format gespeichert werden, sondern als ASCII- oder ANSI-Datei!
2. Öffnen des Skript-Eintrags in der Gruppenrichtlinie, Doppelklick auf "Starten", "Herunterfahren", "Anmelden" oder "Abmelden".
3. Klick auf den Button "Dateien anzeigen". Es öffnet sich ein Explorer-Fenster.
4. In dieses Explorer-Fenster muss die unter 1. gespeicherte Datei kopiert werden. Das Ordnerfenster kann dann geschlossen werden.
5. Über den Button "Hinzufügen" im Skript-Fenster den Dateinamen (ohne Pfad) des unter 4. kopierten Skripts angeben.
6. OK bestätigen.

Wichtig ist, dass die Datei explizit in den dafür vorgesehenen Ordner kopiert wurde (Punkt 4) und dass ihr Dateiname in der Gruppenrichtlinie angegeben wird (Punkt 5). Die Skripts werden nicht automatisch in den Ordner kopiert, wenn man einen anderen Pfad auswählt. Dem System ist es aber egal, ob das Skript vor Bearbeitung der Policy oder erst hinterher dort hinkopiert wird; wichtig ist die Anwesenheit des Skripts bei Ausführung der Policy.
 
 
Neue Methode!
Norbert Fehlauer hat in der Newsgroup auf ein anderes Verfahren hingewiesen, das einen entscheidenden Vorteil hat. In diesem Fall werden auch die GPO-Logonskripts in der NETLOGON-Freigabe der Domänencontroller abgelegt (dadurch hat man exakt einen Speicherungs- und Bearbeitungsort!). Um die Skripts nun so ins GPO einzubinden, dass sie auch funktionieren, wählt man folgenden Kniff: Man wählt den Pfad "\\domain.local\sysvol\domain.local\scripts" (dabei ist "domain.local" der DNS-Name der Domäne) und nicht "\\domain.local\sysvol\domain.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\USER\Scripts" (dabei gilt Entsprechendes). Man kann sich zu diesem Zweck einfach durch das oben erwähnte Dateiauswahlfenster durchklicken. Ich (Nils Kaczenski) habe es probiert: Es klappt tatsächlich (zumindest im Labor).
 
 
Kombination von NETLOGON- und GPO-Skripts
Wenn einem Benutzer in den Konteneigenschaften ein NETLOGON-Logon-Skript zugewiesen wird und gleichzeitig über die GPOs ein Skript aktiv wird, werden beide aufgerufen. Dabei scheint das NETLOGON-Skript stets eine Idee früher aufgerufen zu werden, die Ausführung läuft dann aber parallel (d. h. Befehle aus dem GPO-Skript werden schon ausgeführt, bevor das NETLOGON-Skript abgearbeitet ist). Wann genau was passiert, ist daher nicht vorhersagbar (hängt von der Zeitplanung des lokalen Systems ab). Skripts sollten also ggf. aufeinander abgestimmt werden.
 
Kontenbezogene Skripte (NETLOGON) werden standardmäßig sichtbar, die aus dem GPO standardmäßig unsichtbar ausgeführt. Das führt dazu, dass ein GPO-Skript, das auf eine Eingabe wartet, unsichtbar wartet und ständig einen CMD-Prozess offenhält. Die Sichtbarkeit sowie weitere Einstellungen kann man aber per GPO für beide Typen steuern: Einstellungsmöglichkeiten in der Gruppenrichtlinie unter:

- "Computerkonfiguration / Administrative Vorlagen / System / Anmeldung"
- "Computerkonfiguration / Administrative Vorlagen / System / Gruppenrichtlinien"
- "Benutzerkonfiguration / Administrative Vorlagen / System / Anmeldung/Abmeldung"

Eine weitere interessante Option bietet:

- "Computerkonfiguration / Administrative Vorlagen / System / Scripts"
- "Benutzerkonfiguration / Administrative Vorlagen / System / Scripts"
  "AnmeldeScripts gleichzeitig ausführen"

Die Computerkonfiguration hat bei dieser Richtlinien Vorrang, falls an beiden Stelle eine Einstellung vorgenommen wurde. Bei der Aktivierung dieser Richtlinie werden erst die Scripts komplett zu Ende ausgeführt, bevor die Explorer-Schnittstelle gestartet wird. Dadurch kann gewährleistet werden, daß bestimmte Abhängigkeiten und/oder Netzwerkressourcen zum Zeitpunkt des Desktopaufbaus auf jeden Fall vorhanden sind.
 
Wichtig ist,  unter "Benutzerkonfiguration / Administrative Vorlagen / System" darf die Befehlszeilenaufforderung nicht abgeschaltet sein, weil sonst keine Batchdateien ausgeführt werden können.
 
Will man für Benutzer NETLOGON-Skripts anwenden, wenn sie an einer NT-Station arbeiten und für 2000/XP-Rechner bei denselben Usern die GPO-Technik nutzen, so kann man das NETLOGON-Skript klassisch den Benutzern zuweisen und im Skript selbst testen, welches System der Client ausführt. Ist es ein 2000- oder XP-Rechner, so wird das Skript beendet. Das geht aber nur mit einem Zusatzprogramm (gettype.exe aus dem Resource Kit), das über Errorlevel abgefragt wird.
 
 
 
Anmeldescripte – Beispiele
 
---------------- Benutzer- / Gruppenabfrage, Zuweisung Drucker -------------------
@echo off
rem benötigte Tools: con2prt.exe und ifmember.exe aus dem ResKit
rem da das con2prt immer im freien Download war, kann man es auch unter
rem http://www.gruppenrichtlinien.de/tools/con2prt.exe herunterladen

 
rem [ COMMON, fuer alle Benutzer gueltig ]
 
rem **  Mapping der Laufwerke, die allen zur Verfuegung stehen **
net use m: \\server\freigabe1 /persistent:no
net use n: \\server\freigabe2 /persistent:no
 
rem [ Auswahl, des Sprungziels nach Gruppenzugehoerigkeit ]
 
rem **  Auswahl der Gruppe ueber ifmember.exe, wenn Uebereinstimmung, **
rem **  dann Sprungziel Auswahl **
 
\\SERVER\netlogon\ifmember Verwaltung
if errorlevel 1 goto GR_VERWALTUNG
 
rem ** weitere Abfragen möglich **
rem **  Abgeschlossen wird das Ganze durch ein GOTO END, damit bei keiner Übereinstimmung **
rem **  der Gruppenzugehörigkeit, keine weitere Aktiion durchgeführt wird.
goto END
 
rem [ Sprungziel Verwaltung ]
 
:GR_VERWALTUNG
rem **  Drucker im Buero/Verwaltung, es wird noch kein Standarddrucker zugewiesen **
rem **  innerhalb dieser Gruppe kann widerum nach Benutzernamen oder Computernamen **
rem **  unterschieden werden **
 
rem **  diese Drucker stehen allen Mitgleidern zur Verfügung **
rem **  con2prt Optionen: /c = connect; /cd= connect default; /f = lösche vorhandene
%logonserver%\netlogon\con2prt /c "\\server\HPLaserjet1"
%logonserver%\netlogon\con2prt /c "\\server\HPLaserJet2"
 
rem **  durch den Parameter /i wird nicht in Klein-/Großschreibung unterschieden **
if /i %username%==Dieter.Meier goto Dieter
if /i %username%==Heiner.Geier goto Heiner
 
:DIETER
%logonserver%\netlogon\con2prt /cd "\\server\HPLaserJet3"
%logonserver%\netlogon\con2prt /c "\\server\HPLaserJet4"
goto END
 
: HEINER
%logonserver%\netlogon\con2prt /c "\\server\HPLaserJet3"
%logonserver%\netlogon\con2prt /cd "\\server\HPLaserJet4"
goto END
 
:END
 

---------------- EOF: Benutzer- / Gruppenabfrage, Zuweisung Drucker -------------------
 
 
---------------- Druckerzuweisung per Computername -------------------
@echo off
rem ** benötigtes Tool: con2prt.exe aus dem ResKit, oder dem ZAK
rem ** da das con2prt immer im freien Download war, kann man es auch unter
rem ** http://www.gruppenrichtlinien.de/tools/con2prt.exe herunterladen
rem ** Sortierung der Drucker z.B.: nach Räumen, kann allerdings nur
rem ** funktionieren, wenn für eine einheitliche Namensgebung Sorge getragen wurde
rem ** Beispiel: die Räume heissen: 401, 402, 403,
rem ** die PC´s entspreched 401-01, 401-02 ...402-01, 402-06 etc ...
 
rem ** Allgemeine Hinweise:
rem ** Computernamen ausfindig machen und Drucker wählen:
rem ** mit der Anweisung ":~0,3" werden nur die ersten 3 Zeichen
rem ** der Variable %computername% ausgewertet
 
rem ** Beispiele, COMPUTERNAME = 123456789ABCDE0:
rem ** nur die ersten 5 Zeichen auswerten
rem ** %computername:~0,5% bzw.
rem ** %computername:~,5% geben das Ergebnis "12345"
 
rem ** die ersten 7 Zeichen auslassen, dann die nächsten 5 auswerten
rem ** %computername:~7,5% gibt das Ergebnis "89ABC"
 
rem ** die ersten 7 Zeichen auslassen, dann alle berücksichtigen
rem ** %computername:~7% gibt das Ergebnis "89ABCDEF0"
 
 
rem ** erst mal alle vorh. Drucker löschen, damit keine falschzugeordneten Drucker
rem ** mehr mit den Rechnern verbunden sind
con2prt /f
 
rem ** jetzt die Abfrage nach den Computernamen,
rem ** mit /i wird Groß-/Kleinschreibung ignoriert
if /i %computername:~0,3%==401 goto Drucker1
if /i %computername:~0,3%==402 goto Drucker2
if /i %computername:~0,3%==403 goto Drucker3
 
goto END
 
:Drucker1
rem ** jetzt Standarddrucker für diesen Raum festlegen
con2prt /cd \\server\druckerraum1
goto end
 
:Drucker2
con2prt /cd \\server\druckerraum2
goto end
 
:Drucker3
con2prt /cd \\server\druckerraum3
goto end
 
:end

---------------- EOF: Druckerzuweisung per Computername -------------------

---------------- IP Adresse und Subnetz als Variable setzen -------------------
rem ** Hiermit erstellen wir uns 2 eigene Variablen => %ipadress% und %netid% die dann **
rem ** im weiteren Verlauf des Scriptes zur Abfrage benutzt werden können **
 
for /f "Tokens=2 Delims=[] skip=1" %%i in ('ping -n 1 %computername%') do set IPAdress=%%i
for /f "Tokens=1,2,3 Delims=." %%a in ('echo %IPAdress%') do set NetID=%%a.%%b.%%c

 
---------------- EOF: IP Adresse als Variable setzen -------------------


---------------- OU als Variable setzen -------------------
rem ** Hiermit erstellen wir uns eine eigene Variable => %aktuelleOU% die dann **
rem ** im weiteren Verlauf des Scriptes zur Abfrage benutzt werden kann **
rem ** dsquery.exe ist beim 2003 Server dabei
rem ** gleiche Abfrage liesse sich auch für den Benutzer erstellen.
 
for /f "Tokens=2 Delims=," %%i in ('dsquery computer -name %computername%') do set aktuelleOU=%%i
 

---------------- EOF: OU als Variable setzen -------------------


(c) 2003 - heute, Mark Heitbrink, weitere Informationen unter WebSite-Info\Copyright