<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>McSeven - primus esse delectat &#187; Webtechniken</title> <atom:link href="http://www.mcseven.me/category/webtechniken/feed/" rel="self" type="application/rss+xml" /><link>http://www.mcseven.me</link> <description>ey Mac, working hardly or hardly working?</description> <lastBuildDate>Mon, 19 Dec 2011 15:19:37 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>How to kill an Android WebView&#8230;</title><link>http://www.mcseven.me/2011/12/how-to-kill-an-android-webview/</link> <comments>http://www.mcseven.me/2011/12/how-to-kill-an-android-webview/#comments</comments> <pubDate>Thu, 15 Dec 2011 16:47:25 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Webtechniken]]></category> <category><![CDATA[AJAX]]></category> <category><![CDATA[Android]]></category> <category><![CDATA[clearTimeout]]></category> <category><![CDATA[Disable]]></category> <category><![CDATA[End]]></category> <category><![CDATA[Exit]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Pause]]></category> <category><![CDATA[Quit]]></category> <category><![CDATA[Resume]]></category> <category><![CDATA[setTimeout]]></category> <category><![CDATA[Stop]]></category> <category><![CDATA[WebView]]></category> <category><![CDATA[WebViewClient]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=1347</guid> <description><![CDATA[Preface Since this information will hopefully and ultimately prove to be useful to a lot of Android developers around the Planet I have decided to break with tradition again and write in English (or at least my humble attempt at it) again. In this small post I&#8217;d like to discuss several ways that aim at [...]]]></description> <content:encoded><![CDATA[<h1>Preface</h1><p>Since this information will hopefully and ultimately prove to be useful to a lot of Android developers around the Planet I have decided to break with tradition again and write in English (or at least my humble attempt at it) again. In this small post I&#8217;d like to discuss several ways that aim at stopping or finishing a class of the Android operating systems that proves particularly difficult to kill: The WebView.</p><p>Said class is intended to render HTML-based content and can, if equipped with a proper WebViewClient, automatically follow referenced or render JavaScript based content. And exactly this feature or the lack thereof makes it a very interesting challenge.</p><h1>Application</h1><p>Currently I heavily work on x-platform applications that just need to visualize some given data and accept rudimentariy user input; the applications aren&#8217;t very time critical or require real-time responses, but must rather provide a similar Graphical User Interface (GUI) on each and every supported platform (like Phones, PC, Tablet, and so on).</p><p>Writing a native application in the each platforms respective programming language (Objective-C, Java, Dot-Net) is obviously not feasible, rather an approach to write code just once and having to do only minor adaptions from platform to platform seems more appropriate. And furthermore what better way is there than to write our application in HTML and enliven it with JavaScript.</p><p>So, to get the App to the phone there are two ways: either create an HTML5 web package or code a tiny native application that merely offers a full screen sized web view and loads the application into this web view. I decided to use the latter, and since my App uses XHR/AJAX to communicate with my server every second, I didn&#8217;t see a need to use native socket connections or similar. In fact, I think WebSockets are quite unnecessary, but that is a different story.</p><h1>The Problem</h1><p>Said way works like a charm. However, everytime I used my Application battery life was down to an hour or so, previously fully charged of course. Digging for reasons I quickly came to realise that even though I put the App in background, the XHR-JavaScript-Requests continued unhindered. Apparently the WebView does not stop any running JavaScript when put to sleep which offers new possibilities on one hand (consider using node.js on your phone&#8230;) but is highly undesired for my use case.</p><p>When I press the home button on an Android device for instance, I want the current App to come to a halt and not consume ressources more than neccesary. As intended by Google as I understand at least, by the way.</p><p>So, naturally, after blaming crappy garbage collecting and Java, I startet looking for ways to kill the Android WebView. Hence the basis for this article.</p><h1>Solutions</h1><p>Let&#8217;s see how various solutions to pause or stop a WebView in Android work&#8230;</p><h2>.getSettings().setJavaScriptEnabled()</h2><p>Well, you would think that disabling JavaScript in the WebView&#8217;s settings would have an instant effect, in short: it does not. Only after reloading the page would there be no javascript any more, and this is not nice by design, since the page is still more or less well rendered.</p><h2>.stopLoading()</h2><p>Since XHR &#8220;loads&#8221; something from another server, you might think that calling &#8220;<em>webview.stopLoading()</em>&#8221; would have an effect. In short: it does not. Works only on ressources contained within the HTML-file. Pity, is it not&#8230; Well, maybe not, since there is no &#8220;<em>startLoading()</em>&#8221; method to resume XHR after resuming the activity anyway.</p><h2>.destroy()</h2><p>As a last resort one might think about &#8220;destroy()&#8221;ing that thing, and true enough, the WebView itself is not accessible after that. Its threads however continue to exist as zombies somewhere in the vast RAM space and also continue to send XHR requests&#8230;</p><h2>.pauseTimers() / resumeTimers()</h2><p>In short: Nope, does not work. I even don&#8217;t know what these methods are good for if not for controlling JavaScript timers. There aren&#8217;t any in plain HTML, AFAIK.</p><h2>WebViews own onPause() and onResume() methods</h2><p>On StackOVerflow I found a <a
href="http://stackoverflow.com/questions/2040963/webview-threads-never-stop-webviewcorethread-cookiesyncmanager-http0-3" target="_blank">similar question</a> answered like this (see <a
href="http://groups.google.com/group/android-developers/browse_thread/thread/462eae01ea38fe56" target="_blank">Google Groups #1</a> and <a
href="http://code.google.com/p/android/issues/detail?id=10282" target="_blank">#2</a> as well):</p><blockquote><p>You should be able to stop / resume these threads by calling the onPause / onResume on the webview. Those are however hidden, so you will need to do it through reflection. The following code worked for me:</p></blockquote><div
class="java geshi java" style="font-family:monospace;"><div
class="head">// Copied from STOV</div><ol><li
class="li1"><div
class="de1"><span
class="kw1">Class</span>.<span
class="me1">forName</span><span
class="br0">&#40;</span><span
class="st0">&quot;android.webkit.WebView&quot;</span><span
class="br0">&#41;</span></div></li><li
class="li1"><div
class="de1">&nbsp; .<span
class="me1">getMethod</span><span
class="br0">&#40;</span><span
class="st0">&quot;onPause&quot;</span>, <span
class="br0">&#40;</span><span
class="kw1">Class</span><span
class="br0">&#91;</span><span
class="br0">&#93;</span><span
class="br0">&#41;</span> <span
class="kw2">null</span><span
class="br0">&#41;</span></div></li><li
class="li1"><div
class="de1">&nbsp; .<span
class="me1">invoke</span><span
class="br0">&#40;</span>webView, <span
class="br0">&#40;</span><a
href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span
class="kw3">Object</span></a><span
class="br0">&#91;</span><span
class="br0">&#93;</span><span
class="br0">&#41;</span> <span
class="kw2">null</span><span
class="br0">&#41;</span><span
class="sy0">;</span></div></li></ol></div><p>In short again: Did not work for me on 2.3 to 3.2; maybe a particular Android version is required, I don&#8217;t know.</p><h2>And finally: The Working One</h2><p>The only way I found to stop an XHR in the WebView was to save the URL into a temporary string, load a bogus asset-ressource and put the application to sleep after that. When resuming and the temporary URL contains a value, then load this value; it will be loaded from cache anyway (provided you let the cache handling be done with default settings) and not introduce any delays.</p><p>So here&#8217;s the source for the <em>onPause()</em>:</p><div
class="java geshi java" style="font-family:monospace;"><div
class="head">// Code for onPause()</div><ol><li
class="li1"><div
class="de1">@Override</div></li><li
class="li1"><div
class="de1"><span
class="kw1">protected</span> <span
class="kw4">void</span> onPause<span
class="br0">&#40;</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="kw1">super</span>.<span
class="me1">onPause</span><span
class="br0">&#40;</span><span
class="br0">&#41;</span><span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1">&nbsp; appWebViewTempUrl <span
class="sy0">=</span> appWebView.<span
class="me1">getUrl</span><span
class="br0">&#40;</span><span
class="br0">&#41;</span><span
class="sy0">;</span></div></li><li
class="li2"><div
class="de2">&nbsp; appWebView.<span
class="me1">loadUrl</span><span
class="br0">&#40;</span><span
class="st0">&quot;file:///android_asset/infAppPaused.html&quot;</span><span
class="br0">&#41;</span><span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1"><span
class="br0">&#125;</span></div></li></ol></div><p>&#8230;and for <em>onResume()</em> events:</p><div
class="java geshi java" style="font-family:monospace;"><div
class="head">// Code for onResume()</div><ol><li
class="li1"><div
class="de1">@Override</div></li><li
class="li1"><div
class="de1"><span
class="kw1">protected</span> <span
class="kw4">void</span> onResume<span
class="br0">&#40;</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="kw1">super</span>.<span
class="me1">onResume</span><span
class="br0">&#40;</span><span
class="br0">&#41;</span><span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span>appWebViewTempUrl.<span
class="me1">equals</span><span
class="br0">&#40;</span><span
class="st0">&quot;&quot;</span><span
class="br0">&#41;</span> <span
class="sy0">&amp;&amp;</span> appWebViewTempUrl <span
class="sy0">!=</span> <span
class="kw2">null</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; appWebView.<span
class="me1">loadUrl</span><span
class="br0">&#40;</span>appWebViewTempUrl<span
class="br0">&#41;</span><span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1"><span
class="br0">&#125;</span></div></li></ol></div><h1>Summary</h1><p>Of course, this way does not truely pause an XHR, it merely allows the Android Scheduler and the GC to work as intended. Whether or not the OS is to blame or it&#8217;s the programmer&#8217;s fault I don&#8217;t dare judge. Since the JavaScript however usually runs in a sandbox and cannot interact with the host system by design, I consider the inability to pause a webview the operating system&#8217;s fault, particularly, when there is no way to explicitly shut down (&#8220;kill -9&#8243;) an application.</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2011/12/how-to-kill-an-android-webview/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>App Stores: A Failure by Design?</title><link>http://www.mcseven.me/2011/03/app-stores-a-failure-by-design/</link> <comments>http://www.mcseven.me/2011/03/app-stores-a-failure-by-design/#comments</comments> <pubDate>Tue, 22 Mar 2011 15:30:44 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Medienkritik]]></category> <category><![CDATA[Webtechniken]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=1194</guid> <description><![CDATA[Vorwort Eine rege und hitzige Diskussion entspann sich gestern wieder mit einigen Kollegen (danke an Thomas Stibor und Jonas Pfoh, immer ein Vergnügen ) vom Lehrstuhl; es ging um Sinn und Erfolg von mobilen Marketing-Plattformen (&#8220;AppStore&#8221;, &#8220;Market&#8221;). Meine provokante These, dass die Markets eben mit Nichten die Erwartungen Ihrer Anbieter erfüllen, wurde vehement versucht zu [...]]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Eine rege und hitzige Diskussion entspann sich gestern wieder mit einigen Kollegen (danke an Thomas Stibor und Jonas Pfoh, immer ein Vergnügen <img
src='http://www.mcseven.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) vom Lehrstuhl; es ging um Sinn und Erfolg von mobilen Marketing-Plattformen (&#8220;AppStore&#8221;, &#8220;Market&#8221;). Meine provokante These, dass die Markets eben mit Nichten die Erwartungen Ihrer Anbieter erfüllen, wurde vehement versucht zu entkräften mit im Wesentlichen Hören-Sagen- Aussagen, oder &#8220;ist doch klar, dass&#8230;&#8221;; robuste Argumente konnte keine Seite vorbringen.</p><p>Zeit, das zu ändern und zumindest den Erfolg der reinen App-Geschichte infrage zu stellen.</p><h1>Thema</h1><p>Punkt ist einfach, dass ich nirgendwo eine detailierte Statistik gefunden habe, in der die Einnahmen der Markets / Stores aufgelistet werden, schön säuberlich nach Kategorie, Land und Betrag. Im Gegenteil: Jahresberichte von Apple und Co sprechen immer nur von einem Gesamtergebnis (&#8220;Income from Operations&#8221;). Eine Aufschlüsselung in Geschäftsbereiche fehlt vollkommen.</p><p>Oh, selbstverständlich: Steve&#8217;s offizielle Aussagen sprechen von augenwischenden 100-Millionen von Downloads. Was er und seine Kollegen verschweigen, sind eine Reihe von <a
href="http://www.pcworld.com/businesscenter/article/183141/app_store_statistics_as_misleading_as_they_are_impressive.html" target="_blank">wichtigen Dingen</a> und Fragen:</p><ul><li>Wieviele der Downloads sind bezahlte Applikationen?</li><li>Wieviel Geld nimmt der Store an sich ein und wieviel muß der Anbieter an die Entwickler auszahlen?</li><li>Wieviele Applikationen bleiben nach dem Download noch in Benutzung?</li></ul><p>Es gibt Indizien dafür, dass das reine Geschäft mit bezahlten mobilen Anwendungen einfach keines ist, zumindest nicht außerhalb der USA. Aus <a
href="http://www.appleinsider.com/articles/09/02/19/iphone_app_usage_declining_rapidly_after_first_downloads.html" target="_blank">dieser Quelle</a>, die auch sonst absolut lesenswert ist:</p><p><cite>Yardley also took on a question developers often face: whether to charge  for an app or use a free, ad-supported model.  He noted that paid apps  are used slightly more than free ones and for slightly longer periods.   In his findings, very few apps can succeed with ad support.  The number  of views just isn&#8217;t there.</cite></p><p>Dann stellt sich die Frage, wie überhaupt bezahlt werden soll: Im Android Market mit Google-Checkout (wer bitte hat schon eine Kreditkarte?), bei Apple ist&#8217;s der iTunes-Account, auch der will eingerichtet sein, selbiges bei Microsoft mit einem Hotmail-Account. Am ehesten erscheint mir noch iTunes USA als System, bei dem auf die Telefonrechnung gebucht werden kann, am tragbarsten. Ist in DE wahrscheinlich in 10 Jahren noch nicht möglich.</p><p>Für den Android-Markt sehen wir ganz deutlich aus <a
href="http://www.androlib.com/appstats.aspx" target="_blank">dieser Quelle</a>, dass es keine 100 bezahlten Apps gibt, die wirklich erfolgreich im Sinne von mehr als 50 000 Downloads sind. Dem gegenüber stehen über 2000 kostenlose/werbefinanzierte Applikationen, die mehr als 250 000 Downloads aufweisen können.</p><p>Zudem bemühen sich die Firmen Apple und Google, eben weitere GEschäftfelder zu eröffnen: Bezahlte Abo&#8217;s in etwa, die man in Applikationen vertreiben kann. Wie dämlich ist das denn? Der Verlag müßte doch nur eine brauchbare mobile Webseite anbieten, wozu brauchen die ne App dafür?</p><p>Dann wäre eine Frage, auf welche Märkte sich die Statistiken beziehen. Ich habe bei der Werbungsfirma AdMob in diesem <a
href="http://metrics.admob.com/wp-content/uploads/2010/06/May-2010-AdMob-Mobile-Metrics-Highlights.pdf" target="_blank">PDF</a> auf Seite 4 eine interessante Grafik gefunden. Deutschland spielte letztes Jahr noch gar keine Rolle. Auf Seite 11 ist übrigens klar erkennbar, wie iOS nach und nach Marktanteile an Android verliert, während andere Plattformen nahezu konstant bleiben.</p><p>Die sehr interessante Frage, wieviel Geld ein durchschnittlicher Benutzer eigentlich monatlich für Apps ausgibt, sollte eigentlich auf Seite 25 beantwortet werden, leider fehlen eben wichtige Angaben; die Folie ist unbrauchbar: Bei der i* Zeile fehlt die zeitliche Angabe, bei Android die finanzielle.</p><p>Auch vermischt die Studie Angaben über automatisch durch das AbMob Netzwerk gewonnene Erkenntnisse mit denen, die durch eine Umfrage ermittelt wurden. Schade.</p><h1>Fazit</h1><p>Ich kann leider nicht mit belastbaren Zahlen aufwarten, sondern nur von den obigen Indizien zehren: App-Stores ohne Zusatzeinkommen durch weiteren Content und Werbung rentieren sich hinten und vorne nicht im Vergleich mit anderen Einnahmequellen der Unternehmen (Hardware, andere Dienste und Dienstleistungen und vor allem Werbeverkäufe).</p><p>Spannend zu untersuchen und damit sicher unmöglich herauszufinden wäre nun, wieviel die Werbung zumindest in Free-Apps eigentlich bringt, d.h. wieviele Views wirklich zu Klicks werden und wieviele Klicks der werbenden Firma tatsächlich Umsatz bescheren.</p><p>Auch das Verhalten mit AdBlockern auf mobilen Geräten und auf dem Desktop-PC wäre zu untersuchen, inzwischen sind die so intelligent, dass sie die Werbung laden, aber nicht anzeigen. Damit haben auch die raffiniertesten serverseitigen Methoden keine Chance mehr, was ich persönlich sehr gut finde.</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2011/03/app-stores-a-failure-by-design/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Windows 7 und alte Games: UDP-Broadcast-Cloning (Update)</title><link>http://www.mcseven.me/2011/01/windows-7-und-alte-games-udp-broadcast-cloning/</link> <comments>http://www.mcseven.me/2011/01/windows-7-und-alte-games-udp-broadcast-cloning/#comments</comments> <pubDate>Tue, 11 Jan 2011 14:42:30 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Webtechniken]]></category> <category><![CDATA[6112]]></category> <category><![CDATA[Broadcast]]></category> <category><![CDATA[Firewall]]></category> <category><![CDATA[Host]]></category> <category><![CDATA[Hosten]]></category> <category><![CDATA[Open-VPN]]></category> <category><![CDATA[OpenVPN]]></category> <category><![CDATA[Warcraft 3]]></category> <category><![CDATA[Windows 7]]></category> <category><![CDATA[Windows Vista]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=1160</guid> <description><![CDATA[Vorwort Gerne erinnern wir uns an die Zeiten unserer Jugend, nicht daß die schon vorbei wären , und denken dabei auch an die unzähligen LAN-Parties oder LANs zurück, auf denen nächtelang gezockt wurde bis die Augen zufielen. An Genres kam alles dran, vom Killerspiel bis zur Materialschlacht in der C&#38;C-Reihe. Der hier beschriebene Blogeintrag entstand, [...]]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Gerne erinnern wir uns an die Zeiten unserer Jugend, nicht daß die schon vorbei wären <img
src='http://www.mcseven.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , und denken dabei auch an die unzähligen LAN-Parties oder LANs zurück, auf denen nächtelang gezockt wurde bis die Augen zufielen. An Genres kam alles dran, vom Killerspiel bis zur Materialschlacht in der C&amp;C-Reihe.</p><p>Der hier beschriebene Blogeintrag entstand, nachdem ein paar Kollegen diese Zeiten wieder aufleben lassen wollten, und mit modernen Versionen der Betriebssysteme und den guten alten Games Schwierigkeiten haben.</p><h1>Problem</h1><p>Konkret geht es um das Spiel Warcraft 3, auf dem wir Tower Wars 1.1 zocken (&#8220;Türmchen bauen&#8221;). Wir haben dabei die Schwierigkeit, daß das Hosten auf Windows Vista und Windows 7 einfach nicht funktioniert, wenn wir die Rechner über OpenVPN zusammenschließen. Partout erkennt niemand das Spiel im Netzwerk, wenn es auf einem der beiden Betriebssysteme erstellt wird. Ein Kollege hat noch XP (den Gameloader, wie er es nennt), dort läuft es einwandfrei und 7er können auch beitreten.</p><h1>Symptome</h1><p>Es scheinenen mehrere Voraussetzungen und Gegebenheiten erfüllt zu sein:</p><ul><li>Betriebssystem ist Windows 7 oder Vista.</li><li>Es existiert mehr als ein physischer Netzwerkadapter (z.B. Open-VPN TAP Device).</li><li>Die Rechner befinden sich mit einem dieser Netzwerkinterfaces in einem gemeinsamen Subnetz (10.10.12.[4-10]).</li><li>Routing funktioniert, Pingen lassen sich die Maschinen untereinander.</li><li>Latenzen sind akzeptabel, sprich &lt;200ms.</li><li>Firewalls sind ausgeschaltet, sprich deaktiviert, nicht nur mit Ausnahmen versehen.</li></ul><p>Es gibt also keinen Grund, warum die Konfiguration für die Kommunikation zwischen den Rechnern für Warcraft 3 nicht ausreichen sollte.</p><h1>Hintergrund</h1><p>Nach nächtelangem Suchen im Internet stieß ich auf die Lösung. Warcraft 3 benutzt zum Ankündigen eines offenen Spiels im LAN UDP-Broadcasts. Hat ein Rechner nur eine Netzwerkkarte, so ist alles in Butter: Das Paket geht nur über diese Schnittstelle raus und wird eben im Subnetz verteilt.</p><p>Existieren 2 oder mehr Interfaces, bekommen wir ein Problem: Dann werden die Broadcasts nur noch auf der Verbindung mit der niedrigsten Metrik ausgegeben, also meistens auf einer einzigen Netzwerkkarte.</p><p>Nun ist es unter XP so, dass die Open-VPN-TAP-Schnittstelle, wenn die automatische Metrik aktiviert ist, höchste Priorität erhält, vielleicht weil dort die Metrik automatisch anders geändert wird (OpenVPN meldet einen 10 MBit/s Linkspeed bei Windows). Unter Vista und 7 allerdings ist das nicht mehr der Fall. Dort bleibt wahrscheinlich die Netzwerkkarte mit der dicksten Datenrate die höchstpriorisierte Verbindung.</p><p>Wir sehen schon, die Fehlfunktion liegt daran, daß die &#8220;Announce&#8221;-Pakete auf dem falschen Interface ausgegeben werden, und statt ins VPN über die lokale Netzwerkkarte wegen der geringeren Metrik der Verbindung gesendet werden.</p><p>Es scheint generell eine Schwierigkeit zu geben, wenn Programme in guter Intention auf 255.255.255.255 broadcasten in der Hoffnung, wirklich alle angeschlossenen Netze zu erreichen, das Betriebssystem aber tatsächlich eben nur auf dem einen Interface mit geringster Metrik sendet.</p><h1>Lösung</h1><p>Gelöst werden könnte das Problem auf mehrere Arten.</p><h2>Saubere Programmierung</h2><p>In der eigenen Software müßte man alle verbundenen Netzwerke abfragen und an ihre jeweilige Broadcast-Adresse schicken. Die Broadcast-Adresse ist die Adresse mit lauter 1-Bits im Host-Teil, bei /24er (Class C) Netzen also *.*.*.255, bei /16 (Class B) *.*.255.255 und bei /8 (Class A) Netzen *.255.255.255; siehe auch <a
href="http://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing" target="_blank">hier</a>.</p><p>Das läßt sich auf Warcraft 3 leider nicht anwenden, da das Spiel an 255.255.255.255 sendet.</p><h2>Routen ändern</h2><p>Für die Dauer des Spiels könnte man alle Routen an 255.255.255.255 löschen und nur eine einzige auf die jeweilige VPN-Adresse setzen; auf der Kommandozeile ist einzugeben:</p><div
class="c geshi c" style="font-family:monospace;"><div
class="head">Kommandozeilenbefehle zum Ändern der Route</div><ol><li
class="li1"><div
class="de1">route delete 255.255.255.255</div></li><li
class="li1"><div
class="de1">route add 255.255.255.255 mask 255.255.255.255 $VPN<span
class="sy0">-</span>IP<span
class="sy0">-</span>Adresse$</div></li><li
class="li1"><div
class="de1"><span
class="co1">//also z.B. route add 255.255.255.255 MASK 255.255.255.255 10.10.10.132</span></div></li></ol></div><h2>Metrik ändern</h2><p>Man könnte die Metrik der Verbindungen für alle Einträge 255.255.255.255 auf den gleichen Wert setzen. Theoretisch möglich sein sollte das, zumindest habe ich das in der Routingtabelle schon gesehen. Leider spinnt der ROUTE ADD Befehl, und hält sich nicht an meine Metrik-Vorgaben unter Windows 7 x64. Aus METRIC 10 werden dann mal 40 und mal 20, ich hab&#8217;s nicht hinbekommen.</p><h2>UDP-Pakete klonen</h2><p><a
href="http://www.mcseven.me/wp-content/uploads/2011/01/tool.jpg" rel="lightbox[1160]"><img
class="alignleft size-thumbnail wp-image-1163" style="border: 0pt none; margin: 5px 5px 0px 0px;" title="Tool" src="http://www.mcseven.me/wp-content/uploads/2011/01/tool-100x100.jpg" alt="" width="100" height="100" /></a>Ein findiger <a
href="http://www.hanksoft.de" target="_blank">Programmierer</a> hat sich ein <a
href="http://www.hanksoft.de/service/46-udpbroadcastforwarder" target="_blank">kleines Tool</a> geschrieben, dass jede Netzwerkkarte im <a
href="http://en.wikipedia.org/wiki/Promiscuous_mode" target="_blank">Promiscous-Mode</a> öffnet mittels <a
href="http://de.wikipedia.org/wiki/Winpcap" target="_blank">WinPCap</a>, und einfach lokal erzeugte UDP-Broadcasts auf allen nicht betroffenen Netzwerken ausgibt und dabei die Quell-IP-Adresse noch korrekt setzt (Port bleibt natürlich erhalten wie er war).</p><p>Das Tool muß im Administrator-Modus gestartet werden und hinterläßt keine Spuren im System. Ich persönlich halte das für die brauchbarste Lösung, weil man nicht selbst mit den unberechenbaren Routingtabellen spielen muss.</p><p><span
style="color: #ff0000;"><strong>Update:</strong></span> Es existiert offenbar noch ein weiteres Tool (HamachiBroadcastFix), dass vergleichbares leistet und für die VPN-Lösung Hamachi geschrieben wurde. Den Blogeintrag findet ihr <a
href="http://www.espend.de/artikel/gameserver-ueber-hamachi-tunngle-und-co-werden-windows-7-nicht-angezeigt.html" target="_blank">hier</a> (Danke an dere24), weiter unten auf der Seite findet sich eine Beschreibung und der Download.</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2011/01/windows-7-und-alte-games-udp-broadcast-cloning/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Pimp-My-WordPress a.k.a. das Table-of-Content-Plugin</title><link>http://www.mcseven.me/2010/08/pimp-my-wordpress-a-k-a-das-table-of-content-plugin/</link> <comments>http://www.mcseven.me/2010/08/pimp-my-wordpress-a-k-a-das-table-of-content-plugin/#comments</comments> <pubDate>Wed, 18 Aug 2010 22:14:39 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Inhaltsverzeichnis]]></category> <category><![CDATA[Plugin]]></category> <category><![CDATA[t.o.c]]></category> <category><![CDATA[table of content]]></category> <category><![CDATA[TinyTOC]]></category> <category><![CDATA[toc]]></category> <category><![CDATA[WordPress]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=947</guid> <description><![CDATA[Vorwort HEUREKA! Wie lange schon geht mir auf die Nerven, dass WordPress keine Inhaltsverzeichnisse unterstützt. Die Suche nach &#8220;table of content&#8221; in der Plugin-Seite fördert nur wenig zu Tage, ganz selten ist eines der gefundenen Plugins überhaupt mit WP 3+ kompatibel, gefallen hat mir keines. Ziel ist doch nur, aus den Überschriften der verschiedenen Level [...]]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>HEUREKA! Wie lange schon geht mir auf die Nerven, dass WordPress keine Inhaltsverzeichnisse unterstützt. Die Suche nach &#8220;table of content&#8221; in der Plugin-Seite fördert nur wenig zu Tage, ganz selten ist eines der gefundenen Plugins überhaupt mit WP 3+ kompatibel, gefallen hat mir keines. Ziel ist doch nur, aus den Überschriften der verschiedenen Level eines Artikels ein popeliges Inhaltsverzeichnis zu erzeugen.</p><p>Nun ja, nachdem dem Inschenör nichts zu schwör ist, wird ab heute selbst Hand angelegt. Die Grundlage bildete das noch am ehesten brauchbare Plugin &#8220;<a
href="http://php4every1.com/scripts/tiny-table-of-contents-wordpress-plugin/">TinyTOC</a>&#8220;, welches aber auch eigene Tags erwartet, um Überschriften zu erkennen.</p><p>Nachdem ich gerne die Qualitätsmarke &#8220;made-in-Germany&#8221; auf eigene Entwicklungen stempele, ist&#8217;s nicht genug, ein Inhaltsverzeichnis zu erzeugen, sondern auch mit einer uralten HTML-Schwäche zu brechen &#8211; den Kapitelnummern. Warum können verschachtelte <em>Heading</em>-Tags nicht entsprechend (1., 1.1., 1.1.2, etc.) ausgegeben werden?! Es ist selbst mit CSS nicht möglich, entsprechende Funktionalität zu implementieren.</p><p>Zeit wird&#8217;s für ein Redesign.</p><h1>Beschreibung</h1><p>Das Plugin kann im Wesentlichen die folgenden zwei Aufgaben übernehmen.</p><h2>Erweiterung von Überschriften um Kapitelnummern</h2><p>Das Plugin scannt den gesamten Text eines Posts, egal ob in Seite  aufgeteilt (&#8220;paginated&#8221;) oder nicht, und extrahiert die Überschriften  aus den <em>h1</em>-<em>h6</em> HTML-Tags. Sofern der Autor die  Verschachtelung korrekt durchgeführt hat, sprich alle Ebenen sind  aufsteigend hintereinander angeordnet (1. -&gt; 1.1. -&gt; 1.1.1., nicht  1. -&gt; 1.1.1.), erstellt das Plugin korrekte intern Einträge.</p><p>Aus diesen erzeugt es quasi-eindeutige, zumindest aber statische ID-Attribute und weist sie den jeweiligen <em>h*</em>-Tags auf der aktuellen Seite (&#8220;Page&#8221;) zu. Dies geschieht unabhängig von den Gliederungsebenen, jede Überschrift erhält eine eigene ID.</p><p>Danach werden optional aus den Einstellungen im Admin-Interface und den jeweiligen Gliederungsebenen Kapitelnummern erzeugt (z.B. I., I.1, I.2, II., II.1., etc.) und diese dem Text der Überschrift vorangestellt.</p><p>Es lassen sich dafür drei Dinge einstellen:</p><ol><li>Die Tiefe der Nummerierung von Level 1 &#8211; Level 9.</li><li>Der Nummernstil der Ebene:<ul><li>nicht nummerieren</li><li>Arabische Ziffern: 1, 2, 3, &#8230;</li><li>Römisch Klein: i, ii, iii, iv, &#8230;</li><li>Römisch Groß: I, II, III, IV, &#8230;</li><li>Alphabetisch Klein: a, b, c, &#8230;</li><li>Alphabetisch Groß: A, B, C, &#8230;</li></ul></li><li>Ein abschließendes Zeichen der Ebene:<ul><li>keines</li><li>immer den Punkt (1., 2.)</li><li>Punkt, wenn nicht letzte Ebene (1, 1.1, 1.1.1, etc.)</li><li>immer Klammer (1),2),3))</li><li>Klammer, wenn nicht letzte Ebene (1, 1)1, 1)1)1, etc.)</li></ul></li></ol><p>Das sollte eine maximale Flexibilität für die meisten Einsatzzwecke geben.</p><h2>Erzeugen des Inhaltsverzeichnisses</h2><p>Wenn gewünscht, erzeugt das Plugin auch ein Inhaltsverzeichnis. Nahezu unabhängig von der Nummerierung von oben können auch hier ein paar Einstellungen vorgenommen werden:</p><ul><li>Kapiteltiefe: Bis zu welchem Level soll der TOC aufgebaut werden.</li><li>Soll es eine flache Liste werden, eine aus <em>&lt;ul&gt;</em>-Elementen erzeugte, oder sollen die Kapitelnummern von oben übernommen werden (dann ist TOC-Tiefe auf die Nummerierungstiefe von oben begrenzt!).</li></ul><p>Da die <em>&lt;ul&gt;</em>-Tags und die Nummerierungselemente flach untereinander liegen und nicht verschachtelt sind, erhalten die einzelnen Ebenen jeweils eine oder mehrere CSS-Klassen:</p><ul><li>tinytoc_level_<em>n</em>: Selbsterklärend, in welchem Level befindet das <em>&lt;li&gt;</em>- oder <em>&lt;div&gt;</em>-Element.</li><li>current_page: Ist das Ziel des Links auf der aktuellen Seite zu finden?</li><li>fiurst_in_block: Wenn ein neuer Level-Block aufgemacht wird (z.B. von 1. -&gt; 1.1.), erhält das erste Element im neuen Block diese Klasse.</li><li>last_in_block: Wenn Level-Block beendet wird (z.B. von 1.1. -&gt; 2.), erhält das letzte Element im Block diese Klasse.</li></ul><p>Damit kann das Verzeichnis beliebig gestyled und angeordnet werden.</p><h1>Fazit</h1><p>Das Stück Software ist weit davon entfernt, sauber oder schön programmiert zu sein, oder fertig. Ich habe im Moment nur leider gar keine Zeit zum weiterentwickeln und habe nur einen 2 Tage-Hack gesucht, um eben den Blog etwas zu verbessern. Hier der <a
href="http://www.mcseven.me/wp-content/uploads/2010/08/tiny-table-of-contents-tinytoc.zip">TinyTOC-Extended-Quellcode</a>, soweit es geht kommentiert (Hinweis: Ich übernehme keine Haftung für oder gebe Garantien irgendwelcher Art auf die Software; Verwendung erfolgt auf eigenes Risiko!). Zum Installieren einfach in das /plugins-Verzeichnis kopieren, im Admin-Interface bei Plugins aktivieren und -wichtig- mindestens einmal die Konfiguration speichern.</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2010/08/pimp-my-wordpress-a-k-a-das-table-of-content-plugin/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Social-Unlinking am Beispiel von Facebook</title><link>http://www.mcseven.me/2010/06/social-unlinking-am-beispiel-von-facebook/</link> <comments>http://www.mcseven.me/2010/06/social-unlinking-am-beispiel-von-facebook/#comments</comments> <pubDate>Wed, 09 Jun 2010 12:16:23 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Anonymity]]></category> <category><![CDATA[Medienkritik]]></category> <category><![CDATA[Politik]]></category> <category><![CDATA[Adblock Plus]]></category> <category><![CDATA[Facebook]]></category> <category><![CDATA[Like]]></category> <category><![CDATA[Link]]></category> <category><![CDATA[Social Networks]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=807</guid> <description><![CDATA[Der Artikel beschreibt einfache Adblock Plus Filter, um auf die inzwischen auf diversen Seiten vorhandenen Facebook-Links gründlich und dauerhaft zu entfernen. Facebook muss nicht alles wissen.]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Die meisten großen sozialen Netzwerke bieten inzwischen die Möglichkeit, Inhalte im Internet auch im eigenen internen geschützen Bereich des Netzwerks verfügbar zu machen, zu teilen. Gefällt mir eine Seite, so gebe ich die URL dazu an, die Plattform ruft die URL auf und versucht anhand von Data-Mining eine möglichst knappe Übersicht davon in meiner Hauptseite darzustellen.</p><p>Inzwischen aber sind die Plattformen dazu übergegangen, mit technischen Hilfsmitteln direkt auf den fremden Seiten Links (&#8220;Like-Button&#8221;) anzubieten, mit denen ein Benutzer auf der dritten Seite eine Verknüpfung zwischen sich (seinem Plattformprofil) und der dritten Seite (z.B. IMDB) herstellen kann.</p><p>Im Prinzip eine gute Sache, denn wer es nicht braucht, der benutzt es einfach nicht. Schaden oder Mißbrauch entsteht ja keiner, oder?</p><h1>Eine Ode an die Technik</h1><p>Leider ist das nicht ganz richtig. Es verhält nämlich sich so:</p><p>Sobald Du Dich bei Deiner Plattform, nehmen wir Facebook als Beispiel, einloggst, werden ein Haufen Identifizierer -sogenannte Cookies- in Deinem Webbrowser gespeichert. Es erkennt daran, dass Du der Benutzer XYZ bist, aus welchem Land Du kommst, welchen Webbrowser Du benutzt, und viele andere Dinge. Im Wesentlichen lässt sich damit verhindern, dass jemand durch Abhören Deiner Verbindung auf seinem eigenen System sich als Dich ausgeben kann.</p><p>Mit anderen Worten: Bei jedem Seitenaufruf durch Dich werden sehr viele Informationen zwischen Deinem Browser und Facebook ausgetauscht.</p><p>Der nette Nebeneffekt ist, dass Du Dich nicht jedesmal bei einem Klick in Facebook einloggen musst. Die Plattform weiß ja, wer Du bist, und gewährt Dir daher die Rechte dazu.</p><p>Jetzt wird es ein bisschen schwieriger:</p><ul><li>Fakt eins: Auch wenn Du Dich ausloggst oder den Browser schließt, bleiben die meisten der oben genannten Cookies bestehen. Das heißt, Facebook weiß auch morgen noch, wer Du bist, obwohl Du dich noch gar nicht eingeloggt hattest.</li><li>Fakt zwei: Bei <strong>jeder</strong> Anfrage an Facebook, also bei jedem Bild, jeder Seite, jedem Text und auch jedem Stück Programmcode (&#8220;JavaScript&#8221;), welche Dein Browser von Facebook anfragt, werden alle diese Cookies mitgesendet.<br
/> Facebook weiß also immer, wer welches Bild, Text, usw. herunterladen und anschauen möchte, und das <strong>selbst dann</strong>, wenn Du nicht eingeloggt bist.</li><li>Fakt drei: Es spielt keine Rolle, auf welcher Seite Du gerade surfst. Bist Du beispielsweise bei www.imdb.de unterwegs, und würde IMDB ein Bild von Facebook (und sei es nur das Facebook-Logo!) auf seiner Seite darstellen, dann würde Dein Browser:<ol><li>Von IMDB Inhalte laden</li><li>An Facebook Deine Identifizierung (&#8220;Cookies&#8221;) senden</li><li>Von Facebook das Titellogo laden</li></ol><p>Auch kann unter Umständen durch die Dauer der Anzeige, sprich wie lange es braucht, bis Du Dir ein neues Bild von Facebook lädst, darauf geschlossen werden, wie lange Du die Seite angesehen hast, und daraus, wie interessant der Inhalt für Dich war.</li></ul><p>Facebook weiß damit ziemlich sicher über Dich, wann Du Dir wo  Informationen über welchen Film angesehen hast. Nun kann man das bei Filmen sicher noch nachsehen, was aber bei politischen Inhalten? Was hat es Facebook oder irgendeine andere soziale Plattform zu interessieren, was Du Dir wann anschaust?</p><p>Meiner Meinung absolut nichts! Zeit, sich ein Stück Freiheit wiederzuholen.</p><h1>Fleißige Helferlein</h1><p>Aus der Not geboren wurde für den Firefox das nette Plugin <a
href="https://addons.mozilla.org/de/firefox/addon/1865/" target="_blank">Adblock Plus</a>, das der Werbeflut im Internet Einhalt gebieten soll. Sein Einsatz ist nicht unumstritten, leben doch viele Seiten von der Darstellung der Werbung.</p><p>Nun gut, jeder muss das mit sich selbst ausmachen, wir werden es benutzen, um Facebooks Inhalte auch nur von dort zu laden, wenn wir uns gerade auf der Seite befinden.</p><p>Unser Filter soll also:</p><ol><li>Alle Inhalte von Facebook blockieren (Iframes, Scripts, Images, Links, usw.)</li><li>Das auf allen Seiten des Internet</li><li>Es sei denn, wir surfen gerade auf facebook.com</li></ol><p>Eine Winzigkeit gibt es noch zu beachten: Facebook lädt statische Inhalte von einer anderen Domäne. Der Filter muss das berücksichtigen.</p><p>Hier also die beiden Zeilen:</p><div
class="java geshi java" style="font-family:monospace;"><div
class="head">Adblock-Plus Filter für Facebook-Inhalte</div><ol><li
class="li1"><div
class="de1"><span
class="co1">// Statische Inhalte von Facebook</span></div></li><li
class="li1"><div
class="de1"><span
class="sy0">*</span>fbcdn.<span
class="me1">net</span><span
class="sy0">*</span>$third<span
class="sy0">-</span>party,domain<span
class="sy0">=</span>~facebook.<span
class="me1">com</span></div></li><li
class="li1"><div
class="de1"><span
class="co1">// Flashs, CSS&#39;s, etc. von der Facebook-Seite</span></div></li><li
class="li1"><div
class="de1"><span
class="sy0">*</span>facebook.<span
class="me1">com</span><span
class="sy0">*</span>$third<span
class="sy0">-</span>party</div></li><li
class="li2"><div
class="de2"><span
class="co1">// &quot;Share&quot;-Links entfernen</span></div></li><li
class="li1"><div
class="de1">~facebook.<span
class="me1">com</span>##A<span
class="br0">&#91;</span>href<span
class="sy0">*=</span><span
class="st0">&quot;facebook.com&quot;</span><span
class="br0">&#93;</span></div></li></ol></div><p>Diese Zeilen einfach in den <a
href="https://addons.mozilla.org/de/firefox/addon/1865/" target="_blank">Adblock Plus</a> Einstellungen hinzufügen und schon ist man wieder sicher.</p><p>Es empfiehlt sich eine Gegenprobe mit <a
href="https://addons.mozilla.org/de/firefox/addon/1843/" target="_blank">Firebug</a>, bei mir hat bislang alles geklappt.</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2010/06/social-unlinking-am-beispiel-von-facebook/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Elektronischer Personalausweis: Was soll der Quatsch?!</title><link>http://www.mcseven.me/2010/01/elektronischer-personalausweis-was-soll-der-quatsch/</link> <comments>http://www.mcseven.me/2010/01/elektronischer-personalausweis-was-soll-der-quatsch/#comments</comments> <pubDate>Tue, 05 Jan 2010 17:14:22 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Anonymity]]></category> <category><![CDATA[Politik]]></category> <category><![CDATA[Elektronischer Personalausweis]]></category> <category><![CDATA[ePA]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=691</guid> <description><![CDATA[Vorwort Eine hitzige Diskussion entspann sich im Heise-Forum (Link möchte ich absichtlich nicht setzen, benutzt Google) über das Für und Wider des ePA. Befürworter führen gerne die fantastischen neuen Möglichkeiten an, die der elektronische Ausweis bieten soll und heben hervor, dass das System &#8220;sicher&#8221; sei und so wenig wie möglich zusätzliche und damit mißbräuchlich nutzbare [...]]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Eine hitzige Diskussion entspann sich im Heise-Forum (Link möchte ich absichtlich nicht setzen, benutzt Google) über das Für und Wider des ePA. Befürworter führen gerne die fantastischen neuen Möglichkeiten an, die der elektronische Ausweis bieten soll und heben hervor, dass das System &#8220;sicher&#8221; sei und so wenig wie möglich zusätzliche und damit mißbräuchlich nutzbare Daten generiere.</p><p>Dem muss nun einmal widersprochen werden, ich habe deswegen Argumente zusammengetragen, die gegen das System argumentieren. Ihr werdet hier keine Pro-Argumente finden.</p><h1>Einführende Links und Vorträge</h1><p>Vorab sollte sich der geneigte Leser in der Wikipedia den für Nicht-Techniker relativ gut geschriebenen Artikel bzw. <a
href="http://de.wikipedia.org/wiki/Personalausweis_(Deutschland)#Einf.C3.BChrung_des_elektronischen_Personalausweises_.28ePA.29" target="_blank">Abschnitt für den ePA</a> zu Gemüte führen. Auch der <a
href="http://events.ccc.de/congress/2009/Fahrplan/events/3510.en.html" target="_blank">gestreamte Vortrag</a> über das verwendete Protokoll vom 26c3 erscheint sehenswert. Sehr interessante <a
href="http://www.dataport.de/dataport/ueber-uns/veranstaltungen/nachlese/090708-okewo-forum/vortrag-kuchenbecker.pdf" target="_blank">Vortragsfolien</a> (PDF) habe ich von Dataport gefunden, sie zeigen für die Behörden praktische Auswirkungen auf.</p><p><a
href="ftp://ftp.ccc.de/congress/2009/mp4/26c3-3510-de-technik_des_neuen_epa.mp4" target="_blank">Hier das Video</a> eines Vortrags vom CCC, man möge dem Referenten seinen teils verwirrenden Stil vergeben.</p><h1>Contra ePA</h1><p>Vorab möchte ich anmerken, dass zu manchen Punkten Unklarheiten bestehen und ich diese updaten werde, sobald mehr Informationen verfügbar sind. Die entsprechenden Passagen sind selbstverständlich gekennzeichnet.</p><h2>Anwendungen</h2><p>Die wichtigste Frage stellt sich nach der Anwendung des ePA, genauer: dem elektronischen Identitätsnachweis. Es sind verschiedene Felder auslesbar und andere auf einen gegebenen Wert prüfbar. Im wesentlichen werden vier Betätigungsfelder angeführt:</p><ul><li>Hoheitsfunktion: Die Grenzbeamten im In- und Ausland können feststellen, ob der Ausweis gültig ist, die Namen mit dem Aufdruck übereinstimmen und ob die im Formular ausgefüllte Adresse mit der im Ausweis übereinstimmt, so sie sich die Mühe machem, die Adresse selbst in ihren Rechner zu klopfen. Wo da der Vorteil zum bisherigen Verfahren liegt, ist zumindest mir nicht ersichtlich. <span
style="color: #ff0000;">Unklar:</span> Funktioniert die Prüfung online und wird das obligatorisch?</li><li>Altersverifikation: Ist wohl vornehmlich für Zigaretten und Pornoprodukte gedacht. Verzeihung, aber Kippenkaufen geht auch mit Führerschein oder EC-Karte, Orion und Amazon liefern 18+-Produkte eben &#8220;zu Händen&#8221; bzw. &#8220;Persönlich&#8221; aus. Und der reguläre Durchschnittskonsument findet im Internet eine Reihe von kostenfreien Alternativprodukten, yourporn,  tube8 und deviantclips, um nur einige zu nennen.</li><li>&#8220;Sichere Rechtsgrundlage&#8221; im Internet: Hä? Was ist denn jetzt die unsichere Rechtsgrundlage? Das Verfahren mit Vorkasse funktioniert doch sehr gut. Der Kunde zahlt und sagt, wo es hinsoll. Protokolle (z.B. &#8220;eMail&#8221;) halten die beteiligten Vorgänge einwandfrei fest auf beiden Vertragsseiten. Und nachdem die gespeicherte Adresse noch nicht einmal auslesbar, sondern nur &#8220;verifizierbar&#8221; ist, kann ich den Ausweis noch nicht einmal als &#8220;Ausfüllhilfe&#8221; bezeichnen. Und mal ehrlich, was interessiert&#8217;s den Versender, wo er hinversendet oder wie sein Kunde heißt? Er hat doch sein Geld schon bekommen, und die korrekte Adressangabe ist im Interesse des Kunden.</li><li>Optional &#8211; Behördengänge mittels <a
href="http://de.wikipedia.org/wiki/Qualifizierte_elektronische_Signatur" target="_blank">QES</a>, eGovernment: Man soll sich offenbar authentifizieren (können), wenn man Offizielles bei der Verwaltung tätigt. Bei allem nötigen Respekt, aber wann muss ich das schon? Gewerbebetrieb und Steuererklärung funktionieren derzeit sogar ohne Zertifikate über ELSTER einwandfrei und unkompliziert, alles andere kann ich per Fax erledigen, und die Ummeldung, bei der es tatsächlich Einsparungen bringen könnte, mache ich einmal in fünf Jahren.</li></ul><p><span
style="color: #ff0000;">Unklar </span>ist weiterhin, wie ich das eGovernment benutze: Während das <a
href="https://www.bsi.bund.de/cln_183/ContentBSI/Themen/elekausweise/ePersonalausweis/ePA_Start.html" target="_blank">BSI</a> schreibt, dass eGovernment schon mit eID möglich ist, scheint die rechtsverbindliche Unterschrift, die bei Behörden vonnöten wäre, nur mit QES möglich zu sein. WTF!?</p><p>Weitere Anwendungen, weswegen man den Ausweis bräuchte, wollen mir gerade nicht einfallen.</p><h2>Hardware</h2><p>Für jeden teilnehmenden Rechner oder auch &#8220;Clienten&#8221; braucht man offenbar ein kompatibles = zertifiziertes Lesegerät. Ob das Lesegerät oder der teilnehmende Rechner (<em>nicht Benutzer!</em>) an sich im System eindeutig identifizierbar ist oder sein wird, ist mir derzeit <span
style="color: #ff0000;">unklar</span>. Im digitalen Behördenfunk wird das so sein, jedes Gerät soll ja eindeutig adressier- und vor allem sperrbar sein, falls es verloren geht oder gestohlen wird.</p><p>Nun stellt sich die Frage, ob wir denn nichts gelernt haben aus HBCI und FinTS, dem &#8220;sicheren&#8221; Online-Banking. Die Parallelen sind frapide: Man brauchte ein Lesegerät (ca. 30,- €, soweit ich noch weiß), von der Bank eine HBCI-Chipkarte (ca. 10,- €) und HBCI-PIN sowie eine kompatible zertifizierte (?) Software (z.B. Starmoney oder das T-Online Produkt). HBCI hat es nie weit gebracht, vermutlich, weil der finanzielle und organisatorische Aufwand für den Anwender im Gegensatz zum Nutzen zu groß war.</p><p>Zwar ist das System bestehend aus Webinterface und *TAN nicht besonders sicher, aber dafür einfach und von relativ vielen Menschen bedienbar. Und hier noch eine inoffizielle sinngemäße Aussage eines Vorstands einer österreichischen Bank:</p><p><cite>Sicher kosten die Schäden, welche uns durch Online-Banking-Betrug und PIN-Phishing entstehen, Geld. Es würde uns aber sehr viel mehr kosten, wenn wir durch neue Verfahren und neue Sicherheitssysteme unsere Kunden verunsichern. Daher zahlen wir lieber und machen um diese Vorfälle keinen großen Wind.<br
/></cite></p><h2>Software</h2><p>Damit ein Rechner am System teilnehmen kann, muss zusätzlich darauf eine Software, der sogenannte <a
href="http://de.wikipedia.org/wiki/B%C3%BCrger-Client" target="_blank">Bürger-Client</a>, installiert werden. Laut Wikipedia ist der Auftraggeber das Bundesministerium des Inneren (BMI), und da habe ich schon aufgehört zu lesen. Außer dem Wikipedia-Artikel habe habe keine detailreicheren Beschreibungen zur Software gefunden. Folgende Punkte sind <span
style="color: #ff0000;">unklar</span>:</p><ul><li>Wird die Software OpenSource (No Security through Obscurity!)?</li><li>Für welche Betriebssysteme wird es sie geben?</li><li>Wer garantiert mir, dass ein potentiell vorhandenes Auto-Update-Feature keinen Bundestrojaner auf meinen Rechner lädt bzw. dass die Software nur genau das tut, was sie soll?</li><li>Muss sie unter einem Administrator-Account laufen?</li></ul><h2>Verbindung</h2><p>Offenbar benötigt der Client eine Online-Verbindung. Das kann ich zwar bei den Personen, die die obigen Anwendungen nutzen, als gegeben voraussetzen, auf der anderen Seite aber hatten 2007 &#8220;nur&#8221; knapp 20 Millionen Haushalte von <a
href="http://de.wikipedia.org/wiki/Privathaushalt" target="_blank">39 Millionen</a>, sprich zirka die Hälfte, einen Breitbandanschluss. Über Schmalbandverbindungen habe ich keine verläßlichen Aussagen gefunden.</p><p>Potentiell müssen also die Mitglieder der anderen 20 Millionen Haushalte vorerst auf die Benutzung des Systems verzichten, bezahlen es aber trotzdem.</p><h2>Usability</h2><p>Weiterhin gibt es verschiedene Daten und Nummern, mit denen der Benutzer zurecht kommen muss:</p><ul><li>Personal Identification Number (PIN) zum Benutzen der eID Funktionen</li><li>Aufgedruckte CAN für dritten Eingabeversuch der PIN</li><li>PIN Unblocking Key (PUK) zum Zurücksetzen von drei Fehlversuchen (PIN-Änderung damit aber nicht möglich)</li><li>Sperrkennwort für den Ausweis</li><li>Optional: PIN2 für QES</li><li><span
style="color: #ff0000;">Unklar:</span> PUK2 zum Entsperren der PIN2?</li></ul><p>Der Nutzen der CAN stellt sich mir sehr infrage, nachdem offenbar ein simpler Kopierer diese Nummer bereits kopieren kann und sie statisch zu sein scheint. Es scheint so zu sein, dass die Nutzung der CAN sicherstellen soll, dass der Ausweis tatsächlich vor Ort am Lesegerät liegt, nachdem sie offenbar nur für hoheitliche Stellen benutzbar ist.</p><p>Jetzt aber kommt der Hammer: Man mache die Unterschiede zwischen diesen Teilen einem Nicht-Techniker klar. Yummi! By the way: Wenn die PIN dreimal falsch eingegeben wurde, was bei älteren Teilnehmern schon mal vorkommt, kann nur noch eine Behörde mit entsprechendem Zertifikat (oder der PUK) dat Dingen wieder entsperren. Juchuu, wenn so ein Entsperrzertifikat, von denen es potentiell Hunderte geben kann, abhanden kommt, nicht wahr (der Vollständigkeit halber möchte ich diesen Punkt allerdings als <span
style="color: #ff0000;">unklar </span>anbringen).</p><h2>Biometrie</h2><p>Das Paßfoto wird elektronisch auf dem Ausweis gespeichert, und ist offenbar durch hoheitliche Stellen auslesbar. Zitat aus <a
href="http://www.bmi.bund.de/cae/servlet/contentblob/122648/publicationFile/15717/Grobkonzept_Personalausweis.pdf" target="_blank">diesem PDF</a>, Seite 71:</p><p><cite>Aufdruck der Karten-Zugangsnummer, mit der hoheitliche Stellen auf alle Daten [confirmed: auch die eID-Daten] im Chip zugreifen können.</cite></p><p>Nachdem <span
style="color: #ff0000;">nicht klar</span> ist, was &#8220;zugreifen&#8221; genau bedeutet, gehe ich einmal davon aus, dass es mit &#8220;auslesen&#8221; gleichzusetzen ist. Dafür ist offenbar ein wiederum potentiell hundertfach vorhandenes Hoheitszertifikat ausreichend. Außerdem steht der Beweis, dass eine automatisierte Gesichtserkennung besser ist als die eines Menschen, noch aus. Stichwort &#8220;Seam-Carving&#8221;.</p><h2>Gläserner Bürger, Überwachung, Mißbrauch</h2><p>Neben der schon angesprochenen potentiellen (<span
style="color: #ff0000;">unklaren</span>) Schwachstelle der vielen verteilten Zertifikate, die etwas dürfen in den Ausweisen (PIN zurücksetzen und entsperren, Adressen ändern, Ausweis für ungültig erklären, Daten auslesen, und anderes) existiert möglicherweise eine eklatante Schwachstelle im Datenschutz.</p><p>Fakt ist, dass eine Firma, die eID für ihre Kunden anbieten möchte, sich beim Ausweishersteller (Bund oder BMI) zertifizieren lassen muss und ein entsprechendes elektronisches Zertifikat bekommt, mit welchem sie Datenfelder aus Kundenausweisen auslesen kann (Zustimmung des Kunden natürlich vorausgesetzt).</p><p>Offensichtlich gibt es weiterhin sogenannte Sperrlistenbetreiber, die die von einer PKI bekannten Revocation-Lists (CRL) bereithalten, also das Wissen darüber, welche Ausweise (genauer: deren IDs) ungültig sind. Eventuell ist der Inhaber gestorben, oder hat seinen Ausweis selbst gesperrt, die Gründe sind verschieden.</p><p>Es macht daher für jeden eID-Teilnehmer (Geschäft oder hoheitliche Stelle) Sinn, einen Ausweis vorab auf Gültigkeit zu prüfen. Legt der Kunde einen ungültigen Ausweis vor, würde die restliche Transaktion (Bestellung, Einreise, usw.) abgebrochen oder zumindest anders abgewickelt werden.</p><p>Das Geschäft oder die hoheitliche Stelle wird also bei dem oder einem Anbieter der offiziellen CRL die Gültigkeit des Dokumentes nachfragen. Damit ergibt sich auf der Anbieterseite der CRL ein Record ähnlich des folgenden:</p><ul><li>ID des Ausweises</li><li>ID der anfragenden Einheit</li><li>Zeitstempel</li></ul><p>Kann nun eine Verknüpfung hergestellt werden zwischen Ausweis-ID und Inhaberdaten, was theoretisch bei jedem Online-Einkauf mit eID-Funktion geschieht, hat der CRL-Betreiber bereits wertvolle Daten erhalten.</p><p>Kann eine weitere Verknüpfung zwischen Lesegerät-ID und Standort bzw. Inhaber hergestellt werden (potentiell beim Herausgeber der Zertifikate vollständig vorhanden), so ist nun auch bekannt, welchem Zweck die Abfrage diente. Hat beispielsweise der &#8220;Orion-Versand&#8221; für &#8220;Max Müller&#8221; die Gültigkeit geprüft, dürfte recht eindeutig sein, was Max Müller wohl bestellt hat.</p><p>Die Gefahr besteht deswegen aus meiner Sicht, dass sich vollständige Reise- und Kaufprofile von Benutzern erstellen lassen. Allein dass die Möglichkeit besteht, rechtfertigt schon eine ernsthafte Sorge, denn wo Mißbrauchsmöglichkeiten bestehen, werden sie früher oder später auch genutzt. Siehe Deutsches LKW-Mautsystem und Gefahrenabwehr. Lach.</p><h2>Kosten</h2><p>Mein herkömmlicher Ausweis hat knapp 8,- € gekostet. Der Bio-Reisepass hat 56,- € EUR, knapp das doppelte, gekostet. Nun stellt sich mir die berechtigte Frage: Wer soll das bezahlen, wer hat soviel Geld?</p><p>Das <a
href="http://www.bmi.bund.de/SharedDocs/FAQs/DE/Themen/Sicherheit/epersonalausweis_faq_kosten.html?nn=270266" target="_blank">BMI</a> meint lapidar:</p><p><cite><strong>Was wird der elektronische Personalausweis kosten?</strong><br
/> Noch befindet sich der elektronische Ausweis in der Planungsphase. Ein Preismodell wird derzeit erarbeitet. Ziel der Konzeptionierung ist es, Kosten und Nutzen für die Bürgerinnen und Bürger ausgewogen zu gestalten.</cite></p><p>Bedeutet also, ich als Anwender soll den Käse auch noch zahlen. Und es hört ja nicht beim Ausweis auf. Wer bezahlt den Leser? Wer ersetzt den Teilnehmern im Internet (Versandshops) ihre Kosten für die Zertifizierung? Zumindest die Vergangenheit zeigt, dass das die Verbraucher sein werden. Vielen Dank dafür.</p><h1>Fazit</h1><p>Null Nutzen, mehrfache Kosten. Was soll der Quatsch! Ich werde mir rechtzeitig im Oktober noch einen alten Ausweis holen, dann hab ich wenigstens für 10 Jahre Ruhe.</p><p></p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2010/01/elektronischer-personalausweis-was-soll-der-quatsch/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Outlook-To-Snom / Grandstream-Konverter (Python Script)</title><link>http://www.mcseven.me/2009/12/outlook-to-snom-konverter-python-script/</link> <comments>http://www.mcseven.me/2009/12/outlook-to-snom-konverter-python-script/#comments</comments> <pubDate>Mon, 28 Dec 2009 00:54:48 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Webtechniken]]></category> <category><![CDATA[Export]]></category> <category><![CDATA[Kontakt]]></category> <category><![CDATA[Outlook]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Snom]]></category> <category><![CDATA[Snom 370]]></category> <category><![CDATA[Telefonbuch]]></category> <category><![CDATA[VoIP]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=657</guid> <description><![CDATA[Vorwort Schon länger hat es mich genervt, dass das Webinterface vom Snom 370 so kompliziert zu bedienen ist und dass vor allem das Telefonbuch außer CSV keine andere Schnittstelle bietet. Weil das Eintippen eines Ingenieurs nicht würdig ist, hab ich mir die Zeit genommen, ein Python-Script zu schreiben, das einen Outlook-Kontakt-Export als Eingabe annimmt und [...]]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Schon länger hat es mich genervt, dass das Webinterface vom Snom 370 so kompliziert zu bedienen ist und dass vor allem das Telefonbuch außer CSV keine andere Schnittstelle bietet. Weil das Eintippen eines Ingenieurs nicht würdig ist, hab ich mir die Zeit genommen, ein Python-Script zu schreiben, das einen Outlook-Kontakt-Export als Eingabe annimmt und ein Snom 370 kompatibles CSV erzeugt. Sofern ein Kontakt mehr als eine Telefonnummer besitzt, wird das Snom-Feature der Gruppierung verwendet; man wählt im Adressbuch zuerst den Kontakt und kann sich dann entscheiden, welche Nummer (&#8220;Telefon&#8221;, &#8220;Telefon 2&#8243;, &#8220;Büro&#8221;, &#8220;Firma&#8221;, etc.) man wählen möchte.</p><h1>Benutzung</h1><p>Es folgt eine Anleitung, wie das Script verwendet werden kann.</p><ol><li>Zunächst installiere man sich <a
title="Python Website" href="http://www.python.org" target="_blank">Python</a> 2.6 oder höher auf den Rechner und stelle sicher, dass die Pfadangaben stimmen und dass der Pfad übernommen wurde (Rechner neustarten oder Umgebungsvariable manuell setzen).</li><li>Man erstelle in seinen &#8220;Dokumenten&#8221; einen neuen Ordner, z.B. &#8220;python&#8221;.</li><li>In Outlook ist nun der Ordner &#8220;Kontakte&#8221; zu exportieren:<ul><li>Datei -&gt; Importieren/Exportieren</li><li>Exportieren in eine Datei [ Weiter &gt; ]</li><li>Kommagetrennte Werte (Windows) [ Weiter &gt; ]</li><li>Entsprechenden Kontakt-Ordner anklicken [ Weiter &gt; ]</li><li>Zum neuen Ordner (&#8220;python&#8221;) navigieren und den Namen &#8220;in.csv&#8221; eingeben [ Weiter &gt; ]</li><li>[ Fertigstellen ]</li></ul></li><li><a
href="http://www.mcseven.me/wp-content/uploads/2009/12/outlook2snom.zip"></a><a
href="http://www.mcseven.me/wp-content/uploads/2009/12/outlook2snom_and_grandstream.zip">Outlook 2 Snom/Grandstream Konverter (ZIP-Datei)</a> herunterladen und in das obige Verzeichnis entpacken.</li><li>Nun muss die .py Datei ggf. mit einem Texteditor angepasst werden. Es kann eingestellt werden, welche Felder aus dem Export in das Snom-Telefon übernommen werden sollen, ob ein Prefix vorzuwählen ist und welches die Landesvorwahl ist.</li><li>Man öffne eine Kommandozeile und navigiere zum obigen Ordner.</li><li>Dort führe man das Script mit python aus.</li><li>Es wurden zwei neue Dateien erstellt (&#8220;snom.csv&#8221;, &#8220;gs_phonebook.xml&#8221;), welche nun über das Webinterface des Telefons bzw. einen HTTP-Server in die Geräte geladen werden können.</li></ol><h1>Anmerkungen</h1><ul><li>Achtung: Das Script setzt voraus, dass die Nummern in Outlook im Format +LAND (ORT) NUMMER &#8211; DURCHWAHL gespeichert sind.</li><li>Wenn im Kommand-Prompt der Fehler &#8220;Datei oder Anweisung nicht gefunden&#8221; auftritt, so liegt Python wahrscheinlich nicht im Pfad. Es kann dann manuell aufgerufen werden mit &#8220;C:\Program Files\Python26\python.exe&#8221; (je nach Version ist der Pfadname ein anderer).</li><li>Sofern ein Kontakt keine Nummern oder keinen Namen hat, wird er nicht übernommen.</li><li>Ist nur eine Nummer vorhanden, so wählt das Snom 370 sofort beim Auswählen des Kontaktes. Es kommt dann nicht eine zweite Auswahl mit nur einem Eintrag.</li><li>Leider ist die Anzeige am Display etwas vermurkst. Es steht zwar die Nummer im Display, als Name erscheint aber &#8220;Mobiltelefon, %NACHNAME%, %VORNAME%&#8221;. Der lange String passt nicht auf&#8217;s Display.</li><li>Es können keine zwei Kontakte die gleiche Nummer verwenden, da das Telefon die Nummer als Schlüssel der Zuordnung verwendet.</li></ul><p><strong>[<span
style="color: #ff0000;">Update</span>]</strong> Nachdem die Original-Outlook-Bezeichnungen so lang sind, hab ich das Script noch etwas gepimpt. Man kann jetzt eigene Spalten-Bezeichnungen vorgeben, und z.B. aus &#8220;Mobiltelefon&#8221; den Begriff &#8220;Cell&#8221; oder ähnlich fabrizieren.</p><p><strong>[<span
style="color: #ff0000;">Update 2</span>]</strong> Mittlerweile erzeugt das Script auch gleichzeitig die Ausgabe für die Grandstream-Telefone. Da gibt&#8217;s allerdings den Wehrmutstropfen, dass Grandstream nur exakt 20 Zeichen für Vorname und Nachname insgesamt erlaubt. Möchte man den Nachnamen vom Vornamen mittels &#8220;, &#8221; trennen, so sind es nur noch 18 Zeichen. Lange Namen lassen sich so nicht besonders gut behandeln, aber sonst tut&#8217;s.</p><p>Ich hoffe, es hilft noch jemandem&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2009/12/outlook-to-snom-konverter-python-script/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Exchange 2007: Im Postausgang des OWA nicht-löschbare Mails entfernen</title><link>http://www.mcseven.me/2009/11/exchange-2007-im-postausgang-des-owa-nicht-loschbare-mails-entfernen/</link> <comments>http://www.mcseven.me/2009/11/exchange-2007-im-postausgang-des-owa-nicht-loschbare-mails-entfernen/#comments</comments> <pubDate>Thu, 19 Nov 2009 19:10:37 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Webtechniken]]></category> <category><![CDATA[Exchange 2007]]></category> <category><![CDATA[Outbox]]></category> <category><![CDATA[Outlook]]></category> <category><![CDATA[Outlook WebAccess]]></category> <category><![CDATA[Postausgang]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=650</guid> <description><![CDATA[Symptome Seit einigen Monaten schon nervt mich eine Mail im Postausgang meines Exchange-Postfachs, die einfach nicht wegzubekommen ist. Es betrifft nur Mails im Outlook WebAccess, in den &#8220;großen&#8221; Outlook-Clients (2003 und 2007) war die Mail nicht sichtbar. Wollte ich sie durch Verschieben in den Papierkorb, mittels des &#8220;Löschen&#8221;-Knopfes oder durch Drücken von &#8220;ENTF&#8221; löschen, so [...]]]></description> <content:encoded><![CDATA[<h1>Symptome</h1><p>Seit einigen Monaten schon nervt mich eine Mail im Postausgang meines Exchange-Postfachs, die einfach nicht wegzubekommen ist. Es betrifft nur Mails im Outlook WebAccess, in den &#8220;großen&#8221; Outlook-Clients (2003 und 2007) war die Mail nicht sichtbar.</p><p>Wollte ich sie durch Verschieben in den Papierkorb, mittels des &#8220;Löschen&#8221;-Knopfes oder durch Drücken von &#8220;ENTF&#8221; löschen, so kam die OWA-Fehlermeldung &#8220;Element konnte nicht gelöscht werden. Prüfen Sie, ob das Element noch existiert.&#8221;</p><h1>Lösung</h1><p>Zwar habe ich nicht herausgefunden, wie so etwas passieren kann. Es scheint aber mit dem Outlook-Cache-Modus zusammenzuhängen. Gelöst wurde das Problem, als ich eine neue Postfach-Datenbank in der &#8220;Ersten Speichergruppe&#8221; erstellt habe (Name &#8220;Backup-DB&#8221;) und dann das Postfach dorthin verschoben und wieder in die &#8220;Mailboxdatabase&#8221; der &#8220;Ersten Speichergruppe&#8221; zurückgeschoben habe. Danach konnte ich die Mail im OWA einwandfrei löschen.</p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2009/11/exchange-2007-im-postausgang-des-owa-nicht-loschbare-mails-entfernen/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Exchange 2007: PowerShell-Script für beliebige Weiterleitungen</title><link>http://www.mcseven.me/2009/08/exchange-2007-powershellscript-fur-beliebige-weiterleitungen/</link> <comments>http://www.mcseven.me/2009/08/exchange-2007-powershellscript-fur-beliebige-weiterleitungen/#comments</comments> <pubDate>Thu, 06 Aug 2009 09:54:40 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Webtechniken]]></category> <category><![CDATA[Exchange 2007]]></category> <category><![CDATA[Forward]]></category> <category><![CDATA[PowerShell]]></category> <category><![CDATA[Script]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=577</guid> <description><![CDATA[Der Artikel behandelt eine Lösung für Weiterleitungen bei Exchange-Mailboxen. Es wird insbesondere auf die Problematik der falschen Headerzeilen bei regelbasiertem Weiterleiten eingegangen, sowie eine Umgehung dieser Schwierigkeit aufgezeigt.]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Hin und wieder kommt es vor, dass ein Abieter von eMail-Diensten sich mit der Problemstellung konfrontiert sieht, eMails für Benutzer an ein lokales Postfach und eine oder mehrere (unternehmens-)externe Mailboxen weiterzuleiten, insbesondere, wenn die Mail-Serverlandschaft nicht homogen ist.</p><p>Unter Unix-Mailern bereitet eine solche Konfiguration keine Schwierigkeit, die einfachste Variante ist eine &#8220;.forward&#8221;-Datei im Homedirectory des Anwenders. Unter Exchange allerdings besteht für den Benutzer selbst nur die Möglichkeit, eine Weiterleitungsregel einzurichten, wobei die Lösung besonders bei vielen (heißt 20 000 und mehr) stark frequentierten Mailboxen sehr auf die Serverlast geht.</p><p>Zugleich ist es recht schwer für einen Helpdesk, unbedarften Anwendern den Unterschied zwischen &#8220;Umleitung&#8221; und &#8220;Weiterleitung&#8221; zu erklären und Hilfestellungen für die unterschiedlichen eMail-Clients bereitzuhalten.</p><h1>Szenario</h1><p><a
href="http://www.mcseven.me/wp-content/uploads/2009/08/scenario.png" rel="lightbox[577]"><img
class="alignleft size-medium wp-image-578" style="float:left; margin: 4px 5px 0 0; border:0;" title="Szenario" src="http://www.mcseven.me/wp-content/uploads/2009/08/scenario-300x107.png" alt="Szenario" width="300" height="107" /></a>Es sei das links abgebildete Szenario gegeben. Zum einen habe man einen großen Unix-Mailserver, der für &#8220;Standard&#8221;-Maildienste (POP, IMAP, SMTP) bereitsteht. Benutzer, die Groupware-Funktionen benötigen, werden von einem symmetrisch dazu betriebenen Exchange 2007-System bedient; es soll aber möglich sein, auf beiden Mailservern eine Mailbox zu besitzen und eine oder mehrere weitere externe Postfächer.</p><p>Beide Unternehmens-Server werden aus der gleichen Datenquelle mit Benutzerdaten (Namen, eMail-Adressen usw.) provisioniert.</p><p>Nun tut sich im Falle von Exchange ein Problem auf. Sofern der Benutzer im Active-Directory eine Mailbox besitzt, wird Exchange interne (d.h. von anderen Exchange-Benutzern versandte) eMails immer in diese Mailbox zustellen, auch wenn der Benutzer eigentlich eine andere Adresse benutzt.</p><p>Zwar könnte er eine Weiterleitung über MAPI-Regeln einrichten, hätte dann aber das Problem, dass die &#8220;FROM&#8221;- und &#8220;TO&#8221;-Headerzeilen nicht mehr denen der ursprünglichen Mail entsprechen.</p><h1>Lösung &#8211; Theorie</h1><p>Das Problem betraf einen großen Rechenzentrumsbetreiber in Garching, für den ich die nachfolgende Lösung entwickelt habe. Erschwerend kam noch hinzu, dass für die Konfiguration des Mailsystems eine externe Oberfläche und nicht die nativen (OWA, Outlook) zur Anwendung kommt.</p><p>Exchange 2007 bietet die Möglichkeit, eMails für einen Benutzer an ein anderes, eMail-fähiges AD-Objekt (Kontakt oder Verteiler-Gruppe) weiterzuleiten und dabei wahlweise eine Kopie in die lokale Mailbox zuzustellen. Dies ist über die Oberfläche (Exchange Management Shell) und über PowerShell-Scripte konfigurierbar.</p><p>Der Unterschied zur MAPI-Weiterleitung ist einfach, dass hier die Headerzeilen erhalten bleiben, da Exchange dann mittels Envelope-Header weiterleitet; der Empfänger sieht nun auch in einer völlig fremden Mailbox noch den ursprünglichen Absender anstatt seine eigene Exchange-Absenderkennung.</p><p>Die Lösung besteht nun darin, einfach einen Kontakt für die gewünschte Adresse anzulegen (der Name ist egal, der wird nicht angezeigt im Zielmailsystem) und dem Benutzer diesen Kontakt als Forward-Ziel zu konfigurieren. Nachdem man noch festlegen kann, in welcher OU der Kontakt erstellt wird, behindern diese neuen Objekte auch keine bestehenden Funktionen und tauchen auch nicht in den Adresslisten auf.</p><p>Eine Schwierigkeit ergibt sich noch, wenn der Benutzer an mehr als eine Adresse weiterleiten möchte oder wenn ein Kontakt von mehr als einem Benutzer als Weiterleitungsziel verwendet wird. In diesem Falle ist dann zunächst eine Verteilergruppe zu erstellen und diese als Forward-Ziel festzulegen. Danach müssen die einzelnen Kontakte erstellt und der Gruppe hinzugefügt werden.</p><h1>Lösung &#8211; Praxis</h1><p>Das folgende Script erledigt die Aufgaben; als Parameter sind die Mailboxkennung (z.B. Loginname) und die Ziel-Adressen zu übergeben. Optional kann mit dem dritten Parameter die lokale Kopie aktiviert oder deaktiviert werden. Sofern keine Adressen übergeben wurden, werden die Forwards gelöscht und es findet nur noch eine Zustellung an die lokale Mailbox statt.  Anmerkung: Nach dem Löschen von Forwards können unter Umständen Kontakte &#8220;verwaist&#8221; zurückbleiben. Wenn diese Objekte stören, könnte man sie über einen Batch-Job noch entfernen.</p><div
class="php geshi php" style="font-family:monospace;"><div
class="head">PowerShell-Skript zum Setzen und Löschen von Forwards in Exchange 2007</div><ol><li
class="li1"><div
class="de1">Param<span
class="br0">&#40;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="br0">&#91;</span>string<span
class="br0">&#93;</span> &nbsp;<span
class="re0">$MBKennung</span> &nbsp;<span
class="sy0">=</span> <span
class="st0">&quot;&quot;</span><span
class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span
class="co2"># Kennung der zu suchenden Mailbox</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="br0">&#91;</span>string<span
class="br0">&#93;</span> &nbsp;<span
class="re0">$Addresses</span> &nbsp;<span
class="sy0">=</span> <span
class="st0">&quot;&quot;</span><span
class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span
class="co2"># Kommaseparierte Liste aus externen Adressen und/oder Mailboxkennungen</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="br0">&#91;</span>boolean<span
class="br0">&#93;</span> <span
class="re0">$CopyToLocalMailbox</span> <span
class="sy0">=</span> <span
class="re0">$false</span> <span
class="co2"># Mails auch in Exchange-Mailbox liefern?</span></div></li><li
class="li2"><div
class="de2"><span
class="br0">&#41;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1"><span
class="co2"># This function validates the scripts parameters</span></div></li><li
class="li1"><div
class="de1"><span
class="kw2">function</span> ValidateParams <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="re0">$validInputs</span> <span
class="sy0">=</span> <span
class="re0">$true</span></div></li><li
class="li2"><div
class="de2">&nbsp; <span
class="re0">$errorString</span> <span
class="sy0">=</span> <span
class="st0">&quot;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="re0">$MBKennung</span> <span
class="sy0">-</span>eq <span
class="st0">&quot;&quot;</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="re0">$validInputs</span> <span
class="sy0">=</span> <span
class="re0">$false</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="re0">$errorString</span> <span
class="sy0">+=</span> <span
class="st0">&quot;Missing parameter: The MBKennung parameter is required. Please pass in a valid LRZ-Kennung (gu55nop).&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="br0">&#125;</span></div></li><li
class="li2"><div
class="de2">&nbsp; <span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$validInputs</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span> write<span
class="sy0">-</span>error <span
class="st0">&quot;<span
class="es4">$errorString</span>&quot;</span> <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="kw1">return</span> <span
class="re0">$validInputs</span></div></li><li
class="li1"><div
class="de1"><span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1"><span
class="co2"># Fehlerausgabe unterdrücken</span></div></li><li
class="li2"><div
class="de2"><span
class="re0">$ErrorActionPreference</span><span
class="sy0">=</span><span
class="st0">&quot;SilentlyContinue&quot;</span></div></li><li
class="li1"><div
class="de1">write<span
class="sy0">-</span>output <span
class="st0">&quot;Checking Parameters&#8230;&quot;</span></div></li><li
class="li1"><div
class="de1"><span
class="re0">$ifValidParams</span> <span
class="sy0">=</span> ValidateParams<span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1"><span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$ifValidParams</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span> <a
href="http://www.php.net/exit"><span
class="kw3">exit</span></a><span
class="sy0">;</span> <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">write<span
class="sy0">-</span>output <span
class="st0">&quot;&#8230;done&quot;</span></div></li><li
class="li2"><div
class="de2"><span
class="re0">$MBKennung</span> <span
class="sy0">=</span> <span
class="re0">$MBKennung</span><span
class="sy0">.</span>ToString<span
class="br0">&#40;</span><span
class="br0">&#41;</span><span
class="sy0">.</span>ToLower<span
class="br0">&#40;</span><span
class="br0">&#41;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1"><span
class="re0">$mailbox</span> <span
class="sy0">=</span> get<span
class="sy0">-</span>mailbox <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$MBKennung</span>&quot;</span></div></li><li
class="li1"><div
class="de1"><span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$mailbox</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="re0">$ErrorActionPreference</span><span
class="sy0">=</span><span
class="st0">&quot;Continue&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; write<span
class="sy0">-</span>error <span
class="st0">&quot;Fehler: Mailbox mit Kennung &#39;<span
class="es4">$MBKennung</span>&#39; konnte nicht gefunden werden.&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <a
href="http://www.php.net/exit"><span
class="kw3">exit</span></a><span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1"><span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1"><span
class="re0">$mailboxName</span> <span
class="sy0">=</span> <span
class="re0">$mailbox</span><span
class="sy0">.</span>Name</div></li><li
class="li2"><div
class="de2">write<span
class="sy0">-</span>output <span
class="st0">&quot;Ok, Identität gefunden. Name ist &#39;<span
class="es4">$mailboxName</span>&#39;.&quot;</span> <span
class="st0">&quot;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1"><span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="re0">$Addresses</span> <span
class="sy0">-</span>ne <span
class="st0">&quot;&quot;</span> <span
class="sy0">-</span>and <span
class="re0">$Addresses</span> <span
class="sy0">-</span>ne <span
class="re0">$null</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="re0">$AddressesArray</span> <span
class="sy0">=</span> <span
class="re0">$Addresses</span><span
class="sy0">.</span><a
href="http://www.php.net/split"><span
class="kw3">Split</span></a><span
class="br0">&#40;</span><span
class="st0">&quot;,&quot;</span><span
class="br0">&#41;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="re0">$l</span> <span
class="sy0">=</span> <span
class="re0">$AddressesArray</span><span
class="sy0">.</span>length</div></li><li
class="li2"><div
class="de2">&nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Es wurde(n) <span
class="es4">$l</span> Adresse(n) übergeben ==&gt; Forward(s) anlegen.&quot;</span> <span
class="st0">&quot;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="co2"># Ok, Forward-Gruppe anlegen</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="co2"># Alias wird &quot;$MBKennung-forwardgroup&quot;</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="re0">$gruppenAlias</span> <span
class="sy0">=</span> <span
class="st0">&quot;<span
class="es4">$MBKennung</span>-forwardgroup&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; <span
class="re0">$gruppe</span> &nbsp;<span
class="sy0">=</span> get<span
class="sy0">-</span>distributiongroup <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span> <span
class="sy0">-</span>RecipientTypeDetails MailUniversalDistributionGroup</div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="re0">$gruppe2</span> <span
class="sy0">=</span> get<span
class="sy0">-</span>distributiongroup <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$gruppe2</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Gruppe mit Alias &#39;<span
class="es4">$gruppenAlias</span>&#39; nicht gefunden.&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; new<span
class="sy0">-</span>distributiongroup <span
class="sy0">-</span>Name <span
class="st0">&quot;Forwardgruppe <span
class="es4">$MBKennung</span>&quot;</span> <span
class="sy0">-</span>SamAccountName <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span> <span
class="sy0">-</span>Type Distribution <span
class="sy0">-</span>Alias <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; <span
class="re0">$gruppe</span> <span
class="sy0">=</span> get<span
class="sy0">-</span>distributiongroup <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Gruppe mit Alias &#39;<span
class="es4">$gruppenAlias</span>&#39; wurde angelegt.&quot;</span> <span
class="st0">&quot;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="br0">&#125;</span> <span
class="kw1">elseif</span><span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$gruppe</span> <span
class="sy0">-</span>and <span
class="re0">$gruppe2</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="co2"># Fehlerausgabe einschalten</span></div></li><li
class="li1"><div
class="de1"> &nbsp; &nbsp;<span
class="re0">$ErrorActionPreference</span><span
class="sy0">=</span><span
class="st0">&quot;Continue&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; write<span
class="sy0">-</span>error <span
class="st0">&quot;Gruppe mit Alias &#39;<span
class="es4">$gruppenAlias</span>&#39; ist vorhanden, hat aber den falschen Typ. EXIT.&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <a
href="http://www.php.net/exit"><span
class="kw3">exit</span></a><span
class="sy0">;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="br0">&#125;</span> <span
class="kw1">else</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="co2"># Gruppe löschen und neu anlegen (=&quot;leeren&quot;)</span></div></li><li
class="li1"><div
class="de1"> &nbsp; &nbsp;Remove<span
class="sy0">-</span>DistributionGroup <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span> <span
class="sy0">-</span>confirm<span
class="sy0">:</span><span
class="re0">$false</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; new<span
class="sy0">-</span>distributiongroup <span
class="sy0">-</span>Name <span
class="st0">&quot;Forwardgruppe <span
class="es4">$MBKennung</span>&quot;</span> <span
class="sy0">-</span>SamAccountName <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span> <span
class="sy0">-</span>Type Distribution <span
class="sy0">-</span>Alias <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="re0">$gruppe</span> <span
class="sy0">=</span> get<span
class="sy0">-</span>distributiongroup <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Gruppe mit Alias &#39;<span
class="es4">$gruppenAlias</span>&#39; ist vorhanden. Wird verwendet.&quot;</span> <span
class="st0">&quot;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li2"><div
class="de2">&nbsp; <span
class="co2"># Jetzt die Gruppe als Forward in der Mailbox eintragen</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="re0">$mboxAlias</span> &nbsp; <span
class="sy0">=</span> <span
class="re0">$mailbox</span><span
class="sy0">.</span>alias</div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="re0">$mboxForward</span> <span
class="sy0">=</span> <span
class="re0">$gruppe</span><span
class="sy0">.</span>alias</div></li><li
class="li1"><div
class="de1">&nbsp; set<span
class="sy0">-</span>mailbox <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$mboxAlias</span>&quot;</span> <span
class="sy0">-</span>ForwardingAddress <span
class="st0">&quot;<span
class="es4">$mboxForward</span>&quot;</span> <span
class="sy0">-</span>DeliverToMailboxAndForward <span
class="re0">$CopyToLocalMailbox</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li2"><div
class="de2">&nbsp; <span
class="co2"># Jetzt schauen, ob jeder der Kontakte entweder als</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="co2"># Mailbox oder als MailContact existiert, und falls nein,</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="co2"># den Kontakt als MailContact anlegen.</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="kw1">foreach</span> <span
class="br0">&#40;</span><span
class="re0">$address</span> in <span
class="re0">$AddressesArray</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="re0">$address</span> <span
class="sy0">=</span> <span
class="re0">$address</span><span
class="sy0">.</span>ToString<span
class="br0">&#40;</span><span
class="br0">&#41;</span><span
class="sy0">.</span>ToLower<span
class="br0">&#40;</span><span
class="br0">&#41;</span><span
class="sy0">.</span><a
href="http://www.php.net/trim"><span
class="kw3">Trim</span></a><span
class="br0">&#40;</span><span
class="br0">&#41;</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Suche Kontakt oder Mailbox mit Adresse &#39;<span
class="es4">$address</span>&#39;&#8230;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="re0">$mObjekt</span> <span
class="sy0">=</span> get<span
class="sy0">-</span>mailbox <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$address</span>&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$mObjekt</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot; &nbsp;Mailbox mit Adresse &#39;<span
class="es4">$address</span>&#39; nicht gefunden.&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; &nbsp; <span
class="re0">$mObjekt</span> <span
class="sy0">=</span> get<span
class="sy0">-</span>mailcontact <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$address</span>&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; &nbsp; <span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$mObjekt</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span> write<span
class="sy0">-</span>output <span
class="st0">&quot; &nbsp;Kontakt mit Adresse &#39;<span
class="es4">$address</span>&#39; nicht gefunden.&quot;</span> <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="co2"># Ok, Kontakt neu anlegen&#8230;</span></div></li><li
class="li1"><div
class="de1"> &nbsp; &nbsp;<span
class="co2"># Daten sind relativ egal, der ursprüngliche</span></div></li><li
class="li2"><div
class="de2"> &nbsp; &nbsp;<span
class="co2"># &quot;TO&quot;-Header bleibt erhalten.</span></div></li><li
class="li1"><div
class="de1"> &nbsp; &nbsp;<span
class="kw1">if</span> <span
class="br0">&#40;</span><span
class="sy0">!</span><span
class="re0">$mObjekt</span><span
class="br0">&#41;</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; &nbsp; <span
class="re0">$aliasAddress</span><span
class="sy0">=</span><span
class="re0">$address</span><span
class="sy0">.</span>replace<span
class="br0">&#40;</span><span
class="st0">&quot;@&quot;</span><span
class="sy0">,</span> <span
class="st0">&quot;{a}&quot;</span><span
class="br0">&#41;</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; &nbsp; new<span
class="sy0">-</span>mailcontact <span
class="sy0">-</span>Name <span
class="st0">&quot;Forward &#39;<span
class="es4">$address</span>&#39;&quot;</span> <span
class="sy0">-</span>Alias <span
class="st0">&quot;Forward_<span
class="es4">$aliasAddress</span>&quot;</span> <span
class="sy0">-</span>ExternalEmailAddress <span
class="st0">&quot;<span
class="es4">$address</span>&quot;</span> <span
class="sy0">-</span>confirm<span
class="sy0">:</span><span
class="re0">$false</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot; &nbsp;Neuer Mailkontakt mit SMTP-Adresse <span
class="es4">$address</span> angelegt.&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; &nbsp; <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1">&nbsp;</div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; <span
class="co2"># und zur Gruppe hinzufügen</span></div></li><li
class="li1"><div
class="de1"> &nbsp; &nbsp;Add<span
class="sy0">-</span>DistributionGroupMember <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$mboxForward</span>&quot;</span> <span
class="sy0">-</span>member <span
class="st0">&quot;<span
class="es4">$address</span>&quot;</span> <span
class="sy0">-</span>confirm<span
class="sy0">:</span><span
class="re0">$false</span></div></li><li
class="li1"><div
class="de1">&nbsp; &nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot; &nbsp;Mailkontakt mit SMTP-Adresse <span
class="es4">$address</span> zu Gruppe <span
class="es4">$mboxForward</span> hinzugefügt.&quot;</span></div></li><li
class="li2"><div
class="de2">&nbsp; <span
class="br0">&#125;</span></div></li><li
class="li1"><div
class="de1"><span
class="br0">&#125;</span> <span
class="kw1">else</span> <span
class="br0">&#123;</span></div></li><li
class="li1"><div
class="de1">&nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Es wurden keine Adressen übergeben ==&gt; Forward(s) löschen.&quot;</span> <span
class="st0">&quot;&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; <span
class="co2"># Gut, Forwardgruppe aus dem AD löschen,</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="co2"># sie wird bei der Mailbox dann automatisch</span></div></li><li
class="li2"><div
class="de2"> &nbsp;<span
class="co2"># aus &quot;ForwardingAddress&quot; entfernt.</span></div></li><li
class="li1"><div
class="de1"> &nbsp;<span
class="re0">$gruppenAlias</span> <span
class="sy0">=</span> <span
class="st0">&quot;<span
class="es4">$MBKennung</span>-forwardgroup&quot;</span></div></li><li
class="li1"><div
class="de1">&nbsp; Remove<span
class="sy0">-</span>DistributionGroup <span
class="sy0">-</span>identity <span
class="st0">&quot;<span
class="es4">$gruppenAlias</span>&quot;</span> <span
class="sy0">-</span>confirm<span
class="sy0">:</span><span
class="re0">$false</span></div></li><li
class="li1"><div
class="de1">&nbsp; write<span
class="sy0">-</span>output <span
class="st0">&quot;Ok, Gruppe wurde aus Mailbox entfernt und gelöscht.&quot;</span></div></li><li
class="li1"><div
class="de1"><span
class="br0">&#125;</span></div></li></ol></div><div
id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1065px; width: 1px; height: 1px;"><pre class="1">MBKennung</pre></div> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2009/08/exchange-2007-powershellscript-fur-beliebige-weiterleitungen/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>IIS 6 FastCGI-Fehler 1413 (0&#215;80070585) behoben</title><link>http://www.mcseven.me/2009/07/iis-6-fastcgi-fehler-1413-0x80070585-behoben/</link> <comments>http://www.mcseven.me/2009/07/iis-6-fastcgi-fehler-1413-0x80070585-behoben/#comments</comments> <pubDate>Thu, 02 Jul 2009 18:48:31 +0000</pubDate> <dc:creator>McSeven</dc:creator> <category><![CDATA[Webtechniken]]></category> <category><![CDATA[0x80070585]]></category> <category><![CDATA[1413]]></category> <category><![CDATA[Error]]></category> <category><![CDATA[FastCGI]]></category> <category><![CDATA[Fehler]]></category> <category><![CDATA[IIS]]></category> <category><![CDATA[IIS 6.0]]></category> <category><![CDATA[x64]]></category><guid
isPermaLink="false">http://www.mcseven.me/?p=560</guid> <description><![CDATA[Beschreibung der Lösung des Fehlers 1413 (0x80070585) der IIS Erweiterung FastCGI unter Windows Server 2003 x64.]]></description> <content:encoded><![CDATA[<h1>Vorwort</h1><p>Um CGI-Programme möglichst schnell ohne Prozess-Erstellungs-Penalty unter Windows Server laufen lassen zu können, müssen diese CGI-Programme vom Worker-Process im Speicher gehalten werden; dieses läßt sich mit der FastCGI-Erweiterung für IIS 6 (x86 und x64) realisieren.</p><p>Leider geschehen manchmal auch unvorhergesehene Dinge und kryptische Fehlercodes ohne verständliche Erklärung sind dabei an der Tagesordnung.</p><p>Nachdam ich zwei Tage verbraten habe, einem 0&#215;80070585 Fehler vom FastCGI auf den Grund zu gehen und endlich durch <a
href="http://forums.iis.net/p/1158901/1908969.aspx" target="_blank">Mithilfe (englisch)</a> eines erfahrenen Forumsteilnehmers eine Lösung gefunden habe, möchte ich sie hier in der Hoffnung, dass sie noch jemandem hilft, veröffentlichen.</p><h1>Fehlermeldung</h1><p>Es erscheint beim Aufruf einer von FastCGI gecachten Anwendung (PHP, Perl, etc) die folgende Fehlermeldung:</p><blockquote><h3>FastCGI Error</h3><p>The FastCGI Handler was unable to process the request.</p><p><strong>Error Details:</strong></p><ul><li>Could not find entry for &#8220;php&#8221; on site 7640 in [Types] section.</li><li>Error Number: 1413 (0&#215;80070585).</li><li>Error Description: Invalid index.</li></ul><p>HTTP Error 500 &#8211; Server Error.<br
/> Internet Information Services (IIS)</p></blockquote><p>oder auf deutsch:</p><blockquote><h3>FastCGI Fehler</h3><p>Der FastCGI Handler konnte die Anfrage nicht verarbeiten.</p><p><strong>Fehlerdetails:</strong></p><ul><li>Konnte keinen Eintrag für &#8220;php&#8221; von Site 1 in der [Types] Sektion finden.</li><li>Fehlernummer: 1413 (0&#215;80070585).</li><li>Fehlerbeschreibung: Ungültiger Index.</li></ul><p>HTTP Fehler 500 &#8211; Server Fehler.<br
/> Internet Information Services (IIS)</p></blockquote><h1>Symptome</h1><p>Voraussetzung ist die Verwendung eines 64-Bit Betriebssystems, nur dort ist die folgende Beschreibung anwendbar.</p><ul><li>Nach Installation von FastCGI auf einer x64 Windows-Server Version erzeugt die Erweiterung FastCGI auch nach Anpassen der %WINDIR%\System32\inetsrv\fastcgi.ini die obige Fehlermeldung.</li><li>Im Verzeichnis %WINDIR%\System32\inetsrv\ wird die Datei &#8220;fcgiconfig.js&#8221; nicht gefunden, es existiert nur &#8220;fcgiext.dll&#8221;.</li><li>Wenn Sie von Hand eine &#8220;fcgiext.ini&#8221; in obigem Verzeichnis anlegen, so wird diese mit gleichem Inhalt in %WINDIR%\SysWOW64\inetsrv\ erstellt.</li><li>Die Webserviceerweiterung ist sicher freigegeben in der Administrationsoberfläche des IIS.</li><li>Das Scriptmapping lautet ganz sicher auf %WINDIR%\System32\inetsrv\fastcgi.dll in der entsprechenden Website.</li></ul><h1>Weitere Prüfungsmöglichkeiten</h1><p>Laden Sie sich Process Monitor für Ihr Betriebssystem herunter, führen es aus und filtern alle Ergebnisse mittels &#8220;Path&#8221;-&gt; &#8220;contains&#8221; -&gt; &#8220;fcgi&#8221;. Es sollten jetzt nur noch Zugriffe auf die DLL und die INI-Datei im Fenster erscheinen. Wenn Sie mit dem Webbrowser nun häufig die gewünschte Datei annavigieren (z.B. eine test.php mit nur einem phpinfo(); Aufruf), sollte irgendwann im Process Monitor der Zugriff auf die INI-Datei zu sehen sein.</p><p>Der Pfad wird wohl %WINDIR%\System32\inetsrv\fastcgi.ini lauten.</p><p>Öffnen Sie diese Datei nun mit Ihrem Text-Editor. Im Process Monitor werden Sie auch das mitverfolgen können, nur diesmal mit höchstwahrscheinlich einem anderen Pfad, nämlich %WINDIR%\SysWOW64\inetsrv\fastcgi.ini, und <strong>das, obwohl Sie doch die obere Datei angelegt/bearbeitet haben, mit dem korrekten Pfad!?!</strong></p><h1>Lösung</h1><p>Es ist so banal, dass es eigentlich schon wehtut. Sehr sicher haben Sie zum Verzeichnis-Anschauen oder Ini-Datei-Erstellen einen 32bit Editor verwendet, wie z.B. Total Commander mit integriertem Editor. Es findet in diesem Falle eine sogenannte Verzeichnisumleitung statt, d.h. 32Bit-Anwendungen sehen als &#8220;ihr&#8221; System32-Verzeichnis genau den Inhalt des SysWOW64-Ordners, aber eben unter dem falschen Namen.</p><p>Klar, die FastCGI-Extension ist ja 64-Bit und öffnet die richtige, von MS ausgelieferte Datei; Ihr Texteditor aber sieht die falsche, eigentlich in SysWOW64 liegende Datei.</p><p>Öffnen Sie die Datei einfach mit einem 64-Bit Editor und schon sollte alles passen. Sie werden sogar das config.js File an seinem Platz finden, so wie es sein soll <img
src='http://www.mcseven.me/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://www.mcseven.me/2009/07/iis-6-fastcgi-fehler-1413-0x80070585-behoben/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: basic
Database Caching 86/191 queries in 0.090 seconds using disk: basic
Object Caching 1109/1238 objects using disk: basic

Served from: www.mcseven.me @ 2012-02-08 04:15:45 -->
