Home > KixTart Scripts, Scripts & Co, Windows & Co > Windows Logon Script mit Kixtart

Windows Logon Script mit Kixtart

Hier mein Kixtart Logon Script für Windows Domänen. Geschrieben in Kixtart, berücksichtigt sind für den Endbenutzer verständliche Fehlermeldungen, eine Begrüßung des Benutzers mit Namen, Hinweisen auf den Helpdesk, Laufwerksmapping, Druckermapping und gruppenbasierte Shares. Zusätzlich für Administratoren spezifische Aktionen, wie WSUS Registry Einstellungen setzen etc., zzgl. ein wenig Humor bei der Begrüssung ;)
Für das Loginscript mit Kixtart hatte ich ja eine Fortsetzung versprochen, die will ich dann auch mal liefern. Im Teil 2 beschäftige ich mich erstmal mit der Dokumentation des Scriptes aus Teil 1, wobei ich ein paar Fehler (die beim kürzen des Scripts entstanden sind) gleich mit ausbügel und einiges ergänze. Wenn jemand also das Script verwenden möchte, nehmt diesen Teil!!!

Ich habe Teil 1 offline genommen um Fehler zu vermeiden, warum sollten inkorrekte Informationen online bleiben?

Ganz zu Anfang habe ich noch eine Zeile aus der Entwicklung des Scriptes stehen, jedoch auskommentiert – das Debugging. Wenn man am Script bastelt und etwas nicht funktioniert, empfiehlt es sich diese Zeile einfach wieder aktiv zu stellen.

?View Code KIXTART
1
;BREAK ON ;*** for testing purpose only - Default is BREAK OFF

Im nächsten Teil habe ich die Gliederung der einzelnen Abschnitte des Loginscripts untergebracht. Angefangen mit ein wenig Obtik und Kommentierung, gefolgt von der Definition wie mein Loginscriptfenster aussehen soll.
SETCONSOLE(“show”) sorgt erstmal dafür das generell etwas angezeigt wird, SETCONSOLE(“maximized”) sorgt für “Vollbild” – allerdings nach “Windows Commandline Definition”, also nur in der Höhe maximiert, in der Breite jedoch auf 80 Zeichen beschränkt.
Über SETTITLE(“Anmeldeskript #### Firmenname #### v1.0″) definiere ich den Fenstertitel, hier kann man sich frei austoben, ich bau immer gern eine Versionnummer des Scripts und den Firmennamen ein.
Zum Schluß folgt die SUB Reihenfolge für die einzelnen zu durchlaufenen Unterabschnitte.

?View Code KIXTART
1
2
3
4
5
6
7
8
9
10
11
12
13
;********************************
;* main
;********************************
SETCONSOLE("show")
SETCONSOLE("maximized")
SETTITLE("Anmeldeskript #### Firmenname #### v1.0")
GOSUB "GREETING"
GOSUB "GET_OS"
GOSUB "DRIVES"
GOTO "END"
;********************************
;* end main
;********************************

SUB Begrüßung
Da ich ein Freund der Höflichkeit bin, begrüßt der Client den sich einloggenden User erstmal. Dafür werden zu Anfang in den Zeilen XX bis XX die Farben gesetzt und zwei Boxen erzeugt, in welchen der User ein paar Grundlegende Informationen zu sich selbst, zum Server und zum Netz findet. Über die kleine Reihe IF-Abfragen wird eine zur Tageszeit passende Begrüssungsfloskel ausgesprochen.
In der unteren Box findet der User die besagten Informationen, inklusive der Kontaktdaten des zuständigen Administrators, für den Fall das es Probleme gibt und der User die Durchwahl des Admins nicht im Kopf hat. Der Befehl AT gefolgt von den Koordinaten eignet sich ausgezeichnet für die Ausgabe der Informationen innerhalb der Boxen, da hier die Position des Textes innerhalb des Fensters sehr schön gesteuert werden kann, Stichwort Haptik!

?View Code KIXTART
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
;********************************
;*** Begrüßung
;********************************
:GREETING
small
Color g+/c+
BOX (3,5,20,73,FULL)
color b/c+
IF @TIME > 00:01:00 AND @TIME < 05:00:00
	AT ( 5,8) "Die Sonne ist noch nichtmal aufgegangen, aber Sie"
		 AT ( 6,8) "@FULLNAME, Sie sind schon da"
ENDIF
IF @TIME > 05:00:00 AND @TIME < 11:00:00
	AT ( 5,8) "Guten Morgen @FULLNAME,"
ENDIF
IF @TIME > 11:00:00 AND @TIME < 14:00:00
	AT ( 5,8) "Guten Tag @FULLNAME,"
ENDIF
IF @TIME > 14:00:00 AND @TIME < 17:00:00
AT ( 5,8) "Guten Nachmittag @FULLNAME,"
ENDIF
IF @TIME > 17:00:00 AND @TIME < 20:00:00
AT ( 5,8) "Guten Abend @FULLNAME,"
ENDIF
IF @TIME > 20:00:00 AND @TIME < 00:01:00
AT ( 5,8) "Es ist sehr spät @FULLNAME,"
ENDIF
		 color n/c+
		 AT ( 8,8) "Sie haben sich soeben am Netzwerk der Firma"
		 AT ( 9,8) "Firmenname angemeldet."
		 AT ( 11,8) "Die aktuelle Uhrzeit: @TIME"
		 AT ( 12,8) "Ihr Benutzername:	 @USERID"
		 AT ( 13,8) "Angemeldet an Server: @LSERVER"
		 AT ( 15,8) "Viel Erfolg und frohes Schaffen."
		 AT (17,8) "Sollte es irgendwelche PC Probleme geben, rufen Sie den"
		 AT (18,8) "PC Support:			  BAfH"
		 AT (19,8) "Telefondurchwahl:	  007"
		 color n/w+
		 AT (21,8) " "
RETURN

SUB GET_OS
In der zweiten Untersektion wird noch etwas für die oben erwähnte Infobox gesammelt, unter anderem Informationen über das auf dem Client verwendete Betriebssystem. Hier findet sich auch noch eine CASE Abfrage in der man bei Bedarf betriebssystemabhängige Operationen starten kann. Ich habe als Muster hier bei allen Betriebssystemen die Variable $ADready befüllt und die Zeitsynchronisation angeworfen, da in einem Active Directory die richtige Uhrzeit (wobei der AD Controller “richtig” definiert) sehr wichtig ist. Nachfolgend werden die gesammelten Informationen in die Infobox eingetragen. Auch hier kommt wieder der AT Befehl zum Einsatz.

?View Code KIXTART
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
;********************************
;*** Betriebssystem abfragen, Flag und ggfls. Time setzen
;********************************
:GET_OS
IF INSTR (@ProductType, "Windows NT Workstation") = 0
		 ? "Sie verwenden Windows NT"
		 $ADready = False
ELSE
		 Color g+/c+
		 BOX (23,5,30,73,FULL)
		 color b/c+
		 SELECT
		 CASE INSTR (@ProductType, "Windows 2000") > 0
				  $ADready = True
				  SETTIME "@lserver"
		 CASE INSTR (@ProductType, "Windows XP") > 0
				  $ADready = True
				  SETTIME "@lserver"
		 CASE INSTR (@ProductType, "Windows Server 2003") > 0
				  $ADready = True
				  SETTIME "@lserver"
		 ENDSELECT
		 IF $ADready = False
			 SETTIME "@lserver"
		 ENDIF
		 AT ( 24,8) "Client Name:	  @HOSTNAME"
		 AT ( 25,8) "Betriebssystem:   @ProductType"
		 AT ( 26,8) "IP Adresse:	   @IPADDRESS0"
		 AT ( 28,8) "Profilpfad:	   @HOMESHR"
		 AT ( 29,8) "Homeverzeichnis:  @HOMEDRIVE\"
		 AT ( 35,8) " "
ENDIF
RETURN

SUB DRIVES
Das mappen der benötigten Laufwerke und Drucker ist wohl mit die wichtigste Aufgabe eines Loginscripts, aber auch der Teil welcher das Script oftmals extrem unübersichtlich werden lässt. Ich habe von daher mir Unterscripte geschrieben, in welchen dann nur die Mappings stehen. An mein Hauptscript muss ich also selten ran.

Die erste Ausnahme bilden die restlichen zwei NT Clients die hier im Netz stehen (bitte nicht hänseln, die Software da will absolut nicht auf 2000 oder XP laufen....). Da die NT basierten Systeme keine UNC Pfade mit Angabe eine Verzeichnisses als Pfad unterstützen, gibt es bei mir spezielle Freigaben für NT, welche nicht auf Beispielsweise \\SERVER\Allgemein\Anträge zeigen, wobei "SERVER" der Name des Servers ist, "Allgemein" für den Namen der Freigabe steht und "Anträge" ein Verzeichnis innerhalb der Freigabe "Allgemein" ist. NT könnte das nicht verstehen, also gibt es für die NT Clients da eine Extrafreigabe, aber eben NUR da! Diese steht in diesem Script dann inder Datei "map_global_nt.kix".
Für alle anderen Betriebssysteme gilt die Datei "map_global.kix". Administratoren brauchen naturgemäß zusätzliche Freigaben, Adminfreigaben - diese werden über die Funktion IF INGROUP("Domain Admins") gemappt, denn wenn der sich einloggende Benutzer in der Gruppe Domain Admins ist, wird über den Befehl CALL "map_admin.kix" die Datei mit den Adminmappings aufgerufen. In den nachfolgenden Zeilen setzte ich zur Sicherheit gleich nochmal die Registryeinstellungen für meinen WSUS Server und starte ein manuelles Reporting an den WSUS. Sehr praktisch, denn so brauch man sich nur auf einem Client einloggen und bekommt darüber schnellstmöglich alle Updates etc. auf den Client. Ganz nebenbei wird die Funktion SHELL "command" zum Aufrufen von Konsolenbefehlen und externen Batches gezeigt ;)

?View Code KIXTART
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
;********************************
;*** Shares &amp;  Co
;********************************
:DRIVES
IF INSTR (@ProductType, "Windows NT Workstation") > 0
         CLS
         IF INGROUP("Domain Users")
             CALL "map_global_nt.kix"
         ENDIF
         ? + @ProductType
ELSE
         IF INGROUP("Domain Users")
             CALL "map_global.kix"
         ENDIF
         IF INGROUP("Domain Admins")
             CALL "map_admin.kix"
             SHELL "regedit /s \\wsus-server\ClientReg\WSUS_Client.reg"
             IF @ERROR = 0
                           Color r+/w+
                           ? "WSUS Registry Eintrag gesetzt, starte Reporting!"
                           SHELL "wuauclt.exe /reportnow"
                           SHELL "wuauclt.exe /detectnow"
                           color n/w+
                  ELSE
                           Color r+/w+
                           ? "ERROR: WSUS Registry Eintrag NICHT gesetzt!"
                           color n/w+
                           sleep 60
                  ENDIF
         ENDIF
         IF INGROUP ("Domain Users")
                  CALL "map_drives.kix"
         ENDIF
ENDIF

SUB END
Beenden muss ich das Script natürlich auch, aber wenn möglich sauber. Also eine kleine extra Sektion zum beenden des Scripts, damit ja nix schief gehen kann.

?View Code KIXTART
1
2
:END
EXIT

Die map_*.kix Dateien
Der Inhalt der Datein für die Laufwerkmappings ist denkbar einfach. Entweder man verwendet über SHELL die normalen Befehle von Windows, oder über USE Q: “\\SERVER1\USERS” beispielsweise den Kixtart Befehl dazu. Für Drucker gilt das entsprechend, Windows befehlt oder

Wenn man noch ein wenig Info an den User aufgeben möchte, was gerade so passiert, kann man dies lesbar über

?View Code KIXTART
1
2
3
4
If ADDPRINTERCONNECTION ("\\"+$PrintServer+"\LaserJetColor") = 0
     ? "Drucker Farblaserdrucker wurde verbunden"
ELSE
     ? "FEHLER beim verbinden vom Farblaserdrucker"

lösen. So kann einem ein User auch gleich am Telefon mitteilen was beim Login nicht geklappt hat und man muss nicht raten, sondern kann sich direkt an die Problembehebung machen.

Wer nun noch bei dieser Gelegenheit alles inventarisieren möchte, kann dies auch tun. Am besten dazu den Artikel auf administrator.de anschaun.

Für weitere Fragen stehe ich gerne zur Verfügung - einfach per Kommentar fragen, ich freue mich über jeden ernstgemeinten Kommentar.

Das ganze Kixtart Logon Script zum download steht in den Weblinks, allerdings ohne die Kommantare in diesem Artikel!

Abschließend noch einige interessante Links zum Thema Kixtart und Logonscripts:

  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks