Archiv

Archiv für die Kategorie ‘Windows & Co’

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:

Cisco VPN mit Windows 7 64 Bit und Linux

28. Dezember 2009 1 Kommentar

[aartikel]B0028RBW1Y:left[/aartikel]Der Shrew VPN Client ist genau die Lösung die ich gestern gesucht habe. Mit einem leichtem Schock habe ich bemerkt, das ich mit meinem “altem” Cisco VPN Client und meinem Windows 7 64Bit keine VPN Verbindung aufbauen kann, Cisco unterstützt bei diesem VPN Client auch kein Windows 7 64Bit, nur die x32 Version.

Nach kurzer Suche im Web, ob es nicht evtl. doch eine andere Lösung gibt als ins Büro zu fahren, stieß ich auf den VPN Client von Shrew. Der VPN Client ist kostenlos, kann die Cisco VPN PCF Dateien importieren und funktioniert tadellos auf Windows 7 64Bit, Windows 7 32Bit, Windows XP sowie auf Ubuntu 8.04 LTS (soweit ich es getestet habe).

Shrew Soft VPN Client unter Windows 7

Shrew Soft VPN Client unter Windows 7

Unter Windows 7 64Bit habe ich über 8 Stunden eine durchgängige VPN Sitzung durchgeführt, ohne irgendein Problem. Eine echte Empfehlung!

Weblinks:

PsShutdown – Remote reboot und Shutdown von Windows Systemen

PsShutdown von Sysinternals  – Remote reboot und Shutdown von Windows Systemen
PsShutdown ist mit das einfachste Tools aus der PsTools Box, dabei kann es im Vergleich zu den Windows Bordmitteln schon viel. Mittels PsShutdown kann man Windows basierte remote Systeme leicht herunterfahren, oder rebooten. Hierbei kann man dem Tool auch Authentifizierungsinformationen wie den Benutzernamen, Kennwort und Domäne mitgeben, so das durch PsShutdown es ermöglicht wird, von Domänenfremden Systemen aus einen Reboot oder Shutdown eines Windows Systems einer anderen Domäne zu befehlen, ohne sich auf das System direkt zu verbinden. Dies macht PsShutdown sehr gut für Einsätze im Scripting geeignet!

Auch kann mittels PsShutdown nicht nur ein Rechner “ferngesteuert” werden, hier können beliebig viele Rechner zeitgleich gesteuert werden, sofern die Credentials, also die Logininformationen wie Benutzername, Domäne und Kennwort bei diesen Systemen übereinstimmen.

Kurzfassung der offiziellen Manpage:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Usage: psshutdown [[\\computer[,computer[,..] | @file [-u user [-p psswd]]] -s|-r|-h|-d|-k|-a|-l|-o [-f] [-c] [-t nn|h:m] [-n s] [-v nn] [-e [u|p]:xx:yy] [-m "message"]
-	Displays the supported options.
computer	Perform the command on the remote computer or computers specified. If you omit the computer name the command runs on the local system, and if you specify a wildcard (\\*), the command runs on all computers in the current domain.
@file	Run the command on each computer listed in the text file specified.
-u	Specifies optional user name for login to remote computer.
-p	Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password.
-a	Aborts a shutdown (only possible while a countdown is in progress).
-c	Allows the shutdown to be aborted by the interactive user.
-d	Suspend the computer.
-e	Shutdown reason code.
Specify 'u' for user reason codes and 'p' for planned shutdown reason codes.
xx is the major reason code (must be less than 256).
yy is the minor reason code (must be less than 65536).
-f	Forces all running applications to exit during the shutdown instead of giving them a chance to gracefully save their data.
-h	Hibernate the computer.
-k	Poweroff the computer (reboot if poweroff is not supported).
-l	Lock the computer.
-m	This option lets you specify a message to display to logged-on users when a shutdown countdown commences.
-n	Specifies timeout in seconds connecting to remote computers.
-o	Logoff the console user.
-r	Reboot after shutdown.
-s	Shutdown without power off.
-t	Specifies the countdown in seconds until the shutdown (default: 20 seconds) or the time of shutdown (in 24 hour notation).
-v	Display message for the specified number of seconds before the shutdown. If you omit this parameter the shutdown notification dialog displays and specifying a value of 0 results in no dialog.

Häufige Kommandozeilen, welche ich selbst im Einsatz habe:
(Falls jemand Fehler in den Kommandos findet – Info an mich bitte)

Reboot eines einzelnen Systems innerhalb meiner Domäne

1
psshutdown \\servername -r -t 1

Reboot eines domänenfremden Systems

1
psshutdown \\servername -u domain\username -p password -r -t 1

Reboot eines Terminalservers um 12 Uhr mit Vorwarnung & Vorwarnzeit an die Benutzer (erzwungen)

1
psshutdown \\servername -f -t 12:00 -r -v 900 -m "Reboot um 12:00 Uhr!"

Shutdown einer ganzen Reihe von Systemen (Liste per Textfile)

1
psshutdown @serverliste -r -t 1

Shutdown eines Systems mit Angabe des Grundes für das Eventlog

1
psshutdown \\servername -e p:04:06 -r -t 30

Shutdown aller Rechner in einer Domäne

1
psshutdown \\* -k -f -t 1

Reboot eines Systems mit Abbruchmöglichkeit durch den Benutzer

1
psshutdown \\servername -c -r -t 90

Abbruch des Shutdown eines Systems

1
psshutdown \\servername -a

Weblinks:

Netzwerklastenausgleich-Dienst konnte nicht gestartet werden

Netzwerklastenausgleich-Dienst konnte nicht gestartet werden
Diesen Fehler hatte ich gerade in den letzten Tagen vor der Nase. Allerdings nicht auf einem Windows Server 2000 System, sondern auf einem Windows 2003 Server! Nach dem Systemstart kam die Meldung das ein Dienst nicht gestartet werden konnte, im Ereignisprotokoll stand eben diese Fehlermeldung: “Der Dienst “Netzwerklastenausgleich” wurde aufgrund folgenden Fehlers nicht gestartet”

Ereignis-ID: 7000
Quelle: Dienststeuerungs-Manager
Beschreibung: Der Dienst "Netzwerklastenausgleich" wurde aufgrund folgenden Fehlers nicht gestartet:
Der angegebene Dienst kann nicht gestartet werden. Er ist deaktiviert oder nicht mit aktivierten Geräten verbunden.
"Netzwerklastenausgleich" ist auf diesem Computer nicht installiert.

Dabei ist auf dem Server garkein Netzwerklastenausgleich installiert oder aktiviert! Wenn man nach diesem Problem googelt, stößt man mit etwas Glück auf den unten stehenden Artikel aus der Microsoft Knowledge Database, welcher diese Fehler beschreibt, sich jedoch auf Windows Server 2000 bezieht. Es passt jedoch auf den Windows Server 2003, denn genau dort stritt exakt der gleiche Fehler auf.

Die Lösung besteht darin, das man einfach zwei Registry Einträge löschen muß:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System\WLBS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WLBS

Als .reg Datei schaut der Vorgang dann so aus:

?View Code REGISTRY
1
2
3
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System\WLBS]
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WLBS]

Weblink:
Microsoft Knowledge Database

Silent Installation von IrfanView

28. Oktober 2009 1 Kommentar

Um eine silent (unattended) Installation von IrfanView auszuführen, ist die serienmässige self-extracting EXE Installationsroutine ist der einfachste Weg . Über entsprechende Schalter und Optionen im Aufruf der Installationsroutinevon IrfanView können meist alle gewünschten Optionen eingestellt werden und die ganze Arbeit wird von der Installationsroutine selbst erledigt. Mehr…