Problem
Wegen Updates oder ähnlichem ist es nötig, zu unterschiedlichen Zeitpunkten die Nutzer über Neuerungen zu informieren. Dieses geschieht häufiger. wie kann ich diese Neuigkeiten den Nutzern anzeigen, wenn sie sich einloggen? Allerdings nicht jedes Mal, sondern nur einmalig (Nutzer sind ja bekanntlich auch mündig).
Lösung
Entweder eine txt-Datei per Eintrag in der Registry unter HKCU/Software/Microsoft/Windows/CurrentVersion/RunOnce anzeigen lassen (bspw. ’notepad.exe „C:\nachricht.txt“‚). Nachteil: ich muss dies bei jedem Nutzer eintragen. Über HKLM… in der Registry würde die Nachricht nur dem ersten sich im folgenden einloggenden User angezeigt.
Die Lösung ist ein Batch-Skript. Es wird jedes Mal bei der Anmeldung eines Nutzers ausgeführt und prüft, ob der Nutzer die Nachricht/en schon gelesen hat. Dazu besitzt das Skript eine .ini-Datei, in der es für jeden aufrufenden Nutzer einen Eintrag der Form USERNAME:ZAHL hinterlegt. Die Zahl steht dabei für die Nummer der zuletzt angezeigten Nachricht. Gibt es nun neuere Nachrichten (entsprechend mit höherer Nummer), werden diese in der Reihenfolge älter bis aktuell angezeigt. Danach wird der Eintrag in der .ini-Datei aktualisiert.
Beispiel
User1 – Nachricht 1-4 gelesen
User2 – Nachricht 1-3 gelesen
User3 – Nachricht 1-2 gelesen
dann sieht die ini-Datei so aus (Reihenfolge beliebig):
User1:4
User2:3
User3:2
Es gibt vier Update-Nachrichten:
nachricht1.txt
nachricht2.txt
nachricht3.txt
nachricht4.txt
Bei Anmeldung müsste User1 nichts angezeigt bekommen, User2 die nachricht4.txt, User3 die nachricht3.txt und nachricht4.txt. Ein neuer User4 kann nun entweder alle Nachrichten oder keine angezeigt bekommen (Skripteinstellung). Danach sähe die ini-Datei wie folgt aus:
User1:4
User2:4
User3:4
User4:4
(Reihenfolge unwichtig)
Neue Nachricht anzeigen
Um eine neue Nachricht anzuzeigen, erzeugt man eine txt-Datei mit dem Namen „nachricht#.txt“, wobei # für die letzte Nachrichtennummer plus 1 steht. Hier schreibt man alles rein, was man mitteilen möchte. Nun öffnet man die Skriptdatei und setzt die Variable „nachrichten“ auf den neuen aktuellen Wert (vielleicht kann das ja jemand automatisieren?). Ist das Skript eingebunden, bekommt nun jeder die aktuelle Nachricht EINMAL zu sehen. Personen, die auch vorherige Nachrichten noch nicht angezeigt bekommen haben, bekommen auch diese noch angezeigt. Wenn man Nachrichten wiederholen möchte, kann man einfach die Zahlen in der inidatei verändern.
Werden Nachrichten-Dateien gelöscht, so wird der Anzeigeaufruf nicht gestartet, und Fehlermeldungen werden vermieden (siehe Quelltext). Man kann also getrost alte Nachrichten löschen.
Aufpassen
Mit den Rechten (Sicherheit!) muß aufgepasst werden. Die Nachrichten und das Skript müssen lesbar und ausführbar sein, sollten aber schreib- und löschgeschützt werden. Die inidatei und die tmpdatei brauchen leider Vollzugriff (auf löschen kann verzichtet werden). Dieses kann vielleicht noch geändert werden, bedeutet aber im schlimmsten Fall auch nur, dass man die Datei löscht und alle Nachrichten noch einmal angezeigt werden.
Einbinden des Skriptes (Windows 2000)
Im Skript müssen absolute Pfade vorkommen! Als Beispiel: Unter c:\ den Ordner „msg“ erzeugen. Schreib-/und Löschrechte müssen für normale Nutzer entfernt werden (in den Sicherheitseinstellungen des Ordners – logisch). Dort das Skript und die Nachrichten hinkopieren. Die .ini-Datei muß an einem Ort liegen, auf den der Nutzer Vollzugriff hat, da Dateien erzeugt und kopiert werden. Dies kann ein eigener Ordner sein, bspw unter C:\msg\ini\. Diesem dann alle Rechte bis auf „löschen“ geben (Ordner: rechte Maustaste -> Eigenschaften -> Sicherheitseinstellungen, erweitert).
Das Skript wird für die Nutzer eingebunden, in dem man unter Zuhilfenahme von regedit.exe (in Start->Ausführen einfach „regedit“ eingeben) einen Registry-wert ändert. Hier zum Schlüssel HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunOnce gehen, eine neue Zeichenfolge erstellen, dieser einen beliebigen Namen geben und als Wert den absoluten Pfad zum Skript eingeben (hier: C:\msg\skript.bat). Nun sollte es funktionieren.
Verwendung
Für den Ablauf der Verwendung: In dem Skript sollte jeweils die letzte Nachrichtennummer eingetragen werden, also bei einer neuen Nachricht auch die letzte Nummer eintragen (siehe Quelltext). Den Quelltext einfach in eine txt-Datei kopieren und in „skript.bat“ umbenennen. Alles kann durch einen normalen Doppelklick auf die Skriptdatei vor dem automatisierten Einbinden getestet werden. Diese bitte auch als einfacher User testen, damit man sieht, ob die Rechte richtig gesetzt sind!
Quelltext
REM REM Dies ist ein Programm zum Anzeigen von Nachrichten für die einzelnen REM Nutzer des Rechners. Nachrichten können unter den Namen nachricht#.txt REM im selben Ordner wie das Skript abgelegt werden. Es werden die jeweils REM noch nicht angezeigten Nachrichten je Nutzer aufgerufen und angezeigt. REM Die letzte (aktuelle) Nachrichtennr. muss im Skript eingetragen werden! REM @echo off REM Ausgabe am Bildschirm ausschalten REM REM Variableneinstellungen wie Speicherdatei und bestimmte Zahlen REM Hierunter fällt die Anzahl der aktuellen nachrichten auf!!!! REM set /a nachrichten=1 REM immer an die aktuelle Nachricht anpassen!!!! REM ------------------------------------------------------------------------- REM Ab hier nichts ändern!!! REM ------------------------------------------------------------------------- set msgname=nachricht REM wie werden die Nachrichten-Dateien benannt REM (hier "nachricht#.txt") set inidatei=msg.ini REM Wo liegt die ini-Datei (Achtung, Schreib- REM und Lesezugriff für alle notwendig set tmpfile=temp.txt REM wie bei inidatei set nachrichtenpfad=C:\msg REM wo liegen die Nachrichten set inipfad=C:\ REM wo die inidatei set /a Zahl=0 REM Startwert zum Prüfen der NAchrichtennummern REM Folgend: Schleife, die folgendes macht: Mit find einträge des aktuellen REM Users suchen. Die zeilen jeweils am ":" trennen (delims=:) und die REM zweite Hälfte behalten (tokens=2), also die zuletzt angezeigte Nachrichtennr. REM Diese Nummer wird in "Zahl" gespeichert. for /F "tokens=2 delims=:" %%i in ('find /i "%USERNAME%" %inipfad%%inidatei%') Do set Zahl=%%i REM Wenn die ausgelesene Nachrichtennr. kleiner ist als die aktuelle (ACHTUNG: REM immer die aktuelle Anzahl oben unter nachrichten=## eintragen!) spring zu REM dem Code, der die Nachrichten anzeigt..., sonst gehe zum Ende if %Zahl% LSS %nachrichten% goto READ goto ENDE :READ REM Die folgende Zeile würde bewirken, dass "neue" User (User die nicht in der REM inidatei stehen) die alten Nachrichten nicht angezeigt bekommen. REM wenn das gewünscht ist, folgende Zeile "entkommentieren" durch Entfernen REM von "REM" REM if %Zahl%==0 goto NICHTANZEIGEN REM die nächste Nachricht nach der zuletzt angezeigten auswählen set /a Zahl=%Zahl%+1 REM In der Folgeschleife wird eine Zahlenreihe durchlaufen von der letzten REM Nachrichtennr. die der Nutzer noch nicht gelesen hat, bis zur aktuellen. REM Es wird mit der aktuellen angefangen, damit die Notepad-Fenster so über- REM einander liegen, dass die aktuellste Nachricht zuunterst angezeigt wird REM (also die richtige zeitliche Reihenfolge eingehalten wird). REM Für jede Zahl in der Forschleife prüfe, ob die Nachricht existiert (if exist) REM Wenn ja, zeige sie mit Notepad an... REM der Eintrag & trennt zwei Befehle voneinander ab, die in einer Zeile geschrieben REM sind. Der dir-Befehl wird ins Nirvana geleitet. Er bewirkt nur eine leichte REM Verzögerung, so dass Notepad die Nachrichten in der richtigen Reihenfolge öffnet. REM Sonst können unterschiedliche Ladezeiten der Dateien zu einer nicht gewollten REM Anzeigeordnung führen. for /L %%i IN (%nachrichten%,-1,%Zahl%) DO if exist "%nachrichtenpfad%\%msgname%%%i.txt" start notepad.exe "%nachrichtenpfad%\%msgname%%%i.txt" & dir>>NUL REM Rufe die inidatei auf und leite den Inhalt zum find-Befehl mit Hilfe REM einer Pipe um ("|"). Nun suche alle Einträge AUßER dem aktuellen REM Nutzer (/v) ohne Groß- und kleinschreibung (/i) und schreibe sie (>>) REM in die temporäre Datei. Hier fehlt jetzt der Eintrag für den aktuellen REM Nutzer! type %inipfad%%inidatei% | find /v /i "%USERNAME%">>%inipfad%%tmpfile% REM Füge den aktuellen Nutzer mit der aktuellen Nachrichtennr. hinzu. Echo REM druckt durch ">>" sozusagen in die Datei statt in die Anzeige des DOS- REM Fensters. echo %USERNAME%:%nachrichten%>>%inipfad%%tmpfile% REM Kopiere die temporäre datei über die inidatei und lösche die temp. Datei move %inipfad%%tmpfile% %inipfad%%inidatei% REM gehe zum Ende goto ENDE :NICHTANZEIGEN REM Im Falle, dass neue Nutzer nichts angezeigt bekommen sollten, füge REM einfach den neuen Nutzer zur inidatei hinzu, mit der aktuellen Nach- REM richtennr. echo %USERNAME%:%nachrichten%>>%inipfad%%inidatei% :ENDE REM Für die neugeschriebene Datei setze noch das Attribut "versteckt" ("+h") REM so dass nur Nutzer die Datei sehen können, die dieses angeschaltet haben attrib +h %inipfad%%inidatei%
http://faq-o-matic.net/?p=631