Logo faq-o-matic.net
Logo faq-o-matic.net

Benutzern einmalig Nachrichten anzeigen

von veröffentlicht am5. Februar 2006, 16:04 Uhr Kurzlink und Zitatlink einblenden
Kategorie Kategorie: Batch, Scripting   Translate with Google Translate Translate EN   Die angezeigte Seite drucken
Zuletzt aktualisiert: 8. Juli 2011

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%

© 2005-2020 bei faq-o-matic.net. Alle Rechte an den Texten liegen bei deren Autorinnen und Autoren.

Jede Wiederveröffentlichung der Texte oder von Auszügen daraus - egal ob kommerziell oder nicht - bedarf der ausdrücklichen Genehmigung durch die jeweiligen Urheberinnen oder Urheber.

Das Impressum findet sich unter: http://www.faq-o-matic.net/impressum/

Danke, dass du faq-o-matic.net nutzt. Du hast ein einfaches Blog sehr glücklich gemacht!