RunAs für normale Dokumente anwenden

Hannes hat letztens das Tool CPAU vorgestellt, das im Grunde genauso funktioniert, wie das Windows-interne runas-Programm. Wer dessen Funktionalität nicht kennt: Es ist dazu da, um eine Anwendung mit den Rechten eines anderen Benutzers ausführen zu können.

Nun ist bei ihm das Problem aufgetreten, dass es ihm nicht möglich ist, MSP-Dateien auszuführen. Grund hierfür ist, dass es sich bei MSP-Dateien nicht um echte, ausführbare Dateien handelt, sondern um Dokumente - also im Grunde wie Bilddateien.

Wenn ihr sehen wollt, was Windows im Hintergrund macht, wenn ihr ein Dokument doppelt anklickt, könnt ihr folgendes machen:

  1. Drückt die Tastenkombination Windowstaste+R. Es öffnet sich das Ausführen-Fenster.
  2. Gebt in dem Fenster "regedit" ein und drückt Enter. Es öffnet sich der Registry-Editor.

    Ausführen-Dialog

  3. Öffnet unter "Arbeitsplatz" den Baum "HKEY_CLASSES_ROOT". Darunter findet ihr eine Liste aller Dateiendungen.

    HKEY_CLASSES_ROOT

  4. Öffnet nun den Eintrag einer Dateiendung - zum Beispiel ".jpg". Ihr seht ein paar Unterelemente.

    .jpg Knoten

  5. Guckt, ob es den Unterbaum "shell/open/command" gibt. Falls ja, macht weiter mit Punkt 8, falls nein, macht weiter mit Punkt 6.
  6. Klickt den aktuellen Baumeintrag (z.B. ".jpg") an, dieser sollte einen Wert "(Standard)" beinhalten. Der darin gespeicherte Wert ist ein Platzhalter.

    .jpg-(Standard)-Wert

  7. Sucht einen Baumeintrag, der den Namen des Platzhalters entspricht. Die Platzhalter dienen dazu, dass mehrere Dateiendungen sich genau gleich verhalten (z.B. ".jpg" und ".jpeg").

    jpegfile Knoten

  8. Öffnet nun den Unterbaum "shell/open/command". Dieser Knoten bestimmt, was geschehen soll, wenn eine Datei dieses Typs geöffnet werden soll.

    shell/open/command Knoten

  9. Seht euch nun den Wert "(Standard)" an. Dieser beinhaltet den tatsächlich ausgeführten Befehl zu einer Dateiendung (z.B. bei einem Doppelklick). Der Parameter "%1" wird bei der Ausführung mit dem entsprechenden Dateinamen ersetzt. Einige Dateitypen (z.B. MSI-Dateien) können zusätzliche Parameter erhalten. Diese können mit dem Parameter "%*" übergeben werden.

    shell/open/command-(Standard)-Wert

(Für diejenigen unter euch, die gerne experimentieren: Lasst die Finger von dem Knoten "exefile"! Wenn ihr diesen unbedarft ändert, zerschießt ihr euch das ganze System. Um das dann wieder gerade zu biegen, müsst ihr remote den entsprechenden Registry-Hive mounten und den Registry-Eintrag reparieren.)

Nach diesem kleinen Exkurs kommen wir nun zurück zum Thema: Das Problem, weshalb die runas-Programme diese MSP-Datei nicht öffnen können, liegt wahrscheinlich daran, dass sie versuchen, die Datei direkt auszuführen - dabei müssten sie doch erst nachgucken, mit welchem Programm die Datei geöffnet werden muss! Und genau hierfür habe ich ein kleines Programm mit dem Namen "execute" geschrieben: Es macht nicht viel, sondern öffnet eine angegebene Datei einfach anhand des Befehls, der dort in der Registry hinterlegt ist. Dabei ist es egal, ob es sich um ein Programm, ein Bild oder etwas anderes handelt. Den Quelltext des Programms findet ihr hier:
[cc lang="pascal"]program execute;

uses
Windows,
SysUtils,
ShellAPI,
ActiveX;

var
VCOMCode : HRESULT;
VIndex : Integer;
VParameters : String;
VReturnCode : Cardinal;

begin
ExitCode := 0; // application terminated successfully

if (ParamCount > 0) then
begin
VParameters := '';
for VIndex := 2 to ParamCount do
VParameters := VParameters + '"' + ParamStr(VIndex) + '" ';
Delete(VParameters, Length(VParameters), 1); // trim last space character

VCOMCode := CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);
if ((VCOMCode = S_OK) or (VCOMCode = S_FALSE)) then
begin
try
VReturnCode := ShellExecute(0, // hwnd,
'open', // lpOperation,
PAnsiChar(ParamStr(1)), // lpFile,
PAnsiChar(VParameters), // lpParameters,
PAnsiChar(ExtractFilePath(ParamStr(1))), // lpDirectory,
SW_SHOWNORMAL // nShowCmd
);

if (VReturnCode <= 32) then ExitCode := 100 + VReturnCode; // file could not be executed finally CoUninitialize(); end; end else ExitCode := 2; // COM could not be initialized end else ExitCode := 1; // file was not provided end.[/cc] Die Verwendung der Anwendung ist super einfach: Ihr ruft das Programm einfach mit dem Pfad der auszuführenden Datei als ersten Parameter auf - alle weiteren Parameter werden an die Datei als weitere Parameter übergeben. In diesem Beispiel wird z.B. die Kommandozeile mit den Rechten des Administrators aufgerufen, Google angepingt und die Kommandozeile danach offen gehalten: [cc]runas /user:Administrator "execute cmd /K ping \"google.de\""[/cc] Bitte beachtet, dass der gesamte Aufruf mit allen Parametern für das aufgerufene Dokument in einem Parameter an runas übergeben werden muss! Sollte es nötig sein, Anführungungszeichen für die eigentlichen Parameter zu benutzen, so müssen diese mit einem Backslash "escaped" werden. Seht euch den Parameter \"google.de\" als Beispiel an. 😉

Ich hoffe, euch hat dieser kleine Ausflug in die Welt der Dateitypen gefallen und ihr habt ein bisschen was darüber gelernt, wie Windows eure Dateien intern behandelt. 🙂
Update:
Ich sorge nun vor dem Aufrufen noch dafür, dass COM ordentlich initialisiert und danach auch wieder deinitialisiert wird. Man weiß ja nie. 😉

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Aufrufende Grüße, Kenny

P.S.: Wie zu erkennen ist, verwende ich einfach die API-Funktion ShellExecute(). Wer Langeweile hat und sich mit dem Parsen der Befehle herumärgern will, der kann das ganze natürlich auch nach dem oben beschriebenen Schema nachbauen (Action auslesen und über CreateProcess() nachbilden).

Kostenloses PDF-zu-Text-Programm

Nachdem ich vor einiger Zeit verzweifelt versucht habe, aus einer PDF-Datei den darin enthaltenen Text zu extrahieren, wollte ich euch nun einmal zeigen, wie man soetwas relativ einfach selbst realisieren kann.

Auf meiner Suche nach einer Lösung bin ich mehrfach über Implementationen gestoßen, die die gewünschte Funktionalität zwar bieten, aber entweder Geld gekostet hätten oder sich nicht für eine Automation hätten verwenden lassen.

Schlussendlich gelöst wurde es nun in Java unter Zuhilfenahme der Bibliothek PDFBox. Wer mich kennt, weiß, dass ich eigentlich ein Java-Kritiker bin, aber in diesem Fall war es nunmal die einfachste Lösung 😉 .
PDFBox scheint derzeit in ein Apache-Projekt überführt zu werden: es durchläuft gerade den Apache Incubator Prozess - es ist also zu hoffen, dass der Quelltext auch in Zukunft gepflegt werden wird.
Derzeit aktuell ist die Version 0.7.3 - diese scheint jedoch einigen Änderungen unterlaufen zu sein, die nicht vollständig durchdacht wurden. Deshalb empfehle ich vorerst, die Version 0.7.2 weiterzuverwenden.
Aus früheren Erfahrungen weiß ich, dass diese Lösung leider Probleme mit geschützten PDF-Dateien hat - für einfache Dokumente reicht sie jedoch allemal aus. Eventuell ändert sich dies ja, wenn die Bibliothek in Zukunft weiterentwickelt wird.

Kommen wir zur Implementierung: Nachdem ihr ein neues Projekt angelegt und die gerade besprochene Bibliothek zu dem Projekt hinzugefügt habt, müsst ihr zuerst ein paar Klassen importieren. Hier sind, alle, die benötigt werden:

[cc lang="java"]import java.io.File;
import java.io.FileWriter;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.util.PDFTextStripper;[/cc]

Danach benötigt ihr noch die folgende Methode - diese kümmert sich um alles weitere. Vom Einlesen der PDF-Datei, über das Konvertieren bis hin zum Erstellen der Text-Datei ist dort alles enthalten:

[cc lang="java"]private static void ConvertPDF2TXT(String APDFFile,
String ATXTFile) {
File LFile = new File(APDFFile);
if (LFile.isFile()) {
try {
try {
PDDocument LDocument = PDDocument.load(LFile);

FileWriter LWriter = new FileWriter(ATXTFile);
try {
PDFTextStripper LStripper = new PDFTextStripper();
LStripper.setStartPage(1);
LStripper.setEndPage(LDocument.getNumberOfPages());
LStripper.writeText(LDocument, LWriter);
}
finally {
LWriter.close();
}
}
catch(Exception e) {}
}
catch(Exception e) {}
}
}[/cc]

Die Verwendung sollte selbsterklärend sein - der erste Parameter ist der Name der existierenden PDF-Datei, der zweite Parameter ist der Name der zu erzeugenden Text-Datei. Der Ordner, in den die Text-Datei gespeichert werden soll, muss bereits existieren.

Ich hoffe, dass diese Minimallösung für den ein oder anderen hilfreich sein wird. Leider muss mit dem eigenen Programm die gesamte PDFBox-Library mitgeliefert werden - immerhin über 3MB.
Vielleicht findet sich ja jemand, der Lust hat, das ganze soweit zusammenzustellen und alle unnötigen Klassen zu entfernen, damit das Programm in einer einzigen JAR-Datei ausgeliefert werden kann. Falls sich jemand die Arbeit macht, würde ich mich über eine Information darüber freuen - zwecks Verlinkung 😉 .

Bis dahin wünsche ich viel Spaß mit dem eigenen PDF-zu-Text-Programm!
Textliche Grüße, Kenny

WeizenSpr.eu mit neuem Design!

Es ist vollbracht 😀 ! WeizenSpr.eu erblüht im tiefsten Winter mit einem neuen Design. Im Einsatz ist nun das geniale Mainstream-Theme von WooThemes. Diese Gruppe veröffentlicht normalerweise kommerzielle WordPress-Themes, bietet aber hier und da auch ein paar kostenlose an 🙂 !

Über die Änderungen, die ich vorgenommen habe, damit Mainstream so aussieht und funktioniert, wie es das hier tut, werde ich den nächsten Tagen schreiben. Hier und da haben sich nämlich ein paar Bugs eingeschlichen, die man erstmal beseitigen muss, damit das Theme ordentlich arbeitet.
Ich würde mich übrigens sehr über Feedback zum neuen Design freuen. Nette Worte sind gern gesehen, aber vor allem die Kritik würde mich interessieren. Das heißt: Wenn etwas falsch angezeigt wird, etwas von früher fehlt oder etwas schlecht aussieht - sagt einfach Bescheid! Ich gucke mir das ganze dann an. 😉

Zwei Sachen habe ich übrigens selbst schon auf dem Schirm:

  • Das WeizenSpr.eu-Logo muss verbessert werden. Der Kontrast zum Weizenfeld im Hintergrund ist zu gering.
  • Viele Elemente haben derzeit englische Beschriftungen. Ich muss mich also ransetzen und die Language-Datei des Blogs ins Deutsche übersetzen.

Falls euch übrigens das alte Design fehlen sollte: Dank meinem WordPress-Plugin SelTheme habt ihr jederzeit die Möglichkeit, zum alten Design zurück zu kehren 😉 . Folgende Möglichkeiten stehen euch zur Verfügung:

  • WeizenSpr.eu?theme= für das aktuelle WeizenSpr.eu-Design
  • WeizenSpr.eu?theme=kubrick für das alte WeizenSpr.eu-Design
  • WeizenSpr.eu?theme=classic für das uralte WordPress-Design

Und nun viel Spaß mit dem neuen alten WeizenSpr.eu! 😀
Mainstreamige Grüße, Kenny

Berlin bekommt Sekundarschule

Da haben sich die Politiker ja was tolles einfallen lassen: In Berlin wird das Schulsystem reformiert. Statt Haupt-, Gesamt- und Realschule wird es neben dem Gymnasium bald nur noch die Sekundarschule geben.

Wie bisher wechseln Schüler nach der sechsten Klasse in die Sekundarstufe - hier haben sie nun die Wahl zwischen dem Gymnasium - das nach 12 Jahren zum Abitur führt - und der Sekundarschule - die wie die bisherige Gesamtschule funktioniert. Das heißt: Je nach Lernleistung erhalten die Schüler eine unterschiedliche Betreuung und Förderung. Diejenigen, die gute Leistungen erbringen werden theoretischer ausgebildet, die schlechten Schüler hingegen bekommen eine praktischere Ausbildung mit Hinblick auf eine Handwerksausbildung.

Das klingt im ersten Moment alles gut und schön, ich hingegen habe aber meine Zweifel, ob das ganze wirklich so eine gute Idee ist. Ich kann mich noch gut an meine Schulzeit erinnern: Zu Beginn waren wir gut 35 Schüler in einer von vier Klassen der Jahrgangsstufe. Das änderte sich von Jahr zu Jahr - die schlechten Gymnasiasten wurden einfach ausgesiebt und zurück blieben die leistungsstärkeren Schüler. So wie im richtigen Leben: Der schwächste fliegt.

Da sich bei den Gymnasien nichts ändert, wird dort alles beim alten bleiben. Das Problem ist meiner Meinung nach die Sekundarschule, denn dort sammelt sich nun alles an - von Leuten, die lieber 13 Jahre für ihr Abitur aufwenden möchten (statt 12 Jahren), bis hin zu denen, für die die Straße das Zuhause ist; die nicht lernen wollen, schwänzen, sich rumprügeln, besaufen und hier und da auch mal mit der Polizei in Berührung kommen. Auch wenn es hart klingt: Ich bezweifle, dass es sich positiv auf die intellektuelle Neoelite auswirken wird, wenn sie Seite an Seite mit den Arbeitslosen von Morgen die Schulbank drücken wird.

Wenn es bei uns auf dem Schulhof z.B. mal Schlägereien gab, dann waren merkwürdigerweise immer Schüler der benachbarten Real- und/oder Gesamtschule beteiligt. Aber Nachbarschulen wird man bei der Sekundarschule garnicht mehr brauchen: Da sind die entsprechenden Leute (die es nunmal dort geben wird) bereits an Board.

Noch zwei Informationen am Rande: Im Zuge der Umstrukturierung sollen gut 30 weiterführende Schulen geschlossen werden. Zudem dürfte es lustig werden, wenn zu viele schwache Schüler sich bei Gymnasien um eine Aufnahme bewerben wollen, denn laut Planung sollen bis zu 50% der Plätze im Losverfahren verteilt werden.
Na das wird ein Spaß werden, wenn ein erstklassiger Schüler durch ein schlechtes Los dazu gezwungen wird, eine Sekundarschule zu besuchen. Besser kann man ein lernwilliges Kind wohl kaum in seiner Zukunftsplanung behindern.
Sekundäre Grüße, Kenny

Michael Jackson im Sand

Ja, er ist tot. Nein, er wird nicht - wie Jesus oder Elvis - wieder auferstehen. Aber: Er wird vielen wohl in Erinnerung bleiben. Und ich werde jetzt ein bisschen dazu beitragen. 😉

In den Hallen am Borsigturm sah ich vor kurzem eine Sandskulptur, die dem King of Pop gewidget war. In Kooperation mit 104.6 RTL hatte man verschiedene Elemente seines Lebens in Sand gemeißelt: Darunter die Jackson Five, Thriller und die Neverland Ranch.


Michael Jackson Sandskulptur

Auch wenn ich bei Galileo schonmal gesehen habe, wie man solche Skulpturen in etwa herstellt, bin ich doch immer wieder verblüfft, was für filigrane Kunstwerke man mit Sand erschaffen kann. Ich hoffe, dass der nächste Wasserrohrbruch in dem Kaufhaus noch lange auf sich warten lässt. 🙂

Sandige Grüße, Kenny

Seite 58 von 87« Erste...575859...Letzte »