Entries filed under Windows

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

Set Window position under Windows 7

Posted on 10. Oktober 2013 Comments

Apparently there is no way of setting/configuring a windows position on the screen. I couldn’t find a place to define X and Y or top and left. There is however  a function, if you write your own application in C++(SetWindowPos). Also deleting [-HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\BagMRU] and the like didn’t work for me, especially since the (current) user, wasn’t allowed to use regedit.

Thanks to paradroid on superuser.com, I found another, reasonably usable solution: Hold down CTRL while clicking on the [X]-button of a window. Windows will then remember the position for the next start.

-.-

Autostart OpenSSH mit Public Keys unter Windows XP und Windows 7 mit cygwin und Userrechten

Posted on 9. August 2013 Comments

Diese YouTube Video hat mir sehr geholfen: Install OpenSSH in Windows 7

Die Rechte waren allerdings schon gesetzt und sie vergisst einen Befehl. Wer sich das nicht alles anhören möchte kann einfach auch die Anleitung(lokale Kopie) befolgen.

update: Es könnte sein, dass /var/empty muss dem root/Administrator gehören muss:

chown Administrator /var/empty

Jetzt gibt es 2 Probleme:

1. Es mangelt an Userrechten zum Starten des Services mit dem User-Account

2. Mit dem vorinstallierten Dienst funktioniert aufgrund fehlender Rechte das PublicKey Verfahren zur Anmeldung nicht.
Die Lösung ist, den Windows Dienst nicht zu verwenden. Dazu lässt sich mit dem Befehl /usr/sbin/sshd -D der SSH-Daemon starten und dann funktionieren auch alle in /home/username/.ssh/authorized_keys eingetragenen Public Keys(Das Verzeichnis muss vorher erstellt werden). Wenn man diesen Schritt vergisst bekommt man ein Permission denied. Natürlich muss man auch noch in /etc/sshd_config die Parameter RSAAuthentication yes und PubkeyAuthentication yes einkommentieren bzw. PasswordAuthentication no
einstellen.

Nun muss man also diesen Befehl irgendwie als Dienst installiert bekommen. Leider muss man den Dienst als Administrator laufen lassen. Dabei helfen die Dateien srvany.exe und instsrv.exe (Alternative, s.u.), die man bei Microsoft findet. Davon ausgehend, dass sich die beiden Dateien in C:\cygwin befinden kann man einen Dienst folgendermaßen installieren:

C:\cygwin\instsrv.exe opensshd c:\cygwin\srvany.exe

Dann habe ich die Datei C:\cygwin\startopensshd.cmd noch erstellt und folgendes reingeschrieben:

C:\cygwin\bin\mintty.exe -e "/usr/sbin/sshd.exe"

mintty ist die Shell von Cygwin, die man bekommt, wenn man auf dem Desktop das Symbol anklickt.

Unter dem Registry-Key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\opensshd findet man erstellt man jetzt den Key Parameters. Dort erstellt man einen String(REG_SZ) mit dem Namen Application. Dieser enthält den Pfad zu C:\cygwin\startopensshd.cmd.

Damit jetzt auch unter User der Service mit Administrator-Rechten gestartet wird, muss man den Service nicht mit dem lokalen Account starten, sondern als Administrator unter der Diensteverwaltung(services.msc im cmd-Fenster) den Administrator eintragen:

opensshd_service_adminkonto

 

Bei Windows 8.1 funktioniert der Ansatz mit instsrv.exe und srvany.exe nicht mehr. Also habe ich den Dienst unter services.msc wieder deinstalliert bzw. deaktiviert.

Danach kann man mit dem NSSM(Non-Sucking Service Manager) dieselbe startopensshd.cmd von oben als Dienst installieren. Vorher muss man die nssm.exe in den gewünschten(z.B. C:\cygwin) Ordner verschieben, weil sie ja von dem Service referenziert wird.

nssm install opensshd

Es öffnet sich ein Fenster, in dem die startopensshd.cmd eingetragen werden kann.

Gerade auf diesem Weg sollte man aber zusehen, dass man ordentliche Updates hinbekommt, sowohl von cygwin als auch von OpenSSH.

update: wenn man die 64-Bit Version installiert funktioniert das auch, allerdings heißt das Verzeichnis dann C:\cygwin64.

Grub installieren ohne Linux mit Wechsel der Startreihenfolge unter Windows

Posted on 9. August 2013 Comments

GRUB ist ein Bootloader, der häufig für Linuxsysteme zum Einsatz kommt. Besonders praktisch ist er für Dual-Boot Systeme, wenn man z.B. noch die Windows Installation für ein paar Programme braucht und sonst auf Linux arbeitet oder auch andersherum, kann man beim Start des Computers auswählen, welches System starten soll. Oder unterschiedliche Linux Distributionen. Oder oder oder…halt auch 2 Windows Installationen. Dafür braucht es allerdings kein Linux, da man GRUB natürlich auch ohne ein Linux läuft.

In diesem Beispiel habe ich erst Windows XP und Windows 7 installiert. Wie das geht, ohne dass die beiden sich in die Quere kommen, habe ich in einem anderen Blog-Eintrag geschrieben. Diese Anleitung geht davon aus, dass XP und 7 bereits installiert sind.

1. Linux Live CD downloaden.

Ich habe Ubuntu genommen, die Live-CD bekommt man auf der Website. Einfach starten und den Live Modus auswählen.

 

2. GRUB 2 deinstallieren

Für dieses Beispiel werde ich GRUB 1/GRUB Legacy verwenden. Es basiert auf einer simplen Textdatei, die übersichtlich und gut editierbar ist.

sudo apt-get remove grub*

3. GRUB 1 installieren

sudo apt-get install grub

4. ext2 Partition erstellen

gparted aus dem Startmenü wählen. Bei der Installation von Windows XP und Windows 7 habe ich so viel Platz gelassen, dass man hinter den beiden Partitionen noch eine z.B. 256MB große Partition erstellen kann, aufgrund der verfügbaren Windows Tools zum Lesen bzw. Schreiben von Linux Partionen nehme ich hier ext2. Ist die Partition erstellt, gebe ich dieser Partition das boot-flag.

 

5. GRUB auf dieser Partition installieren

Erstmal die neu erstellte Partition mounten. Nach Windows XP(/dev/sda1) und Windows 7(/dev/sda2) ist das hier logischerweise /dev/sda3. Gemountet wird sie hier z.B. nach /mnt.

sudo mount /dev/sda3 /mnt

Jetzt kommt die eigentliche Installation, die GRUB in den MBR schreibt und damit Windows 7 dort überschreibt. Das root-directory flag gibt an, wohin GRUB die Dateien schiebt. /dev/sda ist das Gerät(!) auf dem der MBR geschrieben wird, hier also nicht die Partition angeben!

sudo grub-install --root-directory=/mnt /dev/sda

Fertig 🙂 Jetzt muss man nur noch die Datei /mnt/boot/grub/menu.lst erstellen. Man kann sich eine default Variante erstellen mit folgendem Befehl

sudo update-grub

Ihr findet dann in /boot/grub/menu.lst eine Vorlage, die man erstmal 1:1 kopieren kann in /mnt/boot/grub/menu.lst.

Um Windows XP und Windows 7 nebeneinander zu booten muss man wie im letzten Blog Artikel erklärt die hidden Flags setzen. Für Sicherungen, bei denen man ganze Festplatten sichert ist es aber nötig die hidden flags beide zu entfernen. Hierfür habe ich mir einen Dummy Eintrag gebastelt, der an dritter Stelle steht. Den Kernel gibt es natürlich auf meiner Installation nicht und sollte man versuchen diesen Eintrag zu starten gibt er eine Fehlermeldung aus. Beim Start von Windows XP muss man jeweils Windows 7 ausblenden und anders herum. Meine menu.lst sieht(im relevanten Teil)  so aus:

title        WindowsXP
hide        (hd0,1)
unhide        (hd0,0)
root        (hd0,0)
makeactive
savedefault
chainloader    +1

title        Windows7
hide        (hd0,0)
unhide        (hd0,1)
root        (hd0,1)
makeactive
savedefault
chainloader    +1

title        Dummy
unhide        (hd0,0)
unhide        (hd0,1)
root        (hd0,0)
kernel        /boot/memtest86+.bin

 

Natürlich gibt es hier auch die Möglichkeit neue Einträge im GRUB hinzuzufügen. Wenn man die User aussperren möchte, legt man also ein Passwort fest. Dies am besten nicht im Klartext; Grub bietet hier allerdings nur MD5 an.

Benutzt z.B. dieses Perl Skript von mir um euer Passwort lokal in einen MD5 Hash umzuwandeln.

Dann kommt einfach dieser Eintrag hinzu

password --md5 $1$MD5HASH

6. Wechsel zwischen Windows XP und Windows 7 als default Eintrag.

Für das Umschalten zwischen Windows Installationen habe ich 2 Batchdateien erstellt: bootwinxp.bat und bootwin7.bat. Beide befinden sich in C:\Windows\system32, also im PATH. Wie man ext2 zum Schreibenrechten mountet erfahrt ihr in meinem anderen Blog-Eintrag. Ich gehe einfach mal davon aus, dass die eben erstellte GRUB-Partition auf X:\ gemountet ist. Der Einfachheit halber mache ich dort keine komplizierten Textersetzungsbefehle sondern erstelle einfach eine menu.xp und eine menu.7 Datei auf dieser Partition. Diese enthalten entweder einen anderen Wert für default in menu.lst oder eine andere Reihenfolge, d.h. jeweils Windows XP oder Windows 7 steht zuerst in der Datei(default ist standardmässig auf 0). Diese beiden Dateien überschreiben dann mit

COPY X:\boot\grub\menu.xp X:\boot\grub\menu.lst

bzw.

COPY X:\boot\grub\menu.7 X:\boot\grub\menu.lst

in bootxp.bat bzw. boot7.bat einfach nur die aktuelle menu.lst und beim nächsten Bootvorgang wird dann das jeweilige Betriebsystem gebootet. Wenn man mehrere Rechner verwaltet, kann man diese Batch Datei z.B. auch über SSH aufrufen.

Windows PCs mit Linux Server herunterfahren

Posted on 12. April 2013 Comments

Das Hochfahren von PCs ist von jeder Platform aus eigentlich ziemlich einfach. Wenn das BIOS WakeOnLAN unterstützt bzw. überhaupt vorhanden ist(der Raspberry Pi hat z.B. keins), dann kann mit einem beliebigen Programm von jedem Betriebssystem so ein Aufweck-Paket geschickt werden.

Herunterfahren gestaltet sich da schon schwieriger, weil es dort natürlich keinen Standard gibt. Gerade um eine große Menge an Computern runterzufahren ist natürlich so eine Batch Lösung ganz angenehm. Das Problem ist nur, dass wir keine Windows-Server haben. Die meisten laufen unter irgendeiner Art von SuSE. Für einen remote shutdown gibt es das Programm PowerOff von Jorgen Bosman. Das Programm wird nicht mehr weiterentwickelt, funktioniert aber für WindowsXP noch wunderbar. Es gibt sogar eine Online Dokumentation. Wie allgemein bekannt sein dürfte, können Windows Programme unter Linux mit wine ausgeführt werden. Dazu wird allerdings meistens eine GUI gestartet, was sich natürlich in einem Bash-Script, welches z.B. über einen cronjob gestartet wird ziemlich unpraktisch ist. Obwohl das Program auch über Kommandozeile steuerbar ist, öffnet sich trotzdem irgendwie eine GUI. Um das zu vermeiden kann man dann das Programm wineconsole nehmen. Damit es zu keiner Fehlermeldung kommt habe ich in dem Skript, welches den PC-Pool herunterfährt nicht den Standard Display genommen sondern vorher durch ein export DISPLAY:=1 auf einen virtuellen Display umgeleitet. Für den virtuellen Display sorgt das Programm Xvfb. Damit dieses einen Display mit der Nummer 1 startet, gibt man einfach den Befehl Xvfb :1 & ein. Der muss natürlich nur einmal gestartet werden, nicht in jedem Skript neu.
Der Befehl für das Herunterfahren eines PCs mit der IP 192.168.1.10 ist:

wineconsole /usr/local/bin/pwo.exe -quiet poweroff -warn -warntime 1 -msg „Shutdown initiated“ -force -nocancel -password yourPWhere -remote 192.168.1.10

Wie man sieht habe ich die PowerOff Binary in /usr/local/bin verschoben, zeige keine ErrorMessage an, warne nur für 1 Sekunde mit dem Hinweis „Shutdown initiated“, das Abbrechen ist deaktiviert(ist in 1 Sekunde auch quasi unmöglich). Das Herunterfahren ist als Service auf dem entsprechenden Windows-Kisten installiert und braucht ein Passwort(„yourPWhere“). Dahinter dann noch die enstprechende IP-Adresse.

Um die eventuell noch an den Rechnern sitzenden User zu warnen, verwende ich folgenden Befehl:

wineconsole /usr/local/bin/pwo.exe -quiet no_action -warn -warntime 300 -msg “ Dieser Computer wird in 5 Minuten abgeschaltet. Bitte alle Anwendungen schliessen und abmelden! “ -force -nocancel -password yourPWhere -remote 192.168.1.10

Wie man hier sieht, führe ich aufgrund des no_action Schalters nichts direkt aus, sondern warne nur.

Nach ein paar Durchläufen führt das bei mir anscheinend zu irgendeiner Art von Speicherüberlauf, deswegen kill ich den Xvfb-Prozess über einen cronjob einmal am Tag und starte ihn neu.

Nützlich könnte auch dieser Artikel von mir sein, in dem ich beschriebe wie man mit einem einfachen Perl-Skript Cronjobs ein und anschaltet. Am Wochenende sind z.B. bei uns die Computer sowieso aus. Außerdem habe ich schonmal darüber gebloggt, wie man feststellt ob Computer einer bestimmten IP-Range online sind, indem man alle mal anpingt.

Bei Perl unter Windows 7 fehlt Tk und lässt sich nicht über cpan installieren

Posted on 7. Februar 2013 Comments

Die neue Perl Version enthält aus irgendeinem Grund Tk nicht (mehr?) standardmässig. Perl schlägt dann vor Tk mit dem folgendem Befehl nachzuinstallieren:

cpan -i Tk

Das funktioniert aber nicht, weil u.a. keine Compiler und Linuxtools wie make installiert sind. Also werden diese automatisch heruntergeladen. Allerdings schlägt die Installation trotzdem mit dem folgenden Ausgaben fehl:

rc -fo tk.res -r -i . -i mTk\win\rc mTk\win\rc\tk.rc
'rc' is not recognized as an internal or external command,
operable prgram or batch file.
dmake.exe: Error code 129, while making 'tk.res'
dmake.exe: Error code 255, while making 'pTk\libpTk.a'.

Was jedoch wunderbar und schnell funktioniert hat ist der folgende Befehl:

ppm install Tk

Cisco VPN mit Windows 8: Error 442: Failed to enable virtual adapter

Posted on 6. Februar 2013 Comments

Der Cisco-VPN Client in der Version 5.0.0.05.0440 für Windows 8 verursacht bei mir folgendes Problem. Jedes mal wenn ich Username und Passwort eingeben sagt er (auf der Kommandozeile die vpnclient.exe)

Intializing the VPN connection
Contacting the gateway xxx.xxx.xxx.xxx
Authenticating user.
Negotiating security policies
Securing communiation channel
Secure VPN Connection terminated locally by the Client
Reason: Failed to enable Vitual Adapter

bzw. GUI gibt zurück:

Secure VPN Conection terminated locally by the Client
Reason 442: Failed to enable Virtual Adapter
Connection terminated on XYZ

Wobei XYZ für Datum und Länge steht.

Auch wenn diverse Rechenzentren von Universitäten was anderes erzählen… Der Fehler liegt dabei in der Registry und zwar genauer beim Schlüssel DisplayName unter HKEY_LOCAL_MASCHINE\SYSTEM\CurrentControlSet\Serices\CVirtA. Der enthält die Zeichenkette @oem4.inf,%CVirtA_Desc%;, welche man einfach rauslöschen kann. So steht da einfach nur noch Cisco Systems VPN Adapter for 64-bit Windows. Bei der 32-bit Version steht einfach nichts dahinter(also keine 32-bit!)

Um das zu automatisieren kann man .reg-Dateien schreiben in dem man mit regedit den Wert ändert, und dann mit Datei/Exportieren eine .reg-Datei erstellt. Die übernimmt allerdings alle Werte aus dem Unterordner. Mit seinem Lieblingseditor kann man nun einfach die restlichen Einträge aus der Datei löschen, so dass dort nur noch steht:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CVirtA]
"DisplayName"="Cisco Systems VPN Adapter for 64-bit Windows"

oder im Fall von 32-Bit Systemen:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CVirtA]
"DisplayName"="Cisco Systems VPN Adapter"

Hier findet ihr die beiden .reg-Dateien gezippt als Download:

Credits gehen an ITServiceDRoeding für sein YouTube Video.

How to get facebook back online #facebookdown

Posted on 11. Dezember 2012 Comments

Seems like facebook has some kind of DNS-Problem right now(#facebookdown). To fix this enter the facebook IPs in your hosts-file. To get them, have a look at your DNS Cache with a tool like dig(or use the ones I provide below).

 

Linux

repat@laptop:~$ dig facebook.com

; <<>> DiG 9.8.1-P1 <<>> facebook.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11887
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;facebook.com.            IN    A

;; ANSWER SECTION:
facebook.com.        6010    IN    A    69.171.229.16
facebook.com.        6010    IN    A    173.252.100.16
facebook.com.        6010    IN    A    173.252.101.16
facebook.com.        6010    IN    A    66.220.152.16
facebook.com.        6010    IN    A    66.220.158.16
facebook.com.        6010    IN    A    69.171.224.32

 

So just enter this into your /etc/hosts file:

#vi /etc/hosts

66.220.158.16   facebook.com
66.220.158.16   www.facebook.com


Windows
Windows has a similar file, which is located in %SystemRoot%\system32\drivers\etc\hosts. Where %SystemRoot% is your Windows directory, so most likely C:\Windows.

At least in Windows 7 the file is locked by the system, so unless you have notepad++, which doesn’t care about all this, you have to open your explorer, go to C:\Windows\system32\, right-click notepad.exe and select „start with admin rights“(or something like that…). Then click File/open, go to C:\Windows\system32\drivers\etc and select „all files“ on the right side(see screenshot). Then again open the file and enter the following:

66.220.158.16   facebook.com
66.220.158.16   www.facebook.com

 

 

 

 

MacOS

1. Click on the looking glass icon in the top right corner of the screen
2. Type „Terminal“ and press Enter, a new app called „Terminal“ will appear
3. Don’t get confused by it, just follow the steps
4. Copy this text into your clipboard : echo „173.252.101.16 www.facebook.com“ | sudo tee -a /etc/hosts
5. Paste it into the „Terminal“ window and press Enter
6. You will be prompted to enter your password (it will not show up on the screen, don’t worry about it), press Enter again when you finished typing your password.
7. The line „173.252.101.16 www.facebook.com“ will appear on the screen.
8. Done!

Standarddrucker abhaengig vom Standort setzen

Posted on 24. Februar 2012 Comments

Auf der Arbeit sind die PCs fortlaufend beschriftet und die letzten 3 Zeichen ist der Raum, also z.B. PC22-123 ist der 22. PC in Raum 123. Die Räume sind dabei IMMER dreistellig, d.h. in Raum 42 wäre der Raum 042.

Mit einem kleinen Perlskript im Autostart bekommt man seinen gewünschten Drucker anhand des Hostnames:

use Sys::Hostname;
$host = hostname;
chomp($host);
$raumnr=substr($host,length($host)-3,length($host)-1);
print "Host: " . $host . "\n";
print "RaumNr: " . $raumnr . "\n";

if ($raumnr == 123) {
  system('rundll32 printui.dll,PrintUIEntry /y /n "Drucker_Raum_123"');
}
elsif (...)
else {
   print "Computername nicht im richtigen Format";
}

Den Hostname bekommt man vom System über sys::hostname. chomp() entfernt eventuelle newline characters. Mittels substr() bekommt man einen Teilstring zurück, der von der Länge-3 bis Länge -1 geht, also genau die letzten 3 Buchstaben bzw. Zahlen. Hier hat man dann die Raumnummer. Anhand derer wird mit der rundll ein Standarddrucker gesetzt(/y) der in Anführungszeichen hinter /n steht. Damit sich die Anführungszeichen nicht in die Quere kommen, nimmt man für den system() Befehl die einstelligen Hochkommata.