Archive for Januar, 2010

Unattended XP Installation

Montag, Januar 25th, 2010

Letzte Woche war an meiner Schule Projektwoche. Heißt traditionell: Ich habe mein Homepageprojekt und versuche im Interesse der Schule Nachwuchswebmaster zu züchten. Nebenbei stirbt die halbe IT Infrastruktur der Schule und man verbringt letztendlich die meiste Zeit damit, irgendwelche Rechner zu reparieren. So auch dieses Jahr.

Montag
Allgemeines Erklären der Homepageadministration, Joomla lebe hoch. Einige Ideen und Umstrukturierungen, aber ansonsten habe ich mich die meiste Zeit um 2 Rechner gekümmert, die aus irgendeinem Grund nicht mehr funktioniert haben – 2 Windows Neuinstallationen.

Dienstag
Bewerbungsgespräch bei InnoGames in Hamburg, ergo nicht da.

Mittwoch
Allgemeines Arbeiten, Seitenverlinkungen, Überarbeitung der Hauptseite, Einbinden des neuen Banners. Nebenbei 2 Windows Neuinstallationen.

Donnerstag
Vor den Homepagesachen erst einmal den letzten Rechner vom Vortag fertig machen, sprich Delphi 7 und Office XP installieren sowie Windows Updates laden. Sekunde, DNS Fehler? Eben den DNS Server geändert – nichts. Am anderen PC probiert – nichts. Als es dann mit nslookup ging kam mir der erste Verdacht… Conficker.B/C blockiert doch die DNS-Auflösung von Microsoft und einigen AV Herstellern. Symantec.com – DNS Fehler. Scheiße.
Nach einer kurzen Validierung auf einigen PCs stellte sich dann recht schnell heraus, dass so ziemlich alle Schul-PCs mit Conficker.B infiziert waren. In Anbetracht der Tatsache, dass fast alle Rechner noch auf XP Service Pack 1 liefen und Automatische Updates überall deaktiviert waren auch kein Wunder. Normalerweise hätte ich jetzt einfach an jedem Rechner das Netzwerkkabel gezogen, den Fix eingespielt und eines der zahlreichen Removal Tools gestartet. Conficker war mir durch Know Your Enemy: Containing Conficker und die Analyse der Uni Bonn recht gut bekannt, was das Beseitigen etwas erleichterte. Das Problem war nur, dass am Wochenende Tag der offenen Tür war und folglich alle paar Sekunden Schüler etwas ausdrucken oder im Internet nachschauen wollten.
Auf einzelnen Rechnern hatte ich die Gelegenheit den Virus zu entfernen – vorerst. Ich hatte vergessen, dass sich Conficker auch auf angeschlossene USB Sticks überträgt und sich dann über den Autostart weiterverbreitet. Ich weiß nicht, wie viele USB-Sticks der Schüler infiziert sind, aber es werden zu diesem Zeitpunkt bereits eine ganze Menge gewesen sein. Es endete dann mit einer Sperrung jeglicher PCs und der Entscheidung, die Situation zu nutzen und eine CD für die unbeaufsichtigte Windows Installation zusammenzustellen. Die CD musste eigentlich nichts komplexes tun:

  • Treiber der Rechner im Kabinett einbinden
  • Firefox installieren
  • Adobe Reader installieren
  • Delphi installieren
  • Office installieren
  • Der Schuldomäne beitreten
  • ggf. den Computernamen setzen

Freitag
Ich hatte mich bisher noch nie mit der Thematik auseinandergesetzt, meine Wahl fiel jedoch recht schnell auf nLite: Ein simples Tool, um Windows Installationen beliebig anzupassen. Programminstallationen sind mit nLite Addons ohne Weiteres möglich, es gibt auch diverse Seiten mit fertigen Addons bekannter Programme. Da diese ganzen Packages jedoch Englisch waren und mich das Thema interessiert habe ich mich dazu entschlossen, die Pakete selber zu packen.
Die benötigten Schritte sind im Wiki von German Unattended sehr gut beschrieben. Nur wie installiert man Programme ohne nervige Dialoge? Gesucht, Gefunden! Ich weiß nicht welche gelangweilte Seele das zusammengestellt hat, aber diese Tabelle enthält für so ziemlich alle bekannten Freeware Programme die Installationsparameter für eine “Silent Installation”. Getestet, funktioniert. Das war doch ein wenig zu einfach…
Es hätte doch Stil, wenn Firefox bereits AdBlock Plus und das Flash Plugin vorinstalliert hätte, oder? Mit 7-Zip kann man den Firefox Installer recht einfach entpacken, die Ordnerstruktur ist recht logisch: non-localized enthält alle sprachneutralen, localized die übersetzten Inhalte. Die NPSWF32.dll von Flash also einfach in den non-localized\plugins Ordner kopiert und die Installation gestartet – Great Success!
AdBlock Plus stellte sich etwas schwieriger heraus – woher bekommt man die benötigten Dateien? Die Installationsseite installiert im Firefox direkt das Addons, im IE bekommt man eine Mitteilung, doch bitte Firefox zu nutzen. Der Quellcode offenbarte jedoch Folgendes:

    <a href="/de/firefox/downloads/latest/1865/addon-1865-latest.xpi?src=addondetail" id="installTrigger74835-6314f9b" title="Adblock Plus zu Firefox hinzufügen" addonName="Adblock Plus" addonIcon="/en-US/firefox/images/addon_icon/1865/1262852260" addonHash="sha256:e691e8230286883726203768bb1d22c9d19ded7165523a298edddc1cb25e886c" jsInstallMethod="browser_app_addon_install" frozen="false" class="button positive significant">

XPI Dateien waren mir bereits von Thunderbird Plugins bekannt. Es handelt sich hier lediglich um Zip Dateien mit anderem Suffix. Ergo mit IE heruntergeladen und entpackt. Der Inhalt:
AdBlock Plus

Die Dateien gehören logischerweise in den extensions Ordner – doch wie muss der Unterordner heißen? Ein Blick in die install.rdf half weiter:

AdBlock Plus

Ein Blick in meinen Firefox Ordner bestätigte die Vermutung – Ordnername gefunden. Die Firefox Installation war also soweit fertig.

Für modifizierte Installationen des Adobe Readers bietet Adobe den Adobe Customization Wizard an. Einziges Problem: Das Tool erwartet als Eingabe einen entpackten Installer. 7-Zip lieferte hier keine brauchbaren Ergebnisse, aber auch hier bot Adobe recht unkompliziert Hilfe in Form eines Knowledge Base Artikels. Der Customization Wizard war soweit unkompliziert zu bedienen und die Einbindung der modifizierten Installation war recht schnell erledigt.

Die ersten Tests mit VMWare verliefen erstaunlich gut – nur leider ließen sich die Firefox Installationen entweder nicht starten oder crashten nach einer halben Sekunde. 5 XP Installationen und gefühlte 20 Tassen Kaffee später habe ich mich dann nach anderen Möglichkeiten umgeschaut. Ein wenig später bin ich dann auch auf einen Artikel gestoßen, der sich auch mit der automatisierten Installation auseinandersetzte, aber einen anderen Ansatz nutzte: RunOnceEx.
Grundlegend wird hierbei während der Installation ein Registry Eintrag erstellt, welcher nach der ersten Anmeldung ein kleines Fenster anzeigt und hinterlegte Befehle ausführt:

Nach einigen Versuchen stellte sich dann heraus, dass diese Methode nicht nur professionell aussieht, sondern auch wunderbar funktioniert. Und der größte Vorteil: Man kann serverseitige Skripte ausführen!
Letztendlich sah das Skript dann so aus:

    @echo off
    SET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
    REG ADD %KEY% /V TITLE /D "Komponenteninstallation" /f

    REG ADD %KEY%\001 /VE /D "XP Support Tools" /f
    REG ADD %KEY%\001 /V 1 /D "%CD%\Installer\WindowsXP-KB838079-SupportTools-ENU.exe"

    echo @echo off > C:\tmp_winrar_reg.bat
    echo copy %CD%\Installer\WinRAR\rarreg.key %ProgramFiles%\WinRAR\ >> C:\tmp_winrar_reg.bat
    echo del C:\tmp_winrar_reg.bat >> C:\tmp_winrar_reg.bat

    REG ADD %KEY%\005 /VE /D "WinRAR" /f
    REG ADD %KEY%\005 /V 1 /D "%CD%\Installer\WinRAR\setup.exe /s"
    REG ADD %KEY%\005 /V 2 /D "C:\tmp_winrar_reg.bat"

    REG ADD %KEY%\010 /VE /D "IrfanView" /f
    REG ADD %KEY%\010 /V 1 /D "%CD%\Installer\IrfanView\setup.exe /silent /folder="%ProgramFiles%\irfanview" /desktop=1 /thumbs=0 /group=1 /allusers=1 /assoc=0"

    REG ADD %KEY%\015 /VE /D "Firefox" /f
    REG ADD %KEY%\015 /V 1 /D "%CD%\Installer\Firefox\Setup.exe -ms"

    echo @echo off > C:\tmp_firefox.bat
    echo xcopy "%CD%\Installer\Firefox\extensions\*.*" "%ProgramFiles%\Mozilla Firefox\extensions" /Y /E >> C:\tmp_firefox.bat
    echo xcopy "%CD%\Installer\Firefox\plugins\*.*" "%ProgramFiles%\Mozilla Firefox\plugins" /Y /E >> C:\tmp_firefox.bat
    echo del C:\tmp_firefox.bat >> C:\tmp_firefox.bat
    REG ADD %KEY%\016 /VE /D "Firefox Erweiterungen" /f
    REG ADD %KEY%\016 /V 2 /D "C:\tmp_firefox.bat"

    REG ADD %KEY%\020 /VE /D "Installationsskripte" /f
    REG ADD %KEY%\020 /V 2 /D "\\w2k3srv\init$\Init_XP.bat"

Für das automatisierte Umbenennen des Rechners habe ich dann so ziemlich die perfekte Lösung auf administrator.de gefunden:

    @echo off
    if exist "C:\init_pcname_done.txt" goto :nothing_to_do

    set mac=none
    for /f "tokens=2 delims=:" %%a in ('ipconfig /all ^| find "Physi"') do set mac=%%a
    IF "%mac%" == "none" goto mac_name_fail
    echo MAC Adresse: %mac%

    set pc=none
    for /f "tokens=2 delims= " %%b in ('type "\\w2k3srv\Init$\Mac.txt" ^|findstr "%mac%"') do set pc=%%b
    IF "%pc%" == "none" goto pc_name_fail
    echo PC Name: %pc%

    REG add "HKLM\SYSTEM\ControlSet001\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f > nul
    REG add "HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f > nul
    REG add "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName /t REG_SZ /d %pc% /f > nul
    REG add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname" /t REG_SZ /d %pc% /f > nul

    echo %pc% > C:\init_pcname_done.txt
    pause
    goto end

    :pc_name_fail
    echo Kein gueltiger PC Name gefunden!
    pause
    exit

    :mac_name_fail
    echo Auslesen der Mac Adresse fehlgeschlagen!
    pause
    exit

    :nothing_to_do
    echo PC Name bereits gesetzt.

    :end

Die Delphi und Office Installationen habe ich dann in die Serverskripte eingefügt, da die XP CD sonst zu groß geworden wäre. Nach einigen Stunden Google und Batch – wer zum Teufel hat sich diese “Sprache” ausgedacht? – hatte ich dann eine Windows XP CD, welche fast komplett unbeaufsichtigt das Betriebssystem einrichtet und die benötigten Programme installiert. Mit 4 Kopien dieser CD war das Neuinstallieren des gesamten Computerkabinetts dann letztendlich nur noch eine Frage der I/O Bandbreite. :-)

Delphi vs C++

Freitag, Januar 15th, 2010

Ich kann programmieren. Ich habe es schließlich im Informatikunterricht gelernt! ;)

Einer der interessantesten Punkte im Informatikunterricht ist zweifelsohne das Programmieren. Einerseits weil es der einzige praktische Teil des Unterrichts ist, andererseits weil sich hier am deutlichsten zeigt, wer mit diesem Fach zurecht kommt. Erstaunlicherweise kommen erstaunlich viele kommen erstaunlich schlecht damit zurecht. Wie dem auch sei – im vergangenen Schuljahr hatte ich also einige Wochen Delphiunterricht. Delphi ist insofern eine interessante Sprache, als der Code relativ benutzerfreundlich (/high level) ist, aber dennoch, anders als .NET und Konsorten,  nativ compiled wird, was wiederum einen gewissen Geschwindigkeitsbonus mit sich bringt. Abgesehen davon hat mich der Syntax bisher stets davon abgeschreckt, mich länger als 90 Minuten mit dieser Sprache zu beschäftigen.

Als abschließende Projektarbeit des Informatikunterrichts haben wir nun 17 Unterrichtsstunden Zeit, um in kleinen Teams eigene Programme zu entwickeln. Da ich eine Abiturprüfung in Informatik schreiben werde bin ich laut Lehrplan dazu verpflichtet Delphi (als die im Unterricht erlernte Sprache) zu nutzen. Da ich weiterhin durch meine Programmiererfahrung entweder mein Team überfordern würde oder selber unterfordert wäre, muss ich mein Programm allein entwickeln. Ich bin einfach mal auf den Zug aufgesprungen und habe mir vorgenommen, ein kleines Jump ‘n ‘Run ala Mario zu schreiben. Meine bisherigen Erkenntnisse:

  • Jede Sprache ist irgendwo gleich. Das heißt nicht, dass einem permanentes Googeln erspart bleibt – insbesondere beim Delphi Syntax. Wer auch immer diesen entworfen hat – ich würde ihm am liebsten einen großen, rohen Fisch ins Gesicht klatschen. :) Ein then nach dem If ist ja noch okay – aber wenn man geschweifte Klammern gewohnt ist, beginnt man relativ schnell begin .. end; zu hassen. Das Verketten von Bedingungen benötigt zwingend Klammern und die Regeln für das Setzen von Semikolons sind einfach nur wirsch.
      If (a = b) and (c = 0) then
      begin
      // mach was
      end;

    Meine bisherigen Entdeckungen zu Semikolonsetzung:

    • Grundsätzlich gilt: Nach jeder Zeile ein Semikolon.
    • Vor einem end ist das Semikolon optional
    • Vor einem else ist das Semikolon verboten
    • Es scheint sich wohl tatsächlich jemand etwas dabei gedacht zu haben
  • Virtuelle Funktionen werden nicht nur in der Basisklasse als virtual; deklariert – abgeleitete Klassen müssen die Überschreibung mit einem override; noch einmal explizit angeben.
      type
      TKnaller = class
      public
      procedure Zuenden; virtual;
      end;

      TBombe = class(TKnaller)
      public
      procedure Zuenden; override;
      end;

    Ansich keine schlechte Eigenschaft – sie macht immerhin deutlich, dass diese Funktion eine andere überschreibt. Dieses Stichwort zu finden hat jedoch eine Weile gedauert – Delphi-Coder beschreiben Virtual Calls offenbar ganz gerne ein wenig anders – auch wenn meines Wissens auch Delphi eine vtable benutzt.

  • Ich bin mittlerweile Visual Studio 2010 gewohnt. Die Delphi 7 IDE erinnert mich ein wenig an Visual Basic 6. Wer die beiden IDEs kennt, ist sich des Unterschiedes bewusst. Mir fehlt bei der Delphi IDE eine intuitive Übersicht über das Projekt. Es gibt zwar Code Tabs, aber sobald man das Fenster aus Versehen schließt ist irgendwie das halbe Projekt geschlossen. IntelliSense, welchen Namen es bei Delphi auch immer trägt, funktioniert hingegen erstaunlich gut – nur durch Neustart zu behebende Arbeitsverweigerungen hatte ich bisher noch nie. Trotzdem ist es kein Vergleich zum Arbeiten unter Visual Studio.
  • Was ich von anderen Informatiklehrern gehört habe, trifft leider nicht auf meine Schule zu. Einer der Lehrer behandelt das Programmieren grundsätzlich nur theoretisch, da er es selber nicht kann, die anderen kommen damit zurecht, sind aber dennoch in keinster Weise mit den technikbegeisterten, leicht “freakigen” Informatiklehrern vergleichbar, wie sie an anderen Schulen zu finden sind. :( Oder anders formuliert: Wenn ich im Unterricht eine Frage zu Delphi habe, sollte ich lieber gleich googeln.
  • Ich fühle  mich permanent dazu verleitet, gewisse Algorithmen in C zu schreiben und als DLL zu nutzen. Insbesondere wenn ich im IntelliSense ein HBITMAP sehe, schlägt mein WinAPI-Herz höher. Ach dürft ich doch nur…

Kurz gesagt: Delphi ist zwar nicht so schlimm wie erwartet, aber für die tagtägliche Programmierung möchte ich es trotzdem nicht benutzen.

Erkenntnisse während der Harmony Entwicklung

Freitag, Januar 8th, 2010
  • Kaffee ist flüssiges Gold
  • PE ist simpel, aber trotzdem für die Tonne
  • Multithreaded Programmieren ist bequem, aber tippintensiv
  • Unaufmerksamkeit beim Multithreading ist fatal
  • Visual Studio 2008 und 2010 generieren inkompatiblen Code
  • Wenn man sich nicht einmal mehr auf den this Zeiger verlassen kann, sollte man über das Programmdesign nachdenken
  • Parallelisiertes Compilen wirkt sich direkt auf den Nervenverschleiß aus (VS: /MP8)

Die Entwicklung von Harmony schreitet recht zügig voran. Nachdem das Screenshotmodul fertiggestellt ist habe ich meine Aufmerksamkeit dem Window Manager zugewandt.
Zwei Bilder sagen wie immer mehr als 2000 Zeilen C++: