Entries tagged skript

Windows 8 Log-Out Bildschirm bleibt aufgrund eines Abmeldeskripts hängen

Posted on 26. Februar 2014 Comments

Um sicher zu gehen, dass die Benutzer ihre USB Sticks nicht vergessen haben wir ein Skript entworfen, das prüft, ob noch ein USB Stick, Speicherkarten oder DVDs im PC stecken. Dieses ruft dann eine .hta Datei(ist historisch halt so gewachsen..) auf, die den Benutzer auffordert, den USB Stick doch bitte mitzunehmen. Das klappte auch wunderbar unter Windows XP und Windows 7.

Seit die neuen PCs mit einer SSD und Windows 8 ausgestattet sind, ist der violette LogOut Screen so schnell da, dass man diese Meldung nicht mehr sehen kann. Da das Skript aber auf eine Benutzereingabe wartet, hängt nun der ganze PC beim Herunterfahren. Nun habe ich diverse Dinge versucht, inklusive Tasks, die beim Herunterfahren ausgeführt werden etc. Nichts hat geholfen. Dann bin ich auf den folgenden Tipp gestoßen. Man muss Windows nur sagen, dass die Skripte über den Log-Out angezeigt werden sollen.

Dies kann man ebenfalls im Editor für lokale Gruppenrichtlinien machen (gpedit.msc). Dazu klickt man auf Benutzerkonfiguration/Administrative Vorlagen/System/Skripts und wählt dann den Punkt Anweisungen in Abmeldeskripts während des Abmeldens anzeigen aus. Der Haken ist standardmässig bei nicht konfiguriert gesetzt. Setzt man ihn auf aktiviert funktioniert es.

device-test-anzeigen

Simple MRBS Output from Database

Posted on 17. September 2013 Comments

I wrote a little PHP-script that extracts the most important and current data from MRBS’s MySQL database and just prints them in a simple HTML file. Its not pretty but good for bandwith and clarity. We use it to display information on an energy efficient e-ink screen in front of conference/computer rooms.

$date is set like this:

$date = date("Y-m-d");

The SELECT-statements go like this, where N is the ID of the room(in the database, not what you might call it)

SELECT name,description,from_unixtime(start_time),from_unixtime(end_time) FROM mrbs_entry WHERE from_unixtime(start_time) LIKE '%" . $date . "%' AND room_id = N;

I’m not gonna explain here how to establish a database connection in PHP, but you can have a  look at the whole sourcecode at github 😉

I then cut off the date with substr() because it’s always 10 characters in front of time->(YYYY-MM-DD) and printed it via echo. This is the simple version, there is a version with tables on github.

while($row=mysql_fetch_row($qry01)) {
echo "- <strong>Room</strong> 01 | <strong>Desc:</strong>" . $row[0]." - ".$row[1]." |  <strong>Time:</strong> ". substr($row[2],10) . " - " . substr($row[3],10) . " <br />";
}

update: I wrote another version that prints JSON objects which can be parsed on the other side. For easier parsing(e.g. if everything is in one String) I numbered them:

$jsonarray = array('begin' . $i => substr($row[2],11, 5), 'end' . $i => substr($row[3],11,5), 'name' . $i => $row['name'], 'description' . $i =>  $row['description']);

You’ll find the whole thing on github.

Automatisches Ausloggen im Kiosk Modus bei Inaktivitaet mithilfe von xscreensaver

Posted on 11. April 2013 Comments

Das Problem bei Rechnern im Kiosk Modus ist, dass die Benutzer sich manchmal nicht ausloggen und so prinzipiell jeder, der sich als nächstes an den Rechner setzt einfach diverse Accounts übernehmen kann, weil z.B. die Cookies noch vorhanden sind. Dieser Artikel basiert auf dem vorherigen Raspberry Pi als Kiosk mit resourcenschonendem Browser und VESA Mount. Da dieser Brower sich neu startet, wenn der Prozess mit 5 Sekunden Pause nicht läuft, kann man ihn einfach killen.

Zur Messen der Inaktivität haben sich die Leute vom xscreensaver-Projekt schon genug Gedanken gemacht, also möchte ich das hier nutzen, statt etwas eigenes zu schrieben oder timeoutd zu nutzen. Die Timeout Zeit setzt man in ~/.xscreensaver.

In den man-pages von xscreensaver-command findet man folgendes Perl-Skript. Ich habe es ein bisschen meinen Anforderungen angepasst. Perl muss natürlich vorher installiert werden.

sudo apt-get install perl

Es piped in der Variable IN den Befehl xscreensaver-command -watch, welcher den xscreensaver beobachtet. Sollte dort nun also die Meldung BLANK(Bildschirmschoner geht an) oder LOCK(Bildschirmschoner lockt) auftauchen(passiert nach der eben definierten Zeit), dann deaktiviert er ihn sofort wieder, killt den Browser und setzt ein flag. Das wiederrum löst UNBLANK aus(Bildschirmschoner geht aus) und das flag wird zurückgesetzt, da er sonst im nächsten Schleifendurchlauf sofort wieder den Browser killen würde. Durch das Skript aus dem eben genannten Artikel prüft der Rechner sowieso, ob der Browser läuft und wenn nicht, startet den Prozess. Damit wird nach spätestens 5 Sekunden der Browser neu gestartet und man muss ihn hier nicht starten. Die Datei habe ich xscreensaver-command.pl genannt, nach /usr/local/bin geschoben und in den Autostart in .xsession eingetragen.

Code (Download)

 

my $blanked = 0;
open (IN, "xscreensaver-command -watch  |");
while(<IN>) {
        if (m/^(BLANK|LOCK)/) {
                if (!$blanked) {
                        # Schliesse Browser
                        # Starte Browser neu
                        print "Deaktiviere xscreensaver...\n";
                        system "xscreensaver-command -deactivate";
                        print "Beende Browser...\n";
                        system "killall browser-repat";
                        print "In 5 Sekunden wird der Browser neu gestartet";
                        $blanked = 1;
                 }
        } elsif (m/^UNBLANK/) {
                $blanked = 0;
        }
}

MAC-Adresse per Skript aus ifconfig

Posted on 9. Februar 2012 Comments

Soweit ich weiß, gibt es unter Linux keinen Befehl oder eine Datei in der die MAC-Adresse steht, nur ifconfig. Für die weitere Verwendung ist das natürlich unpraktisch und so habe ich hier eben ein bisschen was mit grep und regular expressions zusammengeskriptet/kopiert:

#!/bin/bash
ifconfig |grep $1 | grep -m 1 -Eo '[[:alnum:]][[:alnum:]](:[[:alnum:]][[:alnum:]]){5}'

Das am besten unter der Datei grepMacAdr speichern, noch schnell mit

chhmod +x  grepMacAdr

ausführtbar machen, dann erfolgt der Aufruf mit

./grepMacAdr eth0

eth0 ist hier das Netzwerkgerät. Wenn das bekannt ist kann auch direkt im Skript $1(=erster Parameter) durch die entsprechende Bezeichnung geändert werden.

Zur Erklärung: ifconfig ruft den Befehl auf, der alle Netzwerkgeräte samt Konfiguration ausgibt, von denen schneidet das Tool grep nur den Abschnitt heraus, der das übergebene Netzwerkgerät behandelt(bzw. die erste Zeile, da steht die MAC-Adresse im allgemeinen) und davon wiederrum wird mit einer Regular Expression(-E) dann nach dem Muster XX:XX:XX:XX:XX gesucht. Falls, was mit dem ersten grep falsch gelaufen ist, wird nur das erste ausgeben(-m 1). Ausgegeben wird dabei nur der Teil, der das Muster einhält, nicht die ganze Zeile(-o)

Ihr findet das Skript auch als fertige Datei hier.

Standarddrucker von anderen Benutzern aendern

Posted on 12. September 2011 Comments

Drucker von anderen Usern zu ändern ist ja garnicht mal das Problem, man muss sich halt nur bei jedem User einzeln anmelden und den Drucker per Hand umstellen. Per Skript gibt es 2 Möglichkeiten: über rundll32 oder über die Registry.

1. rundll32-Methode (Danke an daedalus von administrator.de)

rundll32 printui.dll,PrintUIEntry /y /n "Druckername"

Einfach diesen Befehl in eine Textdatei schreiben und als .bat speichern. Das /n ist der Parameter für den Namen, der danach folgen muss, das /y heisst, dieser Drucker soll als Standarddrucker gesetzt werden. Das ist meiner Meinung nach die einfacherere Methode. Wenn der Druckername keine Leerzeichen enthält, können die Anführungszeichen auch weggelassen werden.

2. Registry-Methode (Danke an Micheal von Windows FAQ)

Da ist natürlich noch viel umständlicher ist in der Registry rumzupulen als den Drucker mal eben anzuklicken, kann man ein .reg-Skript schreiben dass den folgenden Inhalt hat:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Sofrware\Microsoft\Windows NT\CurrentVersion\Windows]"Device"="Standarddrucker,winspool,lpt01:"

Dabei steht der erste Wert für den Druckernamen, winspool ist die dll die für das Drucken zuständig ist und dann der Anschluss, wobei LPT: für Lokale und Ne: für Netzwerkdrucker und Software Drucker(z.B. PDF Generator) verwendet wird.

Um jetzt vom Adminstrator aus die Drucker zu ändern, kann man per runas die eben genannten Skripte starten, s. auch

runas /?

Aufrufe:

runas /user:username "C:\pfad\rundllskript.bat"

bzw.

runas /user:username "C:\pfad\registryskript.reg"

Ein Problem ergibt sich, wenn der User kein Passwort hat, da runas standardmässig, ausser bei Windows 2000, keine leeren Passwörter akzeptiert. Wenn man allerdings den Registry-Eintrag LimitBlankPasswordUse im Ordner HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa aus 0 ändert, ist auch das kein Problem mehr.(Tip aus der c’t 1/06)

Cronjobs von selbst wieder anstellen

Posted on 11. Mai 2011 Comments

Das Problem war ganz einfach, manuell dürfen einige wenige Berechtigte aus guten Gründen Cronjobs abstellen. Damit aber am nächsten Tag der Cronjob wieder läuft braucht man ein (nicht-abstellbaren) Cron Jobs, der alle anderen Cronjobs wieder anstellt. Glücklicherweise gibt es da die Schnittstelle Config::Crontab und so sind dies nur ein paar Zeilen(via CPAN bzw. man Config::Crontab):

#!/usr/bin/perl
use Config::Crontab;
my $ct = new Config::Crontab;
$ct->read; # alle crons auslesen a.k.a. crontab -l
$_->active(1) for $ct->select(-command_re => '/usr/local/bin/command'); # zeile vervielfachen fuer andere befehle
$ct->write; # alle crontabs schreiben, nicht vergessen!

Der gewünschte, nun wieder aktive Befehl ist /usr/local/bin/command.