Ich habe mir den Spaß erlaubt und ein kleinen IT April Scherz programmiert. Eine simple Fake Fehlermeldung, die etwas nervig sein sollte.
Dazu reicht etwas Code, der das Schließen des Programms verhindert.
Damit werden folgende Wege geblockt: X Button oben rechts, Alt+F4, Rechtsklick in der Taskleiste -> Schließen, Strg+Esc Das Programm sollte nicht nur die Shortcuts überleben sondern sich als Strafe sogar ein weiteres Mal starten.

Hier der Code:

csharp“ line=“1″>
protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true;
Main Main = new Main();
Main.Show();
}

Statt also das Programm zu schließen, wird eine weitere Instanz davon gestartet.

Ich fand auch einen zweiten Code, der das selbe bewerkstelligte. Allerdings versteh ich da nur die Hälfte und habe mich für die einfacheren Zeilen oben entschieden.
Für C# Pros hier noch der Code, vielleicht kann mir ja jemand ne Erläuterung geben und sagen, ob der Code besser wäre und warum.

csharp“ line=“1″>
protected override void WndProc(ref Message m)
{
if (m.Msg != 0x0010)
{
base.WndProc(ref m);
}
else
{
Main Main = new Main();
Main.Show();
}
}

0x0010 ist wahrscheinlich das Kill Signal, dieses wird abgefangen und statt dessen das Programm ein weiteres mal gestartet. Wenn statt dem Kill Signal ein anderer Input kommt wird dieser einfach ausgeführt. Naja hier hänge ich mich weit aus dem Fenster, nur Vermutungen.

Wer mein Programm mal testen möchte, hier ist es:
Aprilscherz

Es gibt 2 Möglichkeiten, das Programm zu beenden. Prozess killen (Prozess beenden oder taskkill) oder eine der empfindlichen Stellen anklicken:

Wo ich jetzt noch Hilfe bräuchte wäre ein globaler Tastaturhook (Kenny?? :D) in C#, um von überall im System Strg+Alt+Entf abzufangen. Oder eine andere Art, den Prozess des Programms vor dem Kill „Prozess beenden“ oder „taskkill“ zu bewahren, wenn das einfacher sein sollte. Hab das leider noch nicht hinbekommen.

Beim Schreiben von Programmen nutzt man fast immer externe Dateien wie zum Beispiel .dll Dateien. Ist das Programm dann als .exe released brauch es die .dll um zu funktionieren.
Es gibt mindestens 3 Möglichkeiten, dieses Problem zu umgehen. Uns interessiert jetzt nur der leichteste und geilste Weg:

ILMerge nennt sich das Microsoft Tool, dass es erlaubt, verschiedene .NET Projektdateien zu einer Datei zusammenzuführen. Das Tool ist kommandozeilenbasiert und kommt daher nur als single .exe. Es gibt zwar GUIs für ILMerge aber die Handhabung ist denkbar einfach. Auch wenn die, im Download beiliegende, Dokumentation das nicht vermuten lässt.

Kopiert ILMerge(.exe), eure Projekt .exe und alle externen Dateien, die integriert werden sollen, in ein Verzeichnis. CMD auf und los:

ilmerge /out:Final.exe Projekt.exe ExternFunctions.dll ExternData.dll

Und schon liegt in dem Verzeichnis eine Final.exe, die allein funktionstüchtig ist. Einfacher gehts gar nicht!

Das neue Benutzerkontensicherheitsprinzip ab Vista kennen ja sicher alle. Wird eine ausführbare Datei oder ein Programm mit einem Klick oder Doppelklick geöffnet, sei es in einem Administratorkonto oder nicht, wird das Programm selbst nicht mit Administratorrechten ausgeführt. Erst wenn man über Rechtsklick -> Als Administrator ausführen nutzt wird das Programm auch wirklich mit Administratorrechten ausgeführt.
Dafür gibt es in Vista und 7 Integrity Level, verschiedene Sicherheitsstufen. Folgende Level existieren:

  • Trusted Installer
  • System (operating system processes)
  • High (administrators)
  • Medium (non-administrators)
  • Low (temporary Internet files)
  • Untrusted

Auf Deutsch nennen sich die Gruppen etwas anders, hier ist von „Niedrige Verbindlichkeitsstufe“, „Mittlere Verbindlichkeitsstufe“ und „Hohe Verbindlichkeitsstufe“ die Rede.
Alle Gruppen eines Benutzers seht ihr mit „whoami /groups“ in der cmd.
Wenn ihr also eure Gruppen anzeigen lasst und da steht (wahrscheinlich ganz am Ende) „Verbindliche Beschriftung\Mittlere Verbindlichkeitsstufe“ dann habt ihr die cmd normal aufgerufen, nicht als Administrator.
Wird ein Programm mit „Rechtsklick -> Als Administrator ausführen“ gestartet gehört es der Gruppe „Hohe Verbindlichkeitsstufe“ an.

Um mit einem Batch Programm auszulesen, ob ein Programm normal oder Als Administrator ausgeführt wurde, helfen folgende Zeilen:

@echo off
whoami /groups | find "S-1-16-12288" > nul
if errorlevel 1 goto noadmin
echo Programm wurde als Administrator gestartet
pause
goto eof
:noadmin
whoami /groups | find "S-1-16-8192" > nul
if errorlevel 0 echo Programm mit normalen Rechten gestartet
pause
goto eof

adminrechte-mit-cmd-auslesen

php-warnungGlobal Translator 1.2.6 (die derzeit aktuellste Version) hat laut Bloggerkollege Kenny, der hinsichtlich Programmierung in meinen Augen ein kompetenter Ansprechpartner ist, einen Fehler im Code. Der Fehler lässt sich in der Errorlog des Servers nachvollziehen, sucht folgende Zeile:

[Datum] [error] [client IP] PHP Warning: <>is_dir(): open_basedir restriction in effect. File (bla.bla) is not within the allowed path(s): (/Pfad/zu/den/httpdocs:/tmp) in wp-content/plugins/global-translator/translator.php on line 1520

In seinem Blogbeitrag zeigt er auch, wie sich dieser Fehler beheben lässt.
Öffnet die translator.php im Global Translator Pluginverzeichnis oder wählt im WordPress Adminbereich bei Plugins -> Editor das Plugin aus.

In Zeile 1535 (vlt. auch 1520) dürfte es etwa so aussehen:
php“>if ($item != ‚.‘ && $item != ‚..‘ && $item != ’stale‘ && !is_dir($item)){

Wenn nicht, sucht einfach in eurem Editor nach !is_dir($item) (Suchfunktion meist Tastenkombi Strg+F).

ändert es folgendermaßen ab:
php“>if ($item != ‚.‘ && $item != ‚..‘ && $item != ’stale‘ && !is_dir($cachedir . ‚/‘ . $item)){

Aus dem letzten && !is_dir($item)) wird also
&& !is_dir($cachedir . ‚/‘ . $item))

Danke Kenny für den Hinweis 🙂

Die Antwort auf die Frage wurde mir natürlich genau in dem Moment zu geschoben, als ich den Artikel veröffentlicht hatte.
Die Lösung steht hier und ist erschreckend simpel.
„for“ als delimiter einfach ein Tab übergeben, wieso ich da nicht drauf gekommen bin…

for /f "tokens=2* delims=	 " %%a in ('reg query "HKLM\SOFTWARE\SPSS\SPSS for Windows German\15.0\Setup" /v Directory') do set pfad=%%b

So einfach ist es.
Weiterlesen

dateidatum-per-batch-auslesen
Um per Batch herauszufinden, wann eine Datei erstellt, das letzte Mal geöffnet oder geändert wurde, folgende Befehle:

Letzte Änderung:

for /f "delims= " %%a in ('dir c:\spss15\*.exe^|findstr /i /l "spsswin.exe"') do echo %%a

Anderes Beispiel: auf der Suche nach der letzten Änderung von test.bat

for /f "delims= " %%a in ('dir p:\fad\*.bat^|findstr /i /l "test"') do echo %%a

Auch möglich wären:

('dir p:\fad\*.*^|findstr /i /l "test.bat"')
('dir p:\fad\*.bat^|findstr /i /l "test.bat"')
('dir p:\fad\^|findstr /i /l "test"')

Wenn das Ergebnis von „dir“ in Kombination mit „findstr“ mehr als 1 Ergebnis liefert dann spielt mit diesen Variationen um nur die gewollte Datei zu finden.
Ihr könnt natürlich statt zu suchen auch den exakten Pfad vom Benutzer eingeben lassen, mit Übergabe der Datei oder anderen Methoden arbeiten.

Achtung: „for“ nimmt nach „in“ Übergaben in einem Klammerpaar an, in dem wiederum ein Paar einfacher Hochkommata steht. Also

for .... in ( '  befehle  ' )

Das vor der schließenden Klammer wird oft übersehen, wenn davor etwas in „Ausführungsstrichen“ steht.

Das „^“ hinter dem „dir“ Befehl muss nur gesetzt werden, wenn der „dir“ Befehl in der „for“ Schleife verarbeitet wird. Wollt ihr nur diesen Teil (ohne das „for“ Gedöns), dann mit:

dir c:\spss15\*.exe|findstr /i /l "spsswin.exe"

Nun das Erstelldatum:

for /f "delims= " %%a in ('dir c:\spss15\*.exe /t:c^|findstr /i /l "spsswin.exe"') do echo %%a

und der letzte Zugriff:

for /f "delims= " %%a in ('dir c:\spss15\*.exe /t:a^|findstr /i /l "spsswin.exe"') do echo %%a

Wie man sieht, der Parameter „/t“ in „dir“ gibt an, welches Datum ausgegeben wird. Er nimmt die Werte „c“ für Erstelldatum, „a“ für den letzten Zugriff oder „w“ für den letzten Schreibzugriff. Funktioniert nur unter NTFS, mehr Infos durch „dir /?“.

Wollt ihr jetzt nur einen bestimmten Teil der Datums, z.B. nur das Jahr, könnt ihr dieses auch herausfiltern.

Nur das Jahr des Erstelldatums:

for /f "tokens=3 delims=. " %%a in ('dir c:\spss15\*.exe /t:c^|findstr /i /l "spsswin.exe"') do echo %%a

Monat wäre dann logischerweise „tokens=2“ und Tag „tokens=1“.

Erklärungen dazu gern per Comment oder Mail. Hab grad wenig Zeit.
Das hat mich mehr Zeit gekostet als ich dachte, daher gibts hier die Niederschrift.

Letztens kam die Frage, wie man ein DIV Element zentrieren kann. Das ist eigentlich total simpel. Im Internet gibts sicher viele Lösungen, ich stelle hier kurz ein Codebeispiel vor:

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  
    
    Div zentrieren%MINIFYHTML7c9dc5af9ca0e3e6852bde02af898ff213%
  
    
teeeeest
%MINIFYHTML7c9dc5af9ca0e3e6852bde02af898ff26%

So würde es dann aussehen:
div-zentriert
border, padding und text-align dienen nur der Veranschaulichung. Wichtig ist eigentlich nur, dass das DIV eine Breite und „margin: auto;“ bekommt. Manchmal muss man mit „display: block;“ noch etwas nachhelfen. Wie ihr an meiner Testseite (und im Screenshot) sehen könnt funktioniert es 🙂

Wie kann man das DIV jetzt rechts- oder linksbündig darstellen?
Auch das ist recht simpel, hier ist erstmal der Code:

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  
    
    Div rechtsbündig%MINIFYHTML7c9dc5af9ca0e3e6852bde02af898ff214%
  
    
teeeeest

So würde das aussehen:
div-rechts

Die einzige Änderung ist, dass statt „margin: auto;“ „margin-left: 50%“ eingesetzt wurde. Nach dem Schema: „margin-[entgegengesetzte Richtung]: [Breite des DIV]“.
Hier ist noch die Test-HTML und nach dem Schema könnt ihr natürlich auch linksbündig darstellen.