<?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>Daten&#124;teiler</title>
	<atom:link href="http://www.datenteiler.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.datenteiler.de</link>
	<description>Kopieren als Kulturtechnik</description>
	<lastBuildDate>Sat, 14 Jan 2012 14:39:01 +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>Batch und PowerShell in einer Datei</title>
		<link>http://www.datenteiler.de/batch-und-powershell-in-einer-datei/</link>
		<comments>http://www.datenteiler.de/batch-und-powershell-in-einer-datei/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 21:02:57 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Batch]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6817</guid>
		<description><![CDATA[Zwischen den Jahren — wie man so schön sagt — habe ich das wirklich gute aber leider nicht mehr verfügbare Buch Windows 2003 Shell Scripting. Abläufe automatisieren ohne Programmierkenntnisse von Armin Hanisch gelesen. Alternativ kann man noch das etwas sehr teure und leider auch DRM geschützte eBook bei Addison-Wesley herunterladen. Auch wenn das Buch für [...]]]></description>
			<content:encoded><![CDATA[<p>Zwischen den Jahren — wie man so schön sagt — habe ich das wirklich gute aber leider nicht mehr verfügbare Buch <a href="http://www.amazon.de/gp/product/3827321786/ref=as_li_tf_tl?ie=UTF8&#038;tag=imhorstnet-21&#038;linkCode=as2&#038;camp=1638&#038;creative=6742&#038;creativeASIN=3827321786">Windows 2003 Shell Scripting. Abläufe automatisieren ohne Programmierkenntnisse<img src="http://www.assoc-amazon.de/e/ir?t=imhorstnet-21&#038;l=as2&#038;o=3&#038;a=3827321786" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></a> von <a href="http://arminhanisch.de/homepage/Home.html">Armin Hanisch</a> gelesen. Alternativ kann man noch das etwas sehr teure und leider auch DRM geschützte <a href="http://www.addison-wesley.de/main/main.asp?page=ebooks/bookdetails&#038;ProductID=120249">eBook bei Addison-Wesley</a> herunterladen. Auch wenn das Buch für Windows-Server 2003 geschrieben wurde, ist es auch für Windows Server 2008 R2 und Windows 7 ein klasse Einstieg in das Skripten mit der Windows Shell <em>cmd.exe</em>. Dabei lernt man die automatisierte Administration von Windows mit vergleichsweise einfachen Shell-Befehlen und ohne umfassende Programmierkenntnisse kennen. Man erfährt aber nicht nur von den  Möglichkeiten, sondern auch von Grenzen der Windows Shell.</p>
<p><span id="more-6817"></span></p>
<p>Microsoft hat lange versäumt, den Befehlsumfang der Kommandozeile an die ständige Weiterentwicklung von Windows anzupassen. Dafür wurde der Windows Script Host (WSH) als Basis für die befehlsbasierte Administration eingeführt, der allerdings Wissen in der objektorientierten Programmierung voraussetzt und dessen Befehle man nicht direkt in die Kommandozeile eingeben kann, sondern nur über eine Skriptsprache wie VBScript. Viele Administratoren von Windows-Servern sind aber nicht bereit, sich Wissen zu diesem Thema anzueignen. Das hat Microsoft auch mitbekommen und neue Kommandozeilenbefehle ab Windows Server 2008 eingeführt und alte, die im Windows Resource Kit gelandet waren, wieder in die Standardinstallation aufgenommen. Dass Microsoft dabei Unix-Administratoren über die Schultern geschaut hat, ist kein Geheimnis, man merkt es an der Entwicklung der PowerShell, aber auch an neuen Befehlen für die Kommandozeilen wie zum Beispiel <code>where</code> und <code>whoami</code>.</p>
<p>Im letzten Kapitel des Buchs prophezeit Armin Hanisch der <em>cmd.exe</em> und der Batch eine düstere Zukunft, da sich 2006 schon die PowerShell angekündigt hat. Aber auch für die PowerShell benötigt man, wenn man sie intensiv nutzen will, wie für den WSH Grundkenntnisse in der objektorientierten Programmierung, die Lernkurve ist also steiler. <a href="http://www.windowspro.de/wolfgang-sommergut/cmd-befehle-powershell-verwenden">Die Befehle der PowerShell, auch Cmdlets genannt, liefern nicht bloß Text zurück</a>, wie die textbasierte Kommandozeile der Windows Shell, sondern gleich .NET-Objekte, deren Eigenschaften man im weiteren Verlauf gezielt ansprechen kann. Wobei es für Windows-Administratoren oder Power-User unbedingt lohnt, sich in die PowerShell einzuarbeiten, um Windows zu automatisieren. Einfacher geht das aber immer noch mit der <em>cmd.exe</em>, ihren mächtigen Befehlen wie <code>for</code> oder <code>wmic</code> und Batchskripten, wenn man nicht programmieren mag. Daher denke ich, dass uns Batchdateien noch eine ganze Weile begleiten werden, und ich hoffe, dass es bald eine überarbeitete Neuauflage des Buchs für Windows Server 2008 R2 geben wird.</p>
<p>Da man mit der Windows Shell schnell an seine Grenzen stößt, geht es in einem interessanten Kapitel des Buchs um das Zusammenspiel zwischen Batch und VBScript, <a href="http://www.datenteiler.de/wie-man-in-der-batch-professionelle-fenster-erzeugt/">um zum Beispiel Messageboxen zu erstellen</a>. Man muss den Code aber nicht unbedingt in eine temporäre Datei auslagern, es geht auch mit einem <em>here document</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;">' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> cls
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #b1b100; font-weight: bold;">title</span> mixed.bat - VBScript und Batch <span style="color: #00b100; font-weight: bold;">in</span> einer Datei
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Das ist die Windows Shell
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> time /t
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #b1b100; font-weight: bold;">echo</span>.
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Schau doch  mal unter eventvwr.msc nach<span style="color: #33cc33;">!</span>
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #b1b100; font-weight: bold;">echo</span>.
' 2<span style="color: #33cc33;">&gt;</span><span style="color: #0000ff; font-weight: bold;">nul</span> <span style="color: #33cc33;">&amp;</span> cscript //Nologo //E:vbs <span style="color: #33cc33;">%</span><span style="color: #448888;">~f0</span>
<span style="color: #b100b1; font-style: italic;">
:: WScript.Echo &quot;Das ist der WSH!&quot; &amp; vbCrLf</span>
<span style="color: #b100b1; font-style: italic;">:: set sh = WScript.CreateObject(&quot;WScript.Shell&quot;)</span>
<span style="color: #b100b1; font-style: italic;">:: sh.LogEvent 2, &quot;Kaffe ist alle&quot;</span>
<span style="color: #b100b1; font-style: italic;">:: set sh = Nothing</span></pre></div></div>

<p>Die Batch kennt das Hochkomma nicht und reagiert mit einer Fehlermeldung, die dann mit <code>2&gt;nul</code> ins Nirvana geschickt wird. Anschließend wird der nächste Befehl mit dem &#038;-Zeichen angeknüpft. Der Teil mit dem VBScript besteht für das Shell Script nur aus Kommentaren, wie man an den beiden Doppelpunkten sieht. VBScript wiederum sieht das Hochkomma als Kommentarzeichen an und ignoriert deshalb das Batchprogramm. Der Doppelpunkt ist in VBScript ein Trennzeichen für mehrere Befehle in einer Zeile, womit <code>::</code> zwar ein gültiger Befehl ist, in diesem Fall aber nichts bewirkt.</p>
<p><strong>Batch und PowerShell mit dem Parameter </strong><strong><em>Command</em></strong></p>
<p>Das Mischen von Batch und Powershell ist wesentlich eleganter. Schnell und einfach funktioniert das mit einem Einzeiler, weil man der PowerShell im Gegensatz zum WSH über den Parameter <code>-Command</code> einzelne Befehle übergeben kann:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
<span style="color: #b1b100; font-weight: bold;">title</span> cmdPS.bat - Demo um ein PowerShell-Skript von einem Batch zu starten
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b1b100; font-weight: bold;">echo</span> Das ist die Windows Shell
<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">time:~0,-3</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">echo</span>.
&nbsp;
powershell -command &quot;<span style="color: #33cc33;">&amp;</span> {Write-Host;Write-Warning 'Starte PowerShell';gps power*,cmd*;Write-Host;Write-Warning 'Beende PowerShell'}&quot;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b1b100; font-weight: bold;">echo</span> Das ist wieder die Windows Shell
<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">time:~0,-3</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">echo</span>. 
<span style="color: #b1b100; font-weight: bold;">pause</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #00b100; font-weight: bold;">exit</span> /b</pre></div></div>

<p>Nun, was macht man aber, wenn man einen ganzen Skriptblock verarbeiten will? Ein schönes Beispiel dafür habe ich im französischsprachigen <a href="http://walid-toumi.blogspot.com/2011/04/inclure-du-code-ps-dans-un-fichier.html">Blog von Walid Toumi</a> gefunden, welches ich aber ein bisschen abgewandelt habe:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
<span style="color: #b1b100; font-weight: bold;">title</span> cmdPS.bat - Demo um ein PowerShell-Skript von einem Batch zu starten
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b1b100; font-weight: bold;">echo</span> Das ist die Windows Shell
<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">time:~0,-3</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b100b1; font-style: italic;">
:: Begin Function Get-Test</span>
<span style="color: #00b100; font-weight: bold;">for</span> /f &quot;delims=:&quot; <span style="color: #33cc33;">%%</span><span style="color: #448888;">a</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #33cc33;">(</span>'
     findstr /BN &quot;::<span style="color: #33cc33;">@</span>PS$Get-Test&quot; <span style="color: #33cc33;">%</span><span style="color: #448888;">~f0</span>
 '<span style="color: #33cc33;">)</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #b1b100; font-weight: bold;">set</span> /a Line=<span style="color: #33cc33;">%%</span><span style="color: #448888;">a</span>
 more +<span style="color: #33cc33;">%</span><span style="color: #448888;">Line</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">~f0</span>  <span style="color: #33cc33;">|</span> powershell -command -
<span style="color: #b100b1; font-style: italic;">:: End Function Get-Test</span>
&nbsp;
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b1b100; font-weight: bold;">echo</span> Das ist wieder die Windows Shell
<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">time:~0,-3</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">echo</span>. 
<span style="color: #b1b100; font-weight: bold;">pause</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #00b100; font-weight: bold;">exit</span> /b 
<span style="color: #b100b1; font-style: italic;">
::@PS$Get-Test</span>
Function Get-Test {
  param<span style="color: #33cc33;">()</span>
  Begin{
    Write-Warning &quot;Starte PowerShell&quot; 
  }
  Process{
    gps power*,cmd*  
    <span style="color: #33cc33;">&lt;</span># 
      Kommentarblock
    #<span style="color: #33cc33;">&gt;</span>
  }
  End{
   Write-Host
   Write-Warning &quot;Beende PowerShell&quot;
  }
}
Get-Test
&nbsp;
<span style="color: #00b100; font-weight: bold;">exit</span>
<span style="color: #b100b1; font-style: italic;">:: End Function Get-Test</span></pre></div></div>

<p>Zentrale Punkte des Skripts sind die For-Schleife, der Findstr- und der More-Befehl, sowie letztendlich der PowerShell Parameter <code>-command</code> oder kurz <code>-c</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #b100b1; font-style: italic;">:: Begin Function Get-Test</span>
<span style="color: #00b100; font-weight: bold;">for</span> /f &quot;delims=:&quot; <span style="color: #33cc33;">%%</span><span style="color: #448888;">a</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #33cc33;">(</span>'
     findstr /BN &quot;::<span style="color: #33cc33;">@</span>PS$Get-Test&quot; <span style="color: #33cc33;">%</span><span style="color: #448888;">~f0</span>
 '<span style="color: #33cc33;">)</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #b1b100; font-weight: bold;">set</span> /a Line=<span style="color: #33cc33;">%%</span><span style="color: #448888;">a</span>
 more +<span style="color: #33cc33;">%</span><span style="color: #448888;">Line</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">~f0</span>  <span style="color: #33cc33;">|</span> powershell -command -
<span style="color: #b100b1; font-style: italic;">:: End Function Get-Test</span></pre></div></div>

<p>Bei der For-Schleife steht die Option <code>/f</code> für das Durchsuchen von Dateien (engl. <em>files</em>). Mit <code>delims=:</code> wird der Doppelpunkt als Trennzeichen festgelegt. Warum der Doppelpunkt, oder warum überhaupt ein Trennzeichen? Weil <code>findstr</code> — das einzige Werkzeug, das in der Windows Shell mit <code>grep</code> vergleichbar ist — wegen der Option <code>/B</code> in jeder Zeile des Skripts, dafür steht <code>%~f0</code>, schaut, ob sie mit dem Ausdruck &#8220;::@PS$Get-Test&#8221; beginnt. Der Ausdruck ist dabei beliebig, es sollte bloß eine Zeichenfolge sein, die so weder in einer Batchdatei noch in einem PowerShell-Skript vorkommt. Wenn das der Fall ist, sorgt die Option <code>/N</code> dafür, dass die Zeilennummer, in diesem Fall 21, mit <code>set /a Line=%%a</code> der Variable <code>Line</code> übergeben wird. Das Ergebnis von <code>findstr</code> sieht folgendermaßen aus: <code>21:@::PS$Get-Test</code>. Da wir aber nur die Zeilennummer brauchen, schneiden wir den Teil danach inklusive des Doppelpunkts einfach mit <code>"delims=:"</code> ab. Die Zeilenummer wird für das Kommando <code>more</code> benötigt, das mit der Anzeige des PowerShell-Codes aus der Batchdatei ab dieser Zeile beginnt: <code>more +%Line% %~f0</code>. Das Ergebnis wird dann direkt an die PowerShell weitergeleitet. Durch den Paramter <code>-Command</code> werden die angegebenen Befehle so ausgeführt, als wären sie direkt in der PowerShell-Eingabeaufforderung eingegeben worden, so wie bei dem Beispiel mit dem Einzeiler weiter oben. Wenn nach <code>-Command</code> ein &#8220;-&#8221; folgt, kann die Zeichenfolge auch ein Skriptblock sein, was uns hier zugute kommt, da durch <code>more</code> und der Verkettung mit <code>|</code> ja schließlich ein Skriptblock an die PowerShell weitergeleitet wird. Im PowerShell-Skriptblock wird die Funktion <code>Get-Test</code>  definiert, die nichts weiter aufregendes macht, als alle PowerShell- und CMD-Prozesse anzuzeigen. Am Ende wird die Funktion mit <code>Get-Test</code> ausgeführt und die PowerShell mit <code>exit</code> wieder beendet.</p>
<p><strong>Batch und PowerShell mit dem Parameter </strong><strong><em>EncodedCommand</em></strong></p>
<p>Als weitere Möglichkeit, Batch- und PowerShell-Code zu mischen, kann man den <a href="http://dmitrysotnikov.wordpress.com/2008/06/27/powershell-script-in-a-bat-file/">Skriptblock mit Base64 codieren</a>. Dazu muss man den Block an eine Variable übergeben, beispielsweise mit <code>$code = {}</code>. Alles was zwischen den geschweiften Klammern steht landet in der Variable <code>$code</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #800080;">$code</span> <span style="color: pink;">=</span> <span style="color: #000000;">&#123;</span>
<span style="color: #0000FF;">Function</span> Get<span style="color: pink;">-</span>Test <span style="color: #000000;">&#123;</span>
  <span style="color: #0000FF;">param</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
  Begin<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-weight: bold;">Write-Warning</span> <span style="color: #800000;">&quot;Starte PowerShell&quot;</span> 
  <span style="color: #000000;">&#125;</span>
  Process<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-weight: bold;">gps</span> power<span style="color: pink;">*,</span>cmd<span style="color: pink;">*</span>  
    <span style="color: #008000;">&lt;# 
      Kommentarblock
    #&gt;</span>
  <span style="color: #000000;">&#125;</span>
  End<span style="color: #000000;">&#123;</span>
   <span style="color: #008080; font-weight: bold;">Write-Host</span>
   <span style="color: #008080; font-weight: bold;">Write-Warning</span> <span style="color: #800000;">&quot;Beende PowerShell&quot;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Danach wird der Inhalt der Variable konvertiert:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>convert<span style="color: #000000;">&#93;</span>::ToBase64String<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#91;</span>Text.Encoding<span style="color: #000000;">&#93;</span>::Unicode.GetBytes<span style="color: #000000;">&#40;</span><span style="color: #800080;">$code</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>Der mit Base64 codierte Block muss dann in einer Zeile in die Batchdatei eingefügt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
<span style="color: #b1b100; font-weight: bold;">title</span> cmdPS.bat - Demo um ein PowerShell-Skript von einem Batch zu starten
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b1b100; font-weight: bold;">echo</span> Das ist die Windows Shell
<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">time:~0,-3</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">echo</span>.
&nbsp;
powershell -EncodedCommand DQAKAEYAdQBuAGMAdABpAG8AbgAgAEcAZQB0AC0AVABlAHMAdAAgAHsADQAKACAAIABwAGEAcgBhAG0AKAApAA0ACgAgACAAQgBlAGcAaQBuAHsADQAKACAAIAAgACAAVwByAGkAdABlAC0AVwBhAHIAbgBpAG4AZwAgACIAUwB0AGEAcgB0AGUAIABQAG8AdwBlAHIAUwBoAGUAbABsACIAIAANAAoAIAAgAH0ADQAKACAAIABQAHIAbwBjAGUAcwBzAHsADQAKACAAIAAgACAAZwBwAHMAIABwAG8AdwBlAHIAKgAsAGMAbQBkACoAIAAgAA0ACgAgACAAIAAgADwAIwAgAA0ACgAgACAAIAAgACAAIABLAG8AbQBtAGUAbgB0AGEAcgBiAGwAbwBjAGsADQAKACAAIAAgACAAIwA+AA0ACgAgACAAfQANAAoAIAAgAEUAbgBkAHsADQAKACAAIAAgAFcAcgBpAHQAZQAtAEgAbwBzAHQADQAKACAAIAAgAFcAcgBpAHQAZQAtAFcAYQByAG4AaQBuAGcAIAAiAEIAZQBlAG4AZABlACAAUABvAHcAZQByAFMAaABlAGwAbAAiAA0ACgAgACAAfQANAAoAfQANAAoARwBlAHQALQBUAGUAcwB0AA0ACgA=
&nbsp;
<span style="color: #b1b100; font-weight: bold;">echo</span>.
<span style="color: #b1b100; font-weight: bold;">echo</span> Das ist wieder die Windows Shell
<span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">time:~0,-3</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">echo</span>. 
<span style="color: #b1b100; font-weight: bold;">pause</span> <span style="color: #33cc33;">&amp;</span> <span style="color: #00b100; font-weight: bold;">exit</span> /b</pre></div></div>

<p>Der Vorteil dieser Variante liegt darin, dass die Batchdatei übersichtlicher ist. Der Nachteil ist natürlich, dass man keinen direkten Einfluss auf den PowerShell-Code mehr hat und ihn bei jeder Änderung wieder in Base64 umwandeln muss.</p>
<p>Da PowerShell-Skripte aus Sicherheitsgründen nicht ganz so einfach gestartet werden können, eignen sich Batchdateien sehr gut für die Unterstützung von PowerShell-Skripten. Man kann mit den Batchprogrammen zum Beispiel bei der Verteilung von PowerShell-Skripten die ein oder andere Ungewissheit umschiffen, zum Beispiel wenn man nicht weiß, ob das Zielsystem aufgrund der &#8220;Execution Policy&#8221; grundsätzlich bereit ist, Powershell-Skripte auszuführen:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;">powershell <span style="color: #008080; font-style: italic;">-ExecutionPolicy</span> Unrestricted <span style="color: pink;">-</span>c <span style="color: #800000;">&quot;&amp; {write-warning 'Hallo Welt'}; exit&quot;</span></pre></div></div>

<p>Oder, um mit den Remotefähigkeiten der Kommandozeilenwerkzeuge wie <code>AT</code> das Gastsystem gezielt auf den Einsatz eines PowerShell-Skripts vorzubereiten, indem man die PowerShell dort mit einem Taskjob direkt aus dem Taskplaner startet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/batch-und-powershell-in-einer-datei/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie man in der Batch professionelle Fenster erzeugt</title>
		<link>http://www.datenteiler.de/wie-man-in-der-batch-professionelle-fenster-erzeugt/</link>
		<comments>http://www.datenteiler.de/wie-man-in-der-batch-professionelle-fenster-erzeugt/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 14:47:48 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6699</guid>
		<description><![CDATA[Trotz Powershell wird es noch einige Zeit dauern, bis das Batch Scripting mit der cmd.exe ausstirbt. Bis dahin eignet es sich gut dazu, kleine Programme für die Steuerung von Windows zu erstellen. Als Systemverwalter, Entwickler oder Power-User kann man durch den Einsatz von Batch-Skripten einfach und schnell Zeit sparen. Da wir in einer Welt wunderbarer [...]]]></description>
			<content:encoded><![CDATA[<p>Trotz Powershell wird es noch einige Zeit dauern, bis das <a href="http://de.wikibooks.org/wiki/Batch-Programmierung">Batch Scripting</a> mit der <code>cmd.exe</code> ausstirbt. Bis dahin eignet es sich gut dazu, kleine Programme für die Steuerung von Windows zu erstellen. Als Systemverwalter, Entwickler oder Power-User kann man durch den Einsatz von Batch-Skripten einfach und schnell Zeit sparen. Da wir in einer Welt wunderbarer Aufklapp- und Popup-Menüs leben, wünschen sich viele Anwender diese Funktionen auch in der Shell, was die <code>cmd.exe</code> aber nicht bietet. Es gibt allerdings einen Trick, indem man ein <a href="http://de.wikibooks.org/wiki/Visual_Basic_Script_(VBS)">temporäres VBScript</a> erstellt, das dann ein Fenster erzeugt. Damit  sorgt man in seinem Batchprogramm nicht nur für mehr Übersicht und mehr Professionalität in den Augen des Anwenders, man kann auch Variablen zwischen dem VBScript umd dem Batchprogramm austauschen.</p>
<p><span id="more-6699"></span></p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
<span style="color: #b1b100; font-weight: bold;">title</span> Demo um Variablen von VBScript an CMD zuzuweisen
color 2F
mode 55,9
<span style="color: #b100b1; font-style: italic;">
:: Set variable for InputBox:</span>
<span style="color: #b1b100; font-weight: bold;">set</span> myMessage=Hallo, wie ist dein Name?
<span style="color: #b1b100; font-weight: bold;">set</span> myTitle=Bitte Namen eingeben
<span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">subInputBox</span>
<span style="color: #b100b1; font-style: italic;">
:: Display variable</span>
<span style="color: #00b100; font-weight: bold;">if</span> &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">flag</span><span style="color: #33cc33;">%</span>&quot;==&quot;false&quot; <span style="color: #33cc33;">(</span>
	<span style="color: #b1b100; font-weight: bold;">set</span> myMessage=Es wurde nichts eingegeben, oder die Eingabe abgebrochen.
	<span style="color: #b1b100; font-weight: bold;">set</span> myTitle=Keine Eingabe
	<span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">subMsgBox</span>
<span style="color: #33cc33;">)</span> <span style="color: #00b100; font-weight: bold;">else</span> <span style="color: #33cc33;">(</span>
	<span style="color: #b1b100; font-weight: bold;">set</span> myMessage=Hallo <span style="color: #33cc33;">%</span><span style="color: #448888;">cmdText</span><span style="color: #33cc33;">%!</span>
	<span style="color: #b1b100; font-weight: bold;">set</span> myTitle=Begrüßung
	<span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">subMsgBox</span>
<span style="color: #33cc33;">)</span>
<span style="color: #00b100; font-weight: bold;">goto</span> End
<span style="color: #b100b1; font-style: italic;">
:: Start subroutine subInputBox</span>
:<span style="color: #b100b1; font-weight: bold;">subInputBox</span>
<span style="color: #b1b100; font-weight: bold;">set</span> VBS=&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\vbsInputBox.vbs&quot;
<span style="color: #b1b100; font-weight: bold;">set</span> CMD=&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\cmdVar.bat&quot;
&nbsp;
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Option Explicit 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim strText  
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objShell : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objShell = CreateObject<span style="color: #33cc33;">(</span>&quot;Wscript.Shell&quot;<span style="color: #33cc33;">)</span>  
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objFSO   : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objFSO = CreateObject<span style="color: #33cc33;">(</span>&quot;Scripting.FileSystemObject&quot;<span style="color: #33cc33;">)</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objFile  : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objFile = objFSO.CreateTextFile<span style="color: #33cc33;">(%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%)</span> 
<span style="color: #b100b1; font-style: italic;">:: Pass variable from batch to VBScript</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> strText = InputBox<span style="color: #33cc33;">(</span>&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myMessage</span><span style="color: #33cc33;">%</span>&quot;, &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myTitle</span><span style="color: #33cc33;">%</span>&quot;<span style="color: #33cc33;">)</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #00b100; font-weight: bold;">if</span> strText = vbNullString then 
<span style="color: #b100b1; font-style: italic;">:: Create batch file</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off&quot;
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #b1b100; font-weight: bold;">set</span> flag=false&quot; 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #00b100; font-weight: bold;">else</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off&quot;
<span style="color: #b100b1; font-style: italic;">:: Set variable in batch file</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #b1b100; font-weight: bold;">set</span> cmdText=&quot; <span style="color: #33cc33;">^&amp;</span> strText  
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> end <span style="color: #00b100; font-weight: bold;">if</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.Close  
&nbsp;
cscript <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">&gt;</span> <span style="color: #0000ff; font-weight: bold;">NUL</span>
<span style="color: #00b100; font-weight: bold;">call</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">&gt;</span> <span style="color: #0000ff; font-weight: bold;">NUL</span>
&nbsp;
<span style="color: #b1b100; font-weight: bold;">del</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">del</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span>
&nbsp;
<span style="color: #00b100; font-weight: bold;">goto</span> :<span style="color: #b100b1; font-weight: bold;">EOF</span>
<span style="color: #b100b1; font-style: italic;">:: End subroutine subInputBox</span>
<span style="color: #b100b1; font-style: italic;">
:: Start subroutine subMsgBox</span>
:<span style="color: #b100b1; font-weight: bold;">subMsgBox</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\MsgBox.vbs <span style="color: #b1b100; font-weight: bold;">echo</span> MsgBox &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myMessage</span><span style="color: #33cc33;">%</span>&quot;, VbInformation + VbOKOnly, &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myTitle</span><span style="color: #33cc33;">%</span>&quot; 
cscript <span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\MsgBox.vbs <span style="color: #33cc33;">&gt;</span> <span style="color: #0000ff; font-weight: bold;">NUL</span>
<span style="color: #b1b100; font-weight: bold;">del</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\MsgBox.vbs
<span style="color: #00b100; font-weight: bold;">goto</span> :<span style="color: #b100b1; font-weight: bold;">EOF</span>
<span style="color: #b100b1; font-style: italic;">:: End of subroutine subMsgBox</span>
<span style="color: #b100b1; font-style: italic;">
:: End of batch file</span>
:<span style="color: #b100b1; font-weight: bold;">End</span></pre></div></div>

<p>Schauen wir uns das Skript Stück für Stück an, allerdings um ein paar Kommentare gekürzt, die mit den beiden Doppelpunkten <code>::</code> beginnen.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off
<span style="color: #b1b100; font-weight: bold;">title</span> Demo um Variablen von VBScript an CMD zuzuweisen
color 2F
mode 55,9</pre></div></div>

<p>Das @-Zeichen ganz am Anfang des Skripts stellt die Ausgabe der Befehlszeile auf dem Bildschirm für den aktuellen Befehl aus. In diesem Fall ist es <code>echo off</code>, der die Befehlszeile für alle nachfolgenden Befehle ausschaltet, zumindest solange, bis ein <code>echo on</code> kommt. Danach werden Titel, Farbe und Form der aktuellen <code>cmd.exe</code> festgelegt.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">set</span> myMessage=Hallo, wie ist dein Name?
<span style="color: #b1b100; font-weight: bold;">set</span> myTitle=Bitte Namen eingeben
<span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">subInputBox</span></pre></div></div>

<p>Mit <code>set</code> werden zwei Variablen <code>myMessage</code> und <code>myTitle</code> definiert, die den beschreibenden Text für die InputBox des VBScripts beinhalten. Anschließend wird mit <code>call</code> die Subroutine <code>subInputBox</code> aufgerufen. Seit Windows 2000 sind <a href="http://www.robvanderwoude.com/goto.php">einfache Subroutinen in der Windows Shell</a> möglich, indem vor der Subroutinen eine Sprungmarke definiert wird. Mit dem Aufruf <code>call :&lt;lable&gt;</code> wird der Ablauf des Skripts zum angegebenen Sprungziel geleitet. Nachdem die Ausführung in der Subroutine durch <code>goto :EOF</code> beendet wird, springt der Ablauf auf die Zeile hinter <code>call :&lt;lable&gt;</code> zurück und wird dort fortgesetzt. Um den logischen Ablauf des Skripts zu folgen, springen wir jetzt auch dort hin:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #b100b1; font-style: italic;">:: Start subroutine subInputBox</span>
:<span style="color: #b100b1; font-weight: bold;">subInputBox</span>
<span style="color: #b1b100; font-weight: bold;">set</span> VBS=&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\vbsInputBox.vbs&quot;
<span style="color: #b1b100; font-weight: bold;">set</span> CMD=&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\cmdVar.bat&quot;
&nbsp;
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Option Explicit 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim strText  
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objShell : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objShell = CreateObject<span style="color: #33cc33;">(</span>&quot;Wscript.Shell&quot;<span style="color: #33cc33;">)</span>  
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objFSO   : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objFSO = CreateObject<span style="color: #33cc33;">(</span>&quot;Scripting.FileSystemObject&quot;<span style="color: #33cc33;">)</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objFile  : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objFile = objFSO.CreateTextFile<span style="color: #33cc33;">(%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%)</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> strText = InputBox<span style="color: #33cc33;">(</span>&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myMessage</span><span style="color: #33cc33;">%</span>&quot;, &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myTitle</span><span style="color: #33cc33;">%</span>&quot;<span style="color: #33cc33;">)</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #00b100; font-weight: bold;">if</span> strText = vbNullString then 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off&quot;
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #b1b100; font-weight: bold;">set</span> flag=false&quot; 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #00b100; font-weight: bold;">else</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #33cc33;">@</span><span style="color: #b1b100; font-weight: bold;">echo</span> off&quot;
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #b1b100; font-weight: bold;">set</span> cmdText=&quot; <span style="color: #33cc33;">^&amp;</span> strText  
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> end <span style="color: #00b100; font-weight: bold;">if</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.Close  
&nbsp;
cscript <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">&gt;</span> <span style="color: #0000ff; font-weight: bold;">NUL</span>
<span style="color: #00b100; font-weight: bold;">call</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%</span> <span style="color: #33cc33;">&gt;</span> <span style="color: #0000ff; font-weight: bold;">NUL</span>
&nbsp;
<span style="color: #b1b100; font-weight: bold;">del</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%</span>
<span style="color: #b1b100; font-weight: bold;">del</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span>
&nbsp;
<span style="color: #00b100; font-weight: bold;">goto</span> :<span style="color: #b100b1; font-weight: bold;">EOF</span>
<span style="color: #b100b1; font-style: italic;">:: End subroutine subInputBox</span></pre></div></div>

<p>Am Anfang steht die Sprungmarke <code>:subInputBox</code>, zu der uns der Call-Aufruf geführt hat. Danach werden die Variablen <code>VBS</code> und <code>CMD</code> mit den Dateinamen gesetzt in denen der Code für das VBScript und die Batchdatei geschrieben werden. Durch die Umgebungsvariable <code>%Temp%</code> werden die beiden Dateien auch gleich in den temporären Ordner gespeichert. Dann wird jede einzelne Zeile des VBScripts mit Hilfe der Ausgabeumleitung <code>&gt;&gt;</code> der Reihe nach in die VBS-Datei geschrieben, deren Name zusammen mit den Pfad in der Variable %VBS% gespeichert wurde. Dabei sind folgende Zeilen interessant:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> Dim objFile  : <span style="color: #b100b1; font-weight: bold;"><span style="color: #b1b100; font-weight: bold;">Set</span></span> objFile = objFSO.CreateTextFile<span style="color: #33cc33;">(%</span><span style="color: #448888;">CMD</span><span style="color: #33cc33;">%)</span> 
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> strText = InputBox<span style="color: #33cc33;">(</span>&quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myMessage</span><span style="color: #33cc33;">%</span>&quot;, &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myTitle</span><span style="color: #33cc33;">%</span>&quot;<span style="color: #33cc33;">)</span></pre></div></div>

<p>Über die Batch-Variablen <code>%CMD%</code>, <code>%myMessage%</code> und <code>%myTitle%</code> werden Variablen bzw. deren Inhalt im VBScript gesetzt. In einer Zeile weiter unten ist das ganze dann andersherum: Eine Variable wird vom VBScript zurück in die Batchdatei geschrieben.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">VBS</span><span style="color: #33cc33;">%</span> <span style="color: #b1b100; font-weight: bold;">echo</span> objFile.WriteLine &quot;<span style="color: #b1b100; font-weight: bold;">set</span> cmdText=&quot; <span style="color: #33cc33;">^&amp;</span> strText</pre></div></div>

<p>Dabei muss man allerdings darauf achten, dass das <code>&amp;</code>-Zeichen mit einem <code>^</code> maskiert wird. Wenn man ein für die Batchdatei besonderes Zeichen benutzt, muss man es mit dem sogenannten <em>Escape</em>-Zeichen kennzeichnen, was auch <em>quoten</em> genannt wird. Auf diese Weise kann man auch XML-Dateien erzeugen, obwohl die Symbole für die Ein- und  Ausgabeumleitung für Dateien <code>&lt;</code> und <code>&gt;</code> schon belegt sind.</p>
<p>Wenn das VBScript erstellt ist, wird es mit <code>cscript %VBS%</code> aufgerufen. Dabei startet <code>cscript</code> das Skript  mit dem <em>Windows Scripting Host</em> im Kontext der Kommandozeile. Sollte dabei irgendeine Ausgabe auf der Konsole erfolgen wird das Ergebnis mit der Umleitung <code>&gt; nul</code> ins Nirwana geschickt. Danach ruft <code>call %CMD%</code> die Batchdatei auf, die das VBScript erstellt hat. Wenn das erledigt ist, räumt der Befehl <code>del</code> auf, indem die beiden Dateien wieder gelöscht werden. Mit <code>goto :EOF</code> wird die Subroutine verlassen und zurück zum Ausgangspunkt gesprungen.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #00b100; font-weight: bold;">if</span> &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">flag</span><span style="color: #33cc33;">%</span>&quot;==&quot;false&quot; <span style="color: #33cc33;">(</span>
	<span style="color: #b1b100; font-weight: bold;">set</span> myMessage=Es wurde nichts eingegeben, oder die Eingabe abgebrochen.
	<span style="color: #b1b100; font-weight: bold;">set</span> myTitle=Keine Eingabe
	<span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">subMsgBox</span>
<span style="color: #33cc33;">)</span> <span style="color: #00b100; font-weight: bold;">else</span> <span style="color: #33cc33;">(</span>
	<span style="color: #b1b100; font-weight: bold;">set</span> myMessage=Hallo <span style="color: #33cc33;">%</span><span style="color: #448888;">cmdText</span><span style="color: #33cc33;">%!</span>
	<span style="color: #b1b100; font-weight: bold;">set</span> myTitle=Begrüßung
	<span style="color: #00b100; font-weight: bold;">call</span> :<span style="color: #b100b1; font-weight: bold;">subMsgBox</span>
<span style="color: #33cc33;">)</span>
<span style="color: #00b100; font-weight: bold;">goto</span> End</pre></div></div>

<p>Weiter geht es mit einer If-Bedingung. Der Inhalt der Variable <code>%flag%</code> wurde durch das VBScript an die temporäre Batchdatei <code>cmdVar.bat</code> übergeben, die dadurch den Weg in die aktuelle Batchdatei gefunden hat. Man könnte auch auf die Idee kommen, statt eines Flags eine Sprungmarke mit <code>goto</code> zu verwenden. Dummerweise lassen sich keine Sprungmarke von einer Batchdatei in eine andere übertragen. </p>
<p>Mit der If-Bedingung kann man anhand des Flags entscheiden, welcher Knopf in der InputBox gedrückt worden ist, <em>OK</em> oder <em>Abbruch</em>. Wurde <em>Abbruch</em> geklickt bzw. im Eingabefeld nichts eingegeben wird die Flag-Variable auf <em>False</em> gesetzt und der If-Zweig ausgeführt. Andernfalls kommt der Else-Zweig zum Einsatz. Mehrere Befehle können durch runde Klammern gruppiert werden, um den Code besser zu strukturieren. Zeilenumbrüche und Einrückungen sind dabei in Ordnung, wobei man beachten muss, dass die öffnende Klammer in der gleichen Zeile steht wie der If-Befehl, und dass vor dem Else-Befehl die schließende und danach wieder die  öffnende Klammer in derselben Zeile stehen müssen. Hinter der schließenden und vor der öffnenden Klammer muss ein Leerzeichen sein, sonst funktioniert es nicht.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #b100b1; font-style: italic;">:: Start subroutine subMsgBox</span>
:<span style="color: #b100b1; font-weight: bold;">subMsgBox</span>
<span style="color: #33cc33;">&gt;&gt;</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\MsgBox.vbs <span style="color: #b1b100; font-weight: bold;">echo</span> MsgBox &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myMessage</span><span style="color: #33cc33;">%</span>&quot;, VbInformation + VbOKOnly, &quot;<span style="color: #33cc33;">%</span><span style="color: #448888;">myTitle</span><span style="color: #33cc33;">%</span>&quot; 
cscript <span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\MsgBox.vbs <span style="color: #33cc33;">&gt;</span> <span style="color: #0000ff; font-weight: bold;">NUL</span>
<span style="color: #b1b100; font-weight: bold;">del</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">Temp</span><span style="color: #33cc33;">%</span>\MsgBox.vbs
<span style="color: #00b100; font-weight: bold;">goto</span> :<span style="color: #b100b1; font-weight: bold;">EOF</span>
<span style="color: #b100b1; font-style: italic;">:: End of subroutine subMsgBox</span></pre></div></div>

<p>In beiden Zweigen der If-Bedingung werden mit <code>set</code> Variablen definiert und danach die Subroutine <code>subMsgBox</code> aufgerufen, mit der wiederum ein VBScript erstellt wird, um eine MessageBox zu erzeugen. Nach dem Aufruf der MessageBox wird die temporäre Datei gelöscht und die Subroutine mit <code>goto :EOF</code> wieder verlassen. Das sich anschließende <code>goto End</code> überspringt die beiden Subroutinen und führt den Programmablauf an das Ende der Batchdatei.</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #b100b1; font-style: italic;">:: End of batch file</span>
:<span style="color: #b100b1; font-weight: bold;">End</span></pre></div></div>

<p>Es ist natürlich einfacher, die ganze Geschichte gleich in VBScript zu programmieren, doch es geht hier um die Demonstration professionell aussehende Fenster in einer Batchdatei zu erstellen und den Inhalt von Variablen aus der Batchdatei in diese Fenster zu übergeben und umgekehrt.</p>
<p><strong>Literatur:</strong></p>
<ul>
<li> <a href="http://de.wikibooks.org/wiki/Batch-Programmierung">Batch-Programmierung</a></li>
<li><a href="http://de.wikibooks.org/wiki/Visual_Basic_Script_(VBS)">Visual Basic Script (VBS)</a></li>
<li><a href="http://www.amazon.de/gp/product/3827321786/ref=as_li_qf_sp_asin_tl?ie=UTF8&#038;tag=imhorstnet-21&#038;linkCode=as2&#038;camp=1638&#038;creative=6742&#038;creativeASIN=3827321786">Windows 2003 Shell Scripting. Abläufe automatisieren ohne Programmierkenntnisse</a><img src="http://www.assoc-amazon.de/e/ir?t=imhorstnet-21&#038;l=as2&#038;o=3&#038;a=3827321786" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, Armin Hanisch, ISBN 978-3827321787</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/wie-man-in-der-batch-professionelle-fenster-erzeugt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sicher in die Wolke mit EncFS</title>
		<link>http://www.datenteiler.de/sicher-in-die-wolke-mit-encfs/</link>
		<comments>http://www.datenteiler.de/sicher-in-die-wolke-mit-encfs/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 07:34:39 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Gnu/Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6498</guid>
		<description><![CDATA[Mit EncFS kann man unter Linux wichtige Dateien verschlüsseln, die aus irgendeinen Grund über Ubuntu One oder Dropbox in die Cloud sollen, und sie können auf Linux-Systemen wie Ubuntu oder Android, aber auch unter Windows, MacOS X und zukünftig unter iOS wieder entschlüsselt werden. In diesem Punkt bietet EncFS einen klaren Vorteil gegenüber anderen Verschlüsselungstools [...]]]></description>
			<content:encoded><![CDATA[<p>Mit EncFS kann man unter Linux wichtige Dateien verschlüsseln, die aus irgendeinen Grund über Ubuntu One oder Dropbox in die Cloud  sollen, und sie können auf Linux-Systemen wie Ubuntu oder Android, aber auch unter Windows, MacOS X und zukünftig unter iOS wieder entschlüsselt werden. In diesem Punkt bietet EncFS einen klaren Vorteil gegenüber anderen Verschlüsselungstools wie Truecrypt oder GnuPG.</p>
<p><span id="more-6498"></span></p>
<p><strong>EncFS unter Ubuntu</strong></p>
<p>In der <a href="http://www.ubuntu-user.de/Heft/Heftarchiv/2012/1">aktuellen Ubuntu-User</a> zeigt der Artikel &#8220;Sicher in die Wolke&#8221;, wie man seine Dateien mit GnuPG verschlüsseln kann, bevor man sie einer Cloud-Anwendung wie Ubuntu One oder Dropbox übergibt und wieder entschlüsselt. Da das Ver- und Entschlüsseln der Dateien dabei im Terminal stattfindet, wirkt das Verfahren unnötig kompliziert. Die Webseite <a href="http://www.nosinmiubuntu.com/2011/11/cifrar-una-carpeta-con-cryptkeeper_07.html">nosinmiubuntu</a> zeigt, wie es mit Cryptkeeper und <a href="http://wiki.ubuntuusers.de/EncFS">EncFS</a> unter Ubuntu <del datetime="2011-11-28T18:12:39+00:00">10.</del>11.10 Oneiric Ocelot und Unity einfacher geht. Da sich Cryptkeeper und EncFS in den Repositories von Oneiric befinden, kann man beide Programme über das Software-Center oder über das Terminal installieren:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> cryptkeeper encfs</pre></div></div>

<p><strong>Einrichten des Panel Applets</strong></p>
<p>Damit Cryptkeeper nach dem nächsten Ab- und wieder Anmelden des Benutzers als Panel Applet im System-Tray von Unity erscheint, muss man das Programm in eine sogenannte &#8220;Whitelist&#8221; eintragen. Im Gegensatz zu Gnome ist das <a href="http://wiki.ubuntuusers.de/Unity/FAQ">Panel Applet in Unity ziemlich eingeschränkt</a>. Am einfachsten kann man sich alle Applets anzeigen lassen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">gsettings <span style="color: #000000; font-weight: bold;">set</span> com.canonical.Unity.Panel systray-whitelist <span style="color: #ff0000;">&quot;['all']&quot;</span></pre></div></div>

<p>Die unerwünschte Nebenwirkung ist dann aber, dass man wirklich alle Applets im Panel sieht. Will man nur das Panel Applet von Cryptkeeper zusätzlich zulassen, sollte man erst einmal schauen, welche Applets bereits auf der Whitelist stehen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">gsettings get com.canonical.Unity.Panel systray-whitelist</pre></div></div>

<p>Wenn die Ausgabe nichts anzeigt, reicht ein</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">gsettings <span style="color: #000000; font-weight: bold;">set</span> com.canonical.Unity.Panel systray-whitelist <span style="color: #ff0000;">&quot;['Cryptkeeper']&quot;</span></pre></div></div>

<p>um Cryptkeeper zum Panel hinzu zufügen. Sieht die Ausgabe aber wie im folgenden Beispiel aus,</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gsettings get com.canonical.Unity.Panel systray-whitelist
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'JavaEmbeddedFrame'</span>, <span style="color: #ff0000;">'Mumble'</span>, <span style="color: #ff0000;">'Wine'</span>, <span style="color: #ff0000;">'Skype'</span>, <span style="color: #ff0000;">'hp-systray'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>sollte man Cryptkeeper an das Ende der Liste setzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gsettings <span style="color: #000000; font-weight: bold;">set</span> com.canonical.Unity.Panel systray-whitelist <span style="color: #ff0000;">&quot;['JavaEmbeddedFrame', 'Mumble', 'Wine', Skype', 'hp-systray', 'Cryptkeeper']&quot;</span></pre></div></div>

<p>Anschließend sollte man nochmal prüfen, ob es geklappt hat. Wenn die Ausgabe in etwa so, wie die folgende aussieht, scheint es funktioniert zu haben:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gsettings get com.canonical.Unity.Panel systray-whitelist<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'JavaEmbeddedFrame'</span>, <span style="color: #ff0000;">'Mumble'</span>, <span style="color: #ff0000;">'Wine'</span>, <span style="color: #ff0000;">'Skype'</span>, <span style="color: #ff0000;">'hp-systray'</span>, <span style="color: #ff0000;">'Cryptkeeper'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>Danach muss Cryptkeeper noch unter &#8220;Startprogramme&#8221; eingetragen werden. Dazu drückt man die Super-Taste (das ist die ehemalige Windows-Taste) und trägt in das Suchfeld &#8220;Startprogramme&#8221; ein. Das Programm-Icon taucht schon nach nur wenigen Buchstaben auf.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Startprogramme0.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Startprogramme0-300x144.png" alt="" title="Startprogramme0" width="300" height="144" class="aligncenter size-medium wp-image-6519" /></a> </p>
<p>Der Eintrag sieht dann folgendermaßen aus und wird über den Button &#8220;Speichern&#8221; und &#8220;Schließen&#8221; festgeschrieben:</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Startprogramme2.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Startprogramme2-300x245.png" alt="" title="Startprogramme2" width="300" height="245" class="aligncenter size-medium wp-image-6522" /></a></p>
<p>Erst nach dem Ab- und wieder Anmelden werden die Änderungen sichtbar, und man sieht, ob es wirklich geklappt hat, wenn man das Symbol mit dem Schlüsselpaar im Panel sieht:</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Cryptkeeper.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Cryptkeeper.png" alt="" title="Cryptkeeper" width="357" height="77" class="aligncenter size-full wp-image-6526" /></a></p>
<p><strong>Cryptkeeper im Einsatz</strong></p>
<p>Um einen Ordner zu verschlüsseln oder einen bereits mit EncFS verschlüsselten Ordner zu importieren, klickt man mit der linken Maustaste auf das Schlüsselpaar. Um einen neuen verschlüsselten Ordner anzulegen, wählt man &#8220;Erstelle verschlüsselten Ordner&#8221;. </p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Ordner.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Ordner-300x183.png" alt="" title="Ordner" width="300" height="183" class="aligncenter size-medium wp-image-6534" /></a></p>
<p>In dem Fenster, das sich anschließend öffnet, wählt man den übergeordneten Ordner aus, z.B. &#8220;Ubuntu One&#8221; und trägt den Namen des neuen Ordners ein, z.B. &#8220;Dokumente&#8221; und klickt dann, was ein wenig gewöhnungsbedürftig ist, links auf &#8220;Vor&#8221;. Dann trägt man sein Passwort zweimal ein. Das Passwort sollte natürlich nicht zu einfach sein. Man darf es aber auch nicht vergessen, denn dann sind die Daten im verschlüsselten Verzeichnis verloren. Ein Beispiel, für ein <del datetime="2011-11-28T17:52:46+00:00">gutes</del> Passwort, das ein paar Kriterien wie mindestens 8 Zeichen, Buchstaben gemischt mit Zahlen und Sonderzeichen erfüllt, aber auch gleichzeitig leicht zu merken ist, ist das Wort Passwort, wenn man es in dieser oder einer ähnlich Form schreibt:</p>
<p><code>Pa$$w0r+</code></p>
<p>[Update] Bitte beachtet den Kommentar von dakira weiter unten. Zitat: &#8220;Bei einem Dictionary-Angriff werden auch alle möglichen beliebten Substitutionen geprüft.&#8221;[/Update] Ein gutes Verhältnis zwischen praktischem Nutzen und Sicherheit muss aber jeder für sich selbst finden. Bestätigt man das Passwort, indem man wieder links auf &#8220;Vor&#8221; klickt, wird der verschlüsselte Ordner angelegt. Klickt man wieder mit der linken Maustaste auf das Schlüsselsymbol, werden dieser und eventuell andere verschlüsselte Ordner angezeigt. Ist der Ordner geöffnet, sieht man einen Haken davor. </p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Verschluesseln0.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Verschluesseln0.png" alt="" title="Verschluesseln0" width="362" height="187" class="aligncenter size-full wp-image-6546" /></a></p>
<p>Klickt man auf diesen Haken, wird der Ordner geschlossen. Klickt man erneut auf den Eintrag, wird das Passwort angefordert und die Dateien werden wieder entschlüsselt, was unter anderem durch den Haken anzeigt wird.</p>
<p>EncFS ver- und entschlüsselt aber nicht nur Ordner und die darin enthaltenen Dateien, es legt auch einen <a href="http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2010/07/Dateiverschluesselung-mit-EncFS-und-Cryptkeeper">Mount-Punkt für die entschlüsselten Daten</a> an, über den man auf seine Dateien zugreifen kann. Der Mount-Punkt kann leider nicht über den Dateimanager ausgehängt werden, sondern nur über Cryptkeeper, indem man, wie gesagt, den Haken bzw. den Eintrag mit dem Verzeichnis-Pfad anklickt.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Ordner2.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Ordner2-300x236.png" alt="" title="Ordner" width="300" height="236" class="aligncenter size-medium wp-image-6555" /></a></p>
<p>Wie man im Terminal des Bildausschnitts sieht, bildet das FUSE-Framework das Fundament von EncFS, um normalen Nutzern das Mounten von verschlüsselten Verzeichnissen zu ermöglichen. Da EncFS dateiorientiert arbeitet, benötigt man keine eigene Partition und auch keinen Container, wie bei Truecrypt. Auf der anderen Seite hätte Truecrypt aber den Vorteil, dass man auch unter einem anderen Betriebssystem wie zum Beispiel Windows 7 wieder an seine verschlüsselten Daten kommen könnte, da FUSE nur unter Unix- und Gnu/Linux-Systemen verfügbar ist. </p>
<p><strong>EncFS unter Windows</strong></p>
<p>Man kommt an Windows leider nicht immer vorbei, es gibt aber mit <a href="http://members.ferrara.linux.it/freddy77/encfs.html">EncFS4Win</a> glücklicherweise ein Projekt, das einen Port für Windows auf der Basis von <a href="http://dokan-dev.net/en/">Dokan &mdash; user mode file system for windows</a> bereit stellt. Daher installiert man zuerst die <a href="http://dokan-dev.net/en/download/#dokan">aktuelle Dokan-Bibliothek</a>, um danach die <a href="http://members.ferrara.linux.it/freddy77/encfs.html">Datei encfs.zip</a> nach &#8220;C:\Program Files&#8221; zu entpacken. Das Programm ENCFSW.EXE, das man zum Entschlüssen der Ordner startet, bringt schon eine grafische Oberfläche ähnlich wie Cryptkeeper mit. </p>
<p>Man erkennt EncFS4Win an das Schlüsselsymbol in der Taskleiste. Soll das Programm automatisch starten, kann man einen Haken bei der Option &#8220;Start at login&#8221; setzen. Um einen verschlüsselten Ordner zu öffnen oder anzulegen, klickt man auf &#8220;Open/Create&#8221;.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win-300x227.png" alt="" title="encfs4win" width="300" height="227" class="aligncenter size-medium wp-image-6579" /></a></p>
<p>Anschließend wählt man den verschlüsselten Ordner aus.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win1.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win1-300x264.png" alt="" title="encfs4win1" width="300" height="264" class="aligncenter size-medium wp-image-6582" /></a></p>
<p>Da Windows anders als Unix-artige Betriebssysteme keine Mount-Punkte kennt, muss man dem zu entschlüsselnden Ordner einen Laufwerksbuchstaben zuweisen.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win2.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win2.png" alt="" title="encfs4win2" width="233" height="122" class="aligncenter size-full wp-image-6584" /></a> </p>
<p>Der entschlüsselte Inhalt des Ordners steht dann unter diesem Laufwerksbuchstaben bereit. Anders als unter Ubuntu aber nur unter diesem Laufwerksbuchstaben und nicht nochmal innerhalb eines Ordners in Ubuntu One oder im Dropbox-Ordner.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win3.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/encfs4win3-300x209.png" alt="" title="encfs4win3" width="300" height="209" class="aligncenter size-medium wp-image-6586" /></a></p>
<p><strong>EncFS unter Android</strong></p>
<p>Mit <a href="http://blog.boxcryptor.com/how-to-use-boxcryptor-for-android">Boxcrypter</a> aus dem <a href="https://market.android.com/details?id=com.boxcryptor.android">Android-Market</a> hat man sogar die Möglichkeit, seine mit <a href="http://www.webupd8.org/2011/09/dropbox-access-encfs-folders-on-android.html">EncFS verschlüsselten Ordner unter Android</a> zu öffnen. Kleiner Wermutstropfen ist aber, dass das leider nur mit Dropbox funktioniert. Andere Dateisynchronisations-Dienste wie Ubuntu One werden zur Zeit nicht unterstützt. <del datetime="2011-11-28T18:08:16+00:00">Außerdem ist Boxcrypter noch in der Entwicklungsphase und kann verschlüsselte Dateien nur lesen. Die Schreibunterstützung soll aber bald folgen.</del> <a href="http://blog.boxcryptor.com/boxcryptor-for-android-10-available">Seit Anfang Oktober kann die kostenpflichtige Version</a> von BoxCryptor auch innerhalb eines EncFS-Containers schreiben.</p>
<p>Ein weiterer Nachteil von Boxcrypter ist auch, dass es EncFS nicht voll unterstützt. Man muss beim Verschlüsseln der Dateien ein paar EncFS-Optionen deaktivieren, damit es funktioniert. Zuguter letzt ist noch wichtig, dass der Schlüssel nicht von der Synchronisierung durch Dropbox ausgenommen wird. Denn dann funktioniert es nicht.</p>
<p>Um einen verschlüsselten Ordner zu erstellen, der auch unter Android funktioniert, legt man ihn zusammen mit dem Mount-Punkt für das Volumen, in das man später die Dateien kopiert, im Terminal an:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> ~<span style="color: #000000; font-weight: bold;">/</span>Dropbox<span style="color: #000000; font-weight: bold;">/</span>.encrypted
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> ~<span style="color: #000000; font-weight: bold;">/</span>Dropbox<span style="color: #000000; font-weight: bold;">/</span>Dokumente</pre></div></div>

<p>Dann erfolgt die Einrichtung der Verschlüsselung mit EncFS:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">encfs ~<span style="color: #000000; font-weight: bold;">/</span>Dropbox<span style="color: #000000; font-weight: bold;">/</span>.encrypted ~<span style="color: #000000; font-weight: bold;">/</span>Dropbox<span style="color: #000000; font-weight: bold;">/</span>Dokumente</pre></div></div>

<p>Im folgenden Auswahlmenü wählt man dann &#8220;x&#8221; für den Expertenmodus:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Neuer verschlüsselter Datenträger wird erstellt.
Bitte wählen Sie eine der folgenden Optionen:
 &quot;x&quot; für den Expertenmodus,
 &quot;p&quot; für den vorkonfigurierten Paranoia-Modus,
 etwas anderes oder eine Leerzeile wählt den Standard-Modus.
?&gt; x
Manuelle Konfiguration gewählt.</pre></div></div>

<p>Als Verschlüsselungsalgorithmus kann man AES wählen,</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Die folgenden Verschlüsselungsalgorithmen sind verfügbar
1. AES : 16 byte block cipher
 unterstützte Schlüssellänge zwischen 128 und 256 Bits
 unterstützte Blockgröße zwischen 64 und 4096 Bits
2. Blowfish : 8-Byte-Blockchiffre
 unterstützte Schlüssellänge zwischen 128 und 256 Bits
 unterstützte Blockgröße zwischen 64 und 4096 Bits
Geben Sie die Nummer Ihrer Auswahl an: 1
Gewählter Algorithmus &quot;AES&quot;</pre></div></div>

<p>und bei der Schlüssellänge 128 Bit:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Bitte wählen Sie eine Schlüssellänge in Bit. Die von Ihnen gewählte Verschlüsselung
unterstützt Längen von 128 bis 256 Bit in 64 Bit Schritten.
Zum Beispiel: 
128, 192, 256
Gewählte Schlüssellänge: 128
Verwenden Schlüssellänge von 128 Bit</pre></div></div>

<p>Bei der Dateisystem-Blockgröße kann man einfach mit der Enter-Taste den Standard übernehmen. </p>
<p>Anschließend ist es aber wichtig, bei den Verschlüsselungsalgorithmen für Dateinamen &#8220;Stream&#8221; zu wählen, in dem man die Taste &#8220;3&#8243; drückt:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Die folgenden Verschlüsselungsalgorithmen für Dateinamen stehen zur Verfügung:
1. Block : Blockverschlüsselung, versteckt die Dateinamengröße etwas
2. Null : No encryption of filenames
3. Stream : Stromchiffre, möglichst kurze Dateinamen
Geben Sie die Nummer Ihrer Auswahl an: 3
Gewählter Algorithmus &quot;Stream&quot;&quot;</pre></div></div>

<p>Beim Vector-Chaining muss man mit &#8220;no&#8221; bestätigen, bzw. irgendeine Antwort eingeben, die mit einem &#8220;n&#8221; beginnt, alles andere bedeutet ja:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Enable filename initialization vector chaining?
This makes filename encoding dependent on the complete path, 
rather then encoding each path element individually.
The default here is Yes.
Any response that does not begin with 'n' will mean Yes: no</pre></div></div>

<p>Das Gleiche, also mit einer Eingabe, die mit einem &#8220;n&#8221; beginnt Nein zu sagen, muss man nochmal in der nächsten</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Enable per-file initialization vectors?
This adds about 8 bytes per file to the storage requirements.
It should not affect performance except possibly with applications
which rely on block-aligned file io for performance.
The default here is Yes.
Any response that does not begin with 'n' will mean Yes: no</pre></div></div>

<p>und in der übernächsten Abfrage machen:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Externe IV Verkettung abgeschaltet, da 'IV Verkettung'
und 'einmalige IV' Merkmale für diese Option benötigt werden.
Enable block authentication code headers
on every block in a file?  This adds about 12 bytes per block
to the storage requirements for a file, and significantly affects
performance but it also means [almost] any modifications or errors
within a block will be caught and will cause a read error.
The default here is No.
Any response that does not begin with 'y' will mean No: no</pre></div></div>

<p>Zum Schluss muss man nochmal darauf achten, dass jedem Block-Vorspann keine Zufallsbytes hinzugefügt werden, indem man die Zahl 0 eingibt:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Sollen jedem Block-Vorspann Zufallsbytes hinzugefügt werden?
Das wird die Leistung veringern, aber sicherstellen, dass die
Blöcke unterschiedliche Sicherheitscodes verwenden. Sie können das selbe
Resultat mit geringeren Leistungseinbußen erzielen, indem Sie die dateispezifischen Initialisierungsvektoren aktivieren.
Auswahl der Anzahl der Bytes, von 0 (Keine Zufallsbytes) bis 8: 0</pre></div></div>

<p>Mit Cryptkeeper kann man den neu erstellten verschlüsselten Ordner danach importieren. Wenn man im Fenster &#8220;Import an EncFS encrypted Folder&#8221; auf den Stift klickt, kann man den Pfad auch per Hand eingeben. Bei mir lautet er <code>~/Dropbox/.encrypted/</code>:</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Cryptkeeper1.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Cryptkeeper1-300x237.png" alt="" title="Cryptkeeper" width="300" height="237" class="aligncenter size-medium wp-image-6631" /></a></p>
<p>Nach dem ersten Start von BoxCryptor auf dem Android-Handy muss man den verschlüsselten Ordner auswählen, in meinem Fall also <code>.encrypted</code>:</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Screenshot-Android7.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Screenshot-Android7-300x218.png" alt="" title="Screenshot-Android7" width="300" height="218" class="aligncenter size-medium wp-image-6636" /></a></p>
<p>Hat man sein Passwort eingegeben, das man vorher bei der Erstellung des EncFS-Ordners angegeben hat, kann man auf seine verschlüsselten Dateien und Ordner lesend zugreifen:</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/11/Screenshot-Android61.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/11/Screenshot-Android61-184x300.png" alt="" title="Screenshot-Android6" width="184" height="300" class="aligncenter size-medium wp-image-6643" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/sicher-in-die-wolke-mit-encfs/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>MPlayer2 unter Ubuntu installieren</title>
		<link>http://www.datenteiler.de/mplayer2-unter-ubuntu-installieren/</link>
		<comments>http://www.datenteiler.de/mplayer2-unter-ubuntu-installieren/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 18:41:38 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Gnu/Linux]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6468</guid>
		<description><![CDATA[Mit MPlayer2 gibt es schon seit einiger Zeit einen Fork meines Lieblingsplayers für Multimedia, der ohne MEncoder auskommt. Da der Fork entscheidende Verbesserungen und viele Bugfixes mitbringt, sich aber abgesehen davon bedienen lässt, wie der gute alte MPlayer, bin ich umgestiegen. Seit Ubuntu 10.11 Oneiric Ocelot ist MPlayer2 im Repository vorhanden und kann einfach im [...]]]></description>
			<content:encoded><![CDATA[<p>Mit <a href="http://www.mplayer2.org/">MPlayer2</a> gibt es schon seit einiger Zeit einen Fork meines <a href="http://www.datenteiler.de/?s=mplayer">Lieblingsplayers für Multimedia</a>, der ohne MEncoder auskommt. Da der Fork <a href="http://www.mplayer2.org/comparison.html">entscheidende Verbesserungen</a> und viele Bugfixes mitbringt, sich aber abgesehen davon bedienen lässt, wie der gute alte MPlayer, bin ich umgestiegen. </p>
<p>Seit Ubuntu 10.11 Oneiric Ocelot ist MPlayer2 im Repository vorhanden und kann einfach im Terminal oder über das Ubuntu Software-Center installiert werden, so dass man kein <a href="http://wiki.ubuntuusers.de/Paketquellen_freischalten/PPA">PPA</a> wie für Ubuntu 10.04 Lucid und höher mehr benötigt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> add-apt-repository ppa:ripps818<span style="color: #000000; font-weight: bold;">/</span>coreavc
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> update
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">mplayer</span></pre></div></div>

<p>Ab Oneiric installiert man dann MPlayer2 wie folgt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> mplayer2
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Status-Informationen einlesen... Fertig
Die folgenden Pakete werden ENTFERNT:
  <span style="color: #c20cb9; font-weight: bold;">mplayer</span>
Die folgenden NEUEN Pakete werden installiert:
  mplayer2
<span style="color: #000000;">0</span> aktualisiert, <span style="color: #000000;">1</span> neu installiert, <span style="color: #000000;">1</span> zu entfernen und <span style="color: #000000;">0</span> nicht aktualisiert.
Es müssen <span style="color: #000000;">1.328</span> kB an Archiven heruntergeladen werden.
Nach dieser Operation werden <span style="color: #000000;">1.942</span> kB Plattenplatz freigegeben.
Möchten Sie fortfahren <span style="color: #7a0874; font-weight: bold;">&#91;</span>J<span style="color: #000000; font-weight: bold;">/</span>n<span style="color: #7a0874; font-weight: bold;">&#93;</span>?</pre></div></div>

<p>Wie man sieht, wird das alte MPlayer-Paket entfernt und dafür MPlayer2 installiert. Der Start erfolgt nach der erfolgreichen Installation allerdings immer noch über den bekannten Befehl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mplayer</span>
MPlayer2 UNKNOWN <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2000</span>-<span style="color: #000000;">2011</span> MPlayer Team
Usage:   <span style="color: #c20cb9; font-weight: bold;">mplayer</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>options<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>url<span style="color: #000000; font-weight: bold;">|</span>path<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>filename</pre></div></div>

<p>Man kann Mplayer ohne grafische Oberfläche auf der Konsole benutzen. Wer es ausprobieren möchte, kann sich das Ergebnis mit folgendem Befehl anschauen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mplayer</span> <span style="color: #660033;">-vo</span> fbdev <span style="color: #000000; font-weight: bold;">/</span>Pfad<span style="color: #000000; font-weight: bold;">/</span>zum<span style="color: #000000; font-weight: bold;">/</span>Video</pre></div></div>

<p>Die Rechte eines Superusers werden in diesem Testfall benötigt, weil sonst der Zugriff auf <code>/dev/fb0</code> nicht gewährt wird. </p>
<p>Schöner ist es, MPlayer in einer Konsole innerhalb einer grafischen Oberfläche zu starten. Dazu reicht einfach</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mplayer</span> <span style="color: #000000; font-weight: bold;">/</span>Pfad<span style="color: #000000; font-weight: bold;">/</span>zum<span style="color: #000000; font-weight: bold;">/</span>Video</pre></div></div>

<p>Für den Schnelleinstieg in die simple grafische Oberfläche reichen die Pfeiltasten zum Vor- und Zurückspulen, die Leertaste für Pausen, die Taste F für den Vollbildmodus und die Tasten 0 und 9 zum lauter und leiser stellen. Weitere Tasten sind:</p>
<table>
<tr>
<td> <strong>Taste</strong> </td>
<td> <strong>Funktion</strong> </td>
</tr>
<tr>
<td>
<span>Esc</span> </td>
<td> Ende </td>
</tr>
<tr>
<td>
<span> Leertaste </span> </td>
<td> Pause </td>
</tr>
<tr>
<td>
<span>→</span> </td>
<td> 10 Sekunden vorspulen </td>
</tr>
<tr>
<td>
<span>←</span> </td>
<td> 10 Sekunden zurückspulen </td>
</tr>
<tr>
<td>
<span>↑</span> </td>
<td> 1 Minute vorspulen </td>
</tr>
<tr>
<td>
<span>↓</span> </td>
<td> 1 Minute zurückspulen </td>
</tr>
<tr>
<td>
<span>Bild ↑</span> </td>
<td> 10 Minuten vorspulen </td>
</tr>
<tr>
<td>
<span>Bild ↓</span> </td>
<td> 10 Minuten zurückspulen </td>
</tr>
<tr>
<td>
<span>0</span> </td>
<td> Lauter </td>
</tr>
<tr>
<td>
<span>9</span> </td>
<td> Leiser </td>
</tr>
<tr>
<td>
<span>M</span> </td>
<td> Audio stumm schalten </td>
</tr>
<tr>
<td>
<span>F</span> </td>
<td> Vollbild </td>
</tr>
<tr>
<td>
<span>#</span> </td>
<td> Audiospur wechseln </td>
</tr>
<tr>
<td>
<span>J</span> </td>
<td> Untertitel wechseln </td>
</tr>
<tr>
<td>
<span>O</span> </td>
<td> On-Screen-Display wechseln </td>
</tr>
<p><span> &nbsp; </span> </td>
<td> &nbsp; </td>
</tr>
</table>
<p>Wer eine komfortablere Benutzeroberfläche benötigt, sollte SMPlayer aus dem Software-Center probieren. Wenn man aber ein bisschen mit der Konsole zurecht kommt und Spaß daran hat, braucht man keine andere Benutzeroberfläche. Radio geht wunderbar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mplayer</span> http:<span style="color: #000000; font-weight: bold;">//</span>208.80.54.28<span style="color: #000000; font-weight: bold;">/</span>FUTUROAAC</pre></div></div>

<p>und DVB-T klappt auch:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mplayer</span> dvb:<span style="color: #000000; font-weight: bold;">//</span>arte <span style="color: #660033;">-cache</span> <span style="color: #000000;">30720</span> <span style="color: #660033;">-cache-min</span> <span style="color: #000000;">5</span></pre></div></div>

<p>Falls das Paket <code>youtube-dl</code> installiert ist, kann man mit MPlayer2 auch Youtube-Videos gucken, vorausgesetzt, man hat mit der Suchmaschine seines Vertrauens eine passende URL zum Video ermittelt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> youtube-dl
<span style="color: #c20cb9; font-weight: bold;">mplayer</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span>youtube-dl <span style="color: #660033;">-g</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.youtube.com<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">watch</span>?<span style="color: #007800;">v</span>=u7Dg3LrhmIY<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/mplayer2-unter-ubuntu-installieren/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kleiner Bug in Tomboy Notes</title>
		<link>http://www.datenteiler.de/kleiner-bug-in-tomboy-notes/</link>
		<comments>http://www.datenteiler.de/kleiner-bug-in-tomboy-notes/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 20:15:47 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Gnu/Linux]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6426</guid>
		<description><![CDATA[Tomboy Notes, ein kleines Tool zum erstellen von Desktop-Notizen unter Ubuntu, macht erst so richtig Spaß, wenn man alle seine Einträge mit Ubuntu One synchronisieren kann, damit man sie auch auf anderen Rechnern zur Verfügung hat. Um so ärgerlicher, dass die neue Ubuntu-Version 11.10 Oneiric Ocelot einen kleinen Bug mitbringt, der das Einrichten von Tomboy [...]]]></description>
			<content:encoded><![CDATA[<p>Tomboy Notes, ein kleines Tool zum erstellen von Desktop-Notizen unter Ubuntu, macht erst so richtig Spaß, wenn man alle seine Einträge mit <a href="http://one.ubuntu.com/dashboard/">Ubuntu One</a> synchronisieren kann, damit man sie auch auf anderen Rechnern zur Verfügung hat. Um so ärgerlicher, dass die neue Ubuntu-Version 11.10 Oneiric Ocelot einen kleinen Bug mitbringt, der das Einrichten von Tomboy für neue User unnötig erschwert.</p>
<p>Wenn man in den &#8220;Einstellungen&#8221; unter &#8220;Abgleichen&#8221; den Eintrag &#8220;Tomboy im Internet&#8221; wählt und anschließend &#8220;Connect&#8221; klickt, öffnet sich ein Browser-Fenster zum eigenen Ubuntu One-Konto, um Tomboy-Web zu legitimieren. Wenn das erfolgreich ist, steht dort: &#8220;Tomboy-Web-Legitimierung erfolgreich. Drücken Sie im Einstellungsfenster von Tomboy die Eingabetaste und klicken Sie auf »Speichern«, um mit dem Abgleich zu beginnen.&#8221; Nur kann man nicht auf &#8220;Speichern&#8221; klicken, weil der Button, anders als in der Abbildung unten, ausgegraut ist.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/10/Tomboy-Server-Einstellung1.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/10/Tomboy-Server-Einstellung1-300x261.png" alt="" title="Tomboy-Server-Einstellung1" width="300" height="261" class="aligncenter size-medium wp-image-6432" /></a></p>
<p>Der <a href="https://bugs.launchpad.net/ubuntu/+source/tomboy/+bug/845321/comments/16">Fehler ist bekannt</a> und wird hoffentlich bald behoben. Damit der Button nicht mehr ausgegraut ist, muss man im Feld mit der Adresse zum Server einfach etwas hinzufügen, oder den letzten Schrägstrich (Slash) von <code>https://one.ubuntu.com/notes/</code> löschen. Danach kann man die Konfiguration speichern und der Abgleich der Notizen kann starten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/kleiner-bug-in-tomboy-notes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PowerShell-Workshop: Dateilisten erzeugen und auch drucken</title>
		<link>http://www.datenteiler.de/powershell-workshop-dateilisten-erzeugen-und-auch-drucken/</link>
		<comments>http://www.datenteiler.de/powershell-workshop-dateilisten-erzeugen-und-auch-drucken/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 19:51:11 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6118</guid>
		<description><![CDATA[Das aktuelle Heft 04/2011 von Ubuntu User feiert eine Premiere: Im ersten Bash-Workshop erfährt man, wie man in der Konsole Dateien in einem Verzeichniss auflistet, zurechtschnitzt und ausdruckt. Bash-Skripte erstellen kann ich schon, ich will aber PowerShell lernen. Also habe ich den Workshop etwas abgewandelt. Die Suche nach einem Editor mit integrierter Shell kann man [...]]]></description>
			<content:encoded><![CDATA[<p>Das aktuelle Heft 04/2011 von <a href="http://www.ubuntu-user.de/">Ubuntu User</a> feiert eine Premiere: Im ersten Bash-Workshop erfährt man, wie man in der Konsole Dateien in einem Verzeichniss auflistet, zurechtschnitzt und ausdruckt. Bash-Skripte erstellen kann ich schon, ich will aber PowerShell lernen. Also habe ich den Workshop etwas abgewandelt.</p>
<p>Die Suche nach einem Editor mit integrierter Shell kann man bei der PowerShell etwas abkürzen, da man im Zielverzeichnis der Installation <em>PowerShell ISE</em> findet. Die drei Buchstaben stehen für <em>Integrated Scripting Environment</em>, eine grafische Benutzeroberfläche, mit der man im selben Fenster nicht nur Befehle, sondern auch Skripte ausführen, schreiben und bearbeiten kann. Ziel des Workshops ist es, eine Liste von MP3-Dateien ohne Dateiendung zu erzeugen. Um eine Dateiliste auszugeben gibt es dank der <a href="http://www.datenteiler.de/wie-man-die-powershell-mit-aliase-personalisiert/">Aliase</a> <a href="http://www.datenteiler.de/suchen-und-auflisten-in-der-powershell/">viele Möglichkeiten</a>. So kann man wie in der Bash <code>ls</code> nehmen, oder auch <code>dir</code>. Dahinter verbirgt sich jedes Mal das Cmdlet <code>get-childitem</code>, kurz <code>gci</code>.</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/08/ISE.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/08/ISE.png" alt="" title="ISE" width="527" height="359" class="aligncenter size-full wp-image-6186" /></a>.</p>
<p>Wie man auf der Abbildung sieht, listet <code>get-childitem</code> mehr Parameter auf, als man vielleicht möchte. Ich will zum Beispiel nur den <em>Namen</em> und nicht die anderen drei Parameter <em>Mode</em>, <em>LastWriteTime</em> und <em>Length</em>. Um die anderen Parameter auszuschließen, braucht man nur den eingeben, den man möchte. In meinem Fall also:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">gci</span> <span style="color: #008080; font-style: italic;">-Name</span></pre></div></div>

<p>Um die MP3-Endungen der Auflistung zu entfernen, wird im Workshop der Befehl <code>sed</code> benutzt, den es leider <a href="http://gnuwin32.sourceforge.net/packages/sed.htm">in einer Standard-Installation von Windows nicht gibt</a>. Anstelle von <code>sed</code> und einem <a href="http://technet.microsoft.com/de-de/magazine/2007.11.powershell.aspx">regulären Ausdruck</a> verwende ich eine <a href="http://www.computerperformance.co.uk/powershell/powershell_replace.htm">ForEach-Schleife mit dem Replace-Parameter</a>, die durch eine Liste von Objekten geht und dabei jedes Objekt einzeln abarbeitet. Das jeweilige Objekt wird in der Schleife mit <code>$_</code> angesprochen, ein Platzhalter in der aktuellen Pipeline. Eine Eigenschaft eines Objekts wird dann mit $_.NameDerEigenschaft angesprochen. Solche Platzhalter heißen <em>Automatische Variable</em>. Wer genau wissen möchte, welche <em>Automatische Variable</em> es in der PowerShell gibt, kann sich mit folgendem Befehl einen Überblick verschaffen:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">get-help</span> about_automatic_variables</pre></div></div>

<p>Eine Auflistung der MP3-Dateien im Verzeichnis, aber ohne die Dateiendungen, sähe dann folgendermaßen aus:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">gci</span> <span style="color: #008080; font-style: italic;">-Name</span> <span style="color: pink;">|</span> <span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#123;</span><span style="color: #000080;">$_</span> <span style="color: #FF0000;">-replace</span> <span style="color: #800000;">&quot;.mp3&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;&quot;</span><span style="color: #000000;">&#125;</span> <span style="color: pink;">&gt;</span> titelliste.txt</pre></div></div>

<p>Mit der Umleitung in die Textdatei <code> titelliste.txt</code> wird die Dateiliste nicht in die Konsole geschrieben, sondern gleich in die Textdatei hinein, die für die CD-Hülle ausgedruckt werden soll. Führt man den Befehl ein zweites Mal aus, stößt man allerdings auf ein Problem: In der Textdatei stehen nicht nur die Titel, sondern auch der Name der Textdatei, weil die sich nun ebenfalls im Verzeichnis befindet. Damit sie nicht angezeigt wird, kann man alle Dateien mit der Endung TXT von der Liste ausschließen.</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">gci</span> <span style="color: #008080; font-style: italic;">-Name</span> <span style="color: #008080; font-style: italic;">-Exclude</span> <span style="color: pink;">*</span>.txt <span style="color: pink;">|</span> <span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#123;</span><span style="color: #000080;">$_</span> <span style="color: #FF0000;">-replace</span> <span style="color: #800000;">&quot;.mp3&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;&quot;</span><span style="color: #000000;">&#125;</span> <span style="color: pink;">&gt;</span> titelliste.txt</pre></div></div>

<p>Ich möchte auch gerne überprüfen, welche Infos in die Textdatei geschrieben werden und zur Kontrolle die Dateien zusätzlich auch noch in der Konsole ausgeben. Im Workshop von Ubuntu User wird dazu der Befehl <code>tee</code> benutzt, der wie ein T-Stück die Ausgabe in zwei Richtungen lenkt. Das Commandlet <code>Tee-Object</code> bewirkt in der PowerShell dasselbe und die Kurzform ist wie in der Bash <code>tee</code>. Das vollständige Kommando zur Ausgabe des Verzeichnisses mit den MP3-Dateien auf der Konsole und in eine Textdatei sieht dann so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">gci</span> <span style="color: #008080; font-style: italic;">-Name</span> <span style="color: #008080; font-style: italic;">-Exclude</span> <span style="color: pink;">*</span>.txt <span style="color: pink;">|</span> <span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#123;</span><span style="color: #000080;">$_</span> <span style="color: #FF0000;">-replace</span> <span style="color: #800000;">&quot;.mp3&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;&quot;</span><span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: #008080; font-weight: bold;">tee</span> titlliste.txt
01 sad robot
02 take me to the bonuslevel because i need an extralife
03 lemmings <span style="color: #0000FF;">in</span> love
04 space invaders
05 i want to be a machine
06 <span style="color: #804000;">1</span>_2 player game
07 game over
08 rock<span style="color: #800000;">'n'</span>roll hall of fame</pre></div></div>

<p>Den Inhalt der Textdatei kann man dann auch ausdrucken, falls man schnell mal ein CD-Cover mit den Songs drauf braucht. Dazu muss man aber erstmal wissen, welche Drucker am Rechner überhaupt angeschlossen sind. In der Bash klappt das mit dem Befehl <code>lpstat -a</code>, in der PowerShell benötigt man dazu ein <a href="http://www.microsoft.com/germany/technet/datenbank/articles/600682.mspx">WMI</a>-Objekt wie <code>win32_printer</code>.<br />
Das Cmdlet für die WMI-Objekte heißt <code>Get-WmiObject</code> oder kurz <code>gwmi</code>. Mit der Umleitung in das Select-Objekt wird dann nur der Name des Druckers angezeigt:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">gwmi</span> win32_printer <span style="color: pink;">|</span> <span style="color: #008080; font-weight: bold;">select</span> name
&nbsp;
name
<span style="color: pink;">----</span>
Brother HL<span style="color: pink;">-</span><span style="color: #804000;">2030</span> series
Microsoft XPS Document Writer</pre></div></div>

<p>Wenn man den Drucker weiß, kann man den Inhalt der Textdatei zum Drucker umleiten, wofür in der Bash der Befehl <code>lp</code> zuständig ist:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #008080; font-weight: bold;">Get-Content</span> titlliste.txt <span style="color: pink;">|</span> <span style="color: #008080; font-weight: bold;">Out-Printer</span> <span style="color: #008080; font-style: italic;">-name</span> <span style="color: #800000;">&quot;Brother HL-2030 series&quot;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/powershell-workshop-dateilisten-erzeugen-und-auch-drucken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wenn Anwendungen unter Windows nerven</title>
		<link>http://www.datenteiler.de/wenn-anwendungen-unter-windows-nerven/</link>
		<comments>http://www.datenteiler.de/wenn-anwendungen-unter-windows-nerven/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 19:10:22 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6358</guid>
		<description><![CDATA[Wenn Anwendungen unter Windows Vista oder Windows 7 nerven, weil sie ständig nach dem Passwort eines Benutzers mit Administrationsrechten verlangen, dann liegt das an der Benutzerkontensteuerung oder auch User Account Control (UAC). Ganz schlimm fand ich es auf einem Netbook von Samsung. Wie es sich gehört, habe ich ein Benutzerkonto mit Administrationsrechten, nennen wir es [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn Anwendungen unter Windows Vista oder Windows 7 nerven, weil sie ständig nach dem Passwort eines Benutzers mit Administrationsrechten verlangen, dann liegt das an der <a href="http://de.wikipedia.org/wiki/Benutzerkontensteuerung">Benutzerkontensteuerung</a> oder auch <em>User Account Control</em> (UAC). Ganz schlimm fand ich es auf einem <a href="http://www.amazon.de/gp/product/B0045Z4QDS/ref=as_li_tf_tl?ie=UTF8&#038;tag=imhorstnet-21&#038;linkCode=as2&#038;camp=1638&#038;creative=6742&#038;creativeASIN=B0045Z4QDS">Netbook von Samsung</a><img src="http://www.assoc-amazon.de/e/ir?t=imhorstnet-21&#038;l=as2&#038;o=3&#038;a=B0045Z4QDS" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. Wie es sich gehört, habe ich ein Benutzerkonto mit Administrationsrechten, nennen wir es Ruth, und ein einfaches Benutzerkonto für mich eingerichtet. Nach jedem Neustart und Einloggen <a href="http://www.windows-7-forum.net/windows-7-sicherheit/6676-nervende-samsung-dienste-3.html">verlangten 5 Anwendungen von Samsung Ruths Passwort</a>, was sehr anstrengend sein kann.</p>
<p>Windows selbst bietet keine Bordmittel, um einzelne Anwendungen von der Benutzerkontensteuerung herauszunehmen. Man kann zwar Anwendungen über die <em>Aufgabenplanung</em> mit höheren Privilegien starten, aber nur über eine Verknüpfung. Das fand ich für diesen Fall zu fummelig. In den &#8220;Eigenschaften&#8221; der einzelnen Anwendung kann man zwar die Option &#8220;Programm als Administrator ausführen&#8221; setzen, was aber nur funktioniert, wenn man die <a href="http://www.tobbis-blog.de/microsoft/anleitungen/2009-02-11-uac-unter-windows-7-deaktivieren/">Benutzerkontensteuerung deaktiviert</a> hat, wovon abzuraten ist. </p>
<p>Letztendlich habe ich das Tool <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&#038;id=7352">Microsoft Application Compatibility Toolkit</a> installiert, um die UAC für bestimmte Anwendungen zu deaktivieren. Ich habe dazu <a href="http://www.winfaq.de/faq_html/Content/tip2500/onlinefaq.php?h=tip2534.htm">zwei</a> <a href="http://blog.tim-bormann.de/ausnahmen-benutzerkontensteuerung-unter-windows-7.html">Anleitungen</a> gefunden, die beide behaupten, man könne beim <em>Compatibility Administrator</em> den Punkt &#8220;Als Administrator ausführen&#8221; mittels rechter Maustaste aus dem Startmenü anklicken. Bei mir ging es seltsamerweise nicht. Es klappt aber, wenn ich im Ordner &#8220;C:\Program Files\Microsoft Application Compatibility Toolkit\Compatibility Administrator&#8221; mit der rechten Maustaste auf die Anwendung klicke, um sie mit Administrationsrechten zu starten. So wie in der Anleitung beschrieben konnte ich dann die folgenden Anwendungen aus der Benutzerkontensteuerung heraus nehmen:</p>
<ul>
<li>C:\Program Files\Samsung\BatteryLifeExtender\BatteryLifeExtender.exe</li>
<li>C:\Program Files\Samsung\BatteryLifeExtender\StartUpSetup.exe</li>
<li>C:\Program Files\Samsung\Samsung Update Plus\SUPBackground.exe</li>
<li>C:\Program Files\Samsung\EasySpeedUpManager\EasySpeedUpManager2.exe</li>
<li>C:\Program Files\Samsung\SamsungFastStart\SmartRestarter.exe</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/wenn-anwendungen-unter-windows-nerven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>„I don&#8217;t like spam“, oder wie man einen Mailserver testet</title>
		<link>http://www.datenteiler.de/i-dont-like-spam-oder-wie-man-einen-mailserver-testet/</link>
		<comments>http://www.datenteiler.de/i-dont-like-spam-oder-wie-man-einen-mailserver-testet/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 20:09:42 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Gnu/Linux]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6339</guid>
		<description><![CDATA[Dieser Artikel erschien erstmals in freiesMagazin 09/11: Es begann mit einem Irrtum. Im Werbebrief vom Google für den AdWords-Dienst befand sich ein Gutschein über 75 Euro, der auf einen völlig fremden Menschen ausgestellt war. Wenn man Sandra Fründt, Head of Business Marketing Google Deutschland, auf ihren Fehler aufmerksam machen will, immerhin hat sie diesen Brief [...]]]></description>
			<content:encoded><![CDATA[<p><b><em>Dieser Artikel erschien erstmals in <b><font color="#595959">freies</font></b><font color="#FF630A">Magazin</font> <a href="http://www.freiesmagazin.de/20110904-septemberausgabe-erschienen">09/11</a>:</em> Es begann mit einem Irrtum. Im Werbebrief vom Google für den AdWords-Dienst befand sich ein Gutschein über 75 Euro, der auf einen völlig fremden Menschen ausgestellt war. Wenn man Sandra Fründt, Head of Business Marketing Google Deutschland, auf ihren Fehler aufmerksam machen will, immerhin hat sie diesen Brief unterschrieben, stößt man auf ein Problem: Im Schreiben ist überhaupt keine E-Mail-Adresse angegeben. Das Unternehmen, das mit Suchmaschine und E-Mail-Dienst im Internet groß geworden ist, zeigt sich in seiner Werbung ganz schön verschlossen.</b></p>
<p><span id="more-6339"></span></p>
<p><strong>Auf der Suche nach einer E-Mail-Adresse</strong></p>
<p>Jetzt kann man sich eine mögliche und formal richtige E-Mail-Adresse für die Empfängerin ausdenken, eine E-Mail an diese Adresse schicken und darauf warten, ob der Mailserver die Nachricht auch erfolgreich zustellen kann. Wenn er nämlich scheitert, bekommt man eine Fehlermeldung als Antwort zurück. Entweder probiert man so lange herum, bis diese Antwort ausbleibt, oder man kann, um das Ganze abzukürzen, den Test auch in die Konsole verlagern. Das Werkzeug für diesen Test ist das Telnet [1], für das bei den meisten GNU/Linux-Distributionen, MacOS X und sogar bei Windows ein Tool vorinstalliert oder schnell nachträglich zu installieren ist.</p>
<p>In der Vergangenheit war Telnet eine unverschlüsselte und daher unsichere Methode für die Fernwartung von Rechnern. Der Vorteil von Telnet ist aber, dass man sich über den entsprechenden Port mit so ziemlich jedem Server verbinden kann, der ein textbasiertes Protokoll beherrscht, also auch mit Mailservern. Diesen Vorteil muss man allerdings mit Vorsicht genießen, da er auch von Spammern genutzt wird.</p>
<p><strong>Woher kommt das Wort „Spam“?</strong></p>
<p>Die Bezeichnung „Spam“ für Massenmails zu Werbezwecken im Internet wurde durch einen Sketch der englischen Komikertruppe Monty Python geprägt. Der Sketch [2] spielt in einem Imbiss, in dem es fast ausschließlich nur Spam (spiced ham), also „gewürzten Schinken“, auf der Speisekarte gibt. Auf die Frage, ob es auch etwas ohne Spam gäbe, antwortet die Kellnerin: „Well, there&#8217;s spam egg sausage and spam, that&#8217;s not got much spam in it.“ Woraufhin die Kundin sagt: „I don&#8217;t want ANY spam!“. Später, beim Versuch, etwas ohne Spam zu bestellen, kreischt sie sogar: „I don&#8217;t like spam!“ Spam wird in dem Sketch 132 mal genannt und steht synonym für eine unnötig häufige Verwendung und Wiederholung.</p>
<p><strong>Wie funktioniert E-Mail eigentlich?</strong></p>
<p>Bevor es losgeht, sollte man sich noch kurz klar darüber werden, was beim Versenden von E-Mails überhaupt passiert und ein paar Begriffe klären. In der Regel schreibt man eine E-Mail mit einem E-Mail-Programm, das auch E-Mail-Client oder, etwas technischer, „Mail User Agent“ (MUA) genannt wird. Traditionell werden die E-Mails vom „Mail Transfer Agent“ (MTA), das ist dann der Mailserver, entgegengenommen, falls nicht ein „Message Submission Agent“ (MSA) dazwischen geschaltet ist, der die E-Mails vom MUA an den MTA übergibt. Das Protokoll zum Versenden der Nachrichten zwischen diesen Servern heißt „Simple Mail Transfer Protocol“ (SMTP). Auf der Empfängerseite ist der „Mail Delivery Agent“ (MDA) verantwortlich für die Zustellung zum E-Mail-Client. Die Protokolle, die zum Abholen von Nachrichten verwendet werden heißen „Post Office Protocol“ (POP) oder „Internet Message Access Protocol“ (IMAP).</p>
<p><a href="http://www.datenteiler.de/wp-content/uploads/2011/09/mailserver.png"><img src="http://www.datenteiler.de/wp-content/uploads/2011/09/mailserver-300x45.png" alt="" title="mailserver" width="300" height="45" class="aligncenter size-medium wp-image-6344" /></a><br /><em>Der Weg einer E-Mail vom Sender zum Empfänger.<br />
<a href="http://de.wikipedia.org/w/index.php?title=Datei:E-mail.svg">&#169;&nbsp;Polluks</a> (<a href="http://creativecommons.org/licenses/by-sa/3.0/deed.de">CC-BY-SA-3.0</a>)<br />
</em></p>
<p><strong>Nach der Theorie die Praxis</strong></p>
<p>Normalerweise fragen Mailserver beim Versenden von E-Mails nach dem vollständigen Namen einer Domain. Da hier keine E-Mail verschickt werden soll, wird mit dem Befehl nslookup nach dem entsprechenden Domainnamen gesucht:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ nslookup -q=mx google.com
Server:         192.168.178.1
Address:        192.168.178.1#53
&nbsp;
Non-authoritative answer:
google.com      mail exchanger = 50 alt4.aspmx.l.google.com.
google.com      mail exchanger = 10 aspmx.l.google.com.
google.com      mail exchanger = 20 alt1.aspmx.l.google.com.
google.com      mail exchanger = 30 alt2.aspmx.l.google.com.
google.com      mail exchanger = 40 alt3.aspmx.l.google.com.</pre></div></div>

<p>Gesucht wird nach dem „Mail Exchange Resource Record“ (MX-Eintrag) der Domain google.com im „Domain Name System“ (DNS), der sich ausschließlich mit dem E-Mail-Dienst (SMTP) beschäftigt. Wie man sieht hat Google gleich mehrere MX-Einträge mit unterschiedlichen Prioritäten, damit bei einem Ausfall der jeweils andere die E-Mails entgegen nehmen kann. Der Eintrag mit dem höchsten numerischen Wert hat meist die niedrigste Priorität. Das nutzen Spammer gerne aus, indem sie sich mit dem Mailserver mit der niedrigsten Priorität verbinden, um Spamfilter zu umgehen, die auf dem Server mit der höchsten Priorität laufen. Laut dem MX-Eintrag ist der Server mit der höchsten Priorität aspmx.l.google.com. Mit dem wird jetzt die Verbindung über Telnet und dem Port 25 für SMTP aufgebaut:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ telnet aspmx.l.google.com 25
Trying 74.125.39.27...
Connected to aspmx.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP 3si5028908fav.179</pre></div></div>

<p>Was in diesem Fall bei Google klappt, kann bei anderen Mailservern schon schief gehen. Zur Abwehr von Spammern lassen einige Mailserver – zum Beispiel von GMX – eine Verbindung zum Server im MX-Eintrag gar nicht erst zu, wenn die Anfrage über die dynamische IP eines Client-PCs gestellt wird und nicht von einem anderen Mailserver kommt. Es kann aber auch sein, dass der Mailserver aufgrund einer Störung einfach nicht erreichbar ist.</p>
<p><strong>Was einem der Statuscode so sagt</strong></p>
<p>Die letzte Zeile der obigen Ausgabe beginnt mit einer Zahl, nämlich 220. Im SMTP-Protokoll werden Befehle der Reihe nach ausgeführt und jeder Befehl wird mit einem Statuscode beantwortet. Die Beschreibung, die auf den Statuscode folgt, ist für Menschen gedacht und für das Protokoll ohne Bedeutung. Beginnt der Statuscode so wie in diesem Fall mit einer 2, dann war die Bearbeitung erfolgreich, bei einer 3 fehlen noch Informationen und bei einer 5 ist ein Fehler aufgetreten.</p>
<p>Als erstes erwartet der Server eine Begrüßung in Form eines HELO, dabei ist es im Prinzip völlig egal, welches Argument man nach dem Befehl einträgt, auch wenn man eigentlich die eigene Domain angeben sollte:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">helo hi
250 mx.google.com at your service</pre></div></div>

<p>Der Statuscode mit der 2 am Anfang zeigt, dass der Befehl erfolgreich bearbeitet wurde und der Server zu Diensten steht. Anschließend gibt man die E-Mail-Adresse des Absenders mit dem Befehl MAIL FROM ein:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mail from: &lt;test.user@googlemail.com&gt; 250 2.1.0 OK 3si5028908fav.179</pre></div></div>

<p>Die spitzen Klammern vor und nach der E-Mail-Adresse sind wichtig. Ansonsten erhält man einen Syntax Error. Als nächstes gibt man einen Empfänger ein, zum Beispiel eine Adresse von der man weiß, dass sie existiert:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rcpt to: &lt;larry.page@google.com&gt;
250 2.1.5 OK 3si5028908fav.179</pre></div></div>

<p><strong>Gibt es die E-Mail-Adresse wirklich?</strong></p>
<p>Die 250 oben verrät, dass der Befehl erfolgreich war. Die E-Mail-Adresse scheint zu existieren. Doch auch hier gibt es die ein oder andere Falle, die Mailserver Spammern stellen. </p>
<p>Manche Mailserver haben ein Catch-All für E-Mails, dann laufen alle E-Mails mit einer formal richtigen E-Mail-Adresse der Domain in der gleichen Mailbox zusammen und der Mailserver antwortet in diesem Fall bei jeder formal gültigen Adresse mit einem „OK“. </p>
<p>Vielleicht wird auch eine Graue Liste zur Spambekämpfung eingesetzt. Dabei wird die erste E-Mail von einem unbekannten Absender abgewiesen und erst nach dem nächsten Zustellversuch angenommen. </p>
<p>Eine weitere Methode ist das „Sender Policy Framework“ (SPF). Hier schaut der empfangende Mailserver nach, ob die Domain im Befehl MAIL FROM mit dem Argument des Befehls HELO übereinstimmt. Wenn das nicht der Fall ist, kann es gut sein, dass der Rechner E-Mails für diese Domain gar nicht versenden darf. Dadurch soll das Fälschen von Absendern auf SMTP-Ebene erschwert werden.</p>
<p>Der nächste Versuch zeigt, dass der Mailserver von Google vermutlich kein Catch-All verwendet:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rcpt to: &lt;sandra.fruendt@google.com&gt;
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipients email address for typos or
550-5.1.1 unnecessary spaces. Learn more at                             
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 3si5028908fav.179</pre></div></div>

<p>Auch ohne den Statuscode sieht man, dass hier etwas falsch läuft. Die E-Mail-Adresse existiert laut dem Mailserver nicht. Das kann auch wiederum mehrere Ursachen haben: Entweder ist Frau Fründt eine Externe und gehört nicht zum Unternehmen oder es gibt dort mehr als eine Sandra Fründt oder die Administratoren bei Google halten ein einheitliches Namensschema für E-Mail-Adressen in einem Unternehmen für überbewertet. Ein paar Versuche später wird klar, dass der letzte Punkt zutrifft. Mit dem Befehl QUIT schließt man die Telnet-Sitzung wieder.</p>
<p><strong>Zum Validieren reicht es nicht</strong></p>
<p>Am Ende konnte die – vermutlich – korrekte E-Mail-Adresse von Frau Fründt zusammen mit den hier gesammelten Infos nur durch weiteres Googeln genauer abgeglichen werden. Zur Validierung von E-Mail-Adressen ist das Verfahren aus den oben genannten Gründen somit nur begrenzt geeignet und wäre mit einem Webdienst wie verify-email.org [3] wesentlich schneller gegangen. Im Prinzip lässt sich so eigentlich nur ermitteln, ob zum Zeitpunkt der Abfrage der Mailserver bereit oder in der Lage ist, den Mailversand zu einer bestimmten E-Mail-Adresse durchzuführen. Das kann für die Fehlerdiagnose bei Versandproblemen durch das Mailprogramm sehr hilfreich sein, indem man seinen eigenen oder den Mailserver des Providers testet und dessen Funktionsweise direkt in einer seiner Protokollsprachen SMTP, POP3 oder IMAP überprüft, aber auch zum Testen der eigenen Spamfilter.</p>
<p><strong>Bonuslevel: Eine E-Mail über Telnet versenden</strong></p>
<p>Eine E-Mail über Telnet zu versenden ist zwar etwas komplizierter, kann sich aber zum Testen durchaus lohnen [4]. Als Beispiel dient hier der Maildienst von Google, wobei andere E-Mail-Dienst-Anbieter ähnlich funktionieren sollten.</p>
<p>Das SMTP-Protokoll wurde aufgrund der zunehmenden Spamproblematik um Verfahren zur Authentifizierung und Verschlüsselung erweitert [5]. Um eine E-Mail zu verschicken, muss man häufig diese Erweiterungen des Mailservers nutzen. Welche aktiv sind, findet man mit dem Befehl EHLO heraus, der für „Enhanced HELO“ steht:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ telnet smtp.googlemail.com 25 
Trying 74.125.39.16... 
Connected to googlemail-smtp.l.google.com. 
Escape character is '^]'. 
220 mx.google.com ESMTP d1sm327505fai.4 
helo hi 
250 mx.google.com at your service 
ehlo hi 
250-mx.google.com at your service, [89.182.218.152] 
250-SIZE 35882577 
250-8BITMIME 
250-STARTTLS 
250 ENHANCEDSTATUSCODES</pre></div></div>

<p>Wie man an dem Beispiel gut sehen kann, schweigt sich der Befehl HELO darüber aus, welche Fähigkeiten der Server bei Verschlüsselung, Authentifizierung und so weiter besitzt. Die bekommt man nur als Antwort auf EHLO. Die Ausgabe von STARTTLS zeigt zum Beispiel, dass der Server Verschlüsselung unterstützt.</p>
<p><strong>Codiertes Login</strong></p>
<p>Aufgrund des vermehrten Spamaufkommens verlangen Mailserver heutzutage eine Authentifizierung. Zur Vorbereitung der Authentifizierung und weil man gleich sowieso eine verschlüsselte Verbindung über openssl aufbauen muss, verlässt man den Server jetzt mit dem Befehl QUIT.</p>
<p>Die Authentifizierung findet in einer Base64-Kodierung statt. Dazu gibt man im Terminal den Befehl base64 ein und drückt „Enter“. Anschließend folgt der Anmeldename, wieder gefolgt von „Enter“. Um die Eingabe zu beenden, drückt man die Tasten „Strg“ + „D“ und erhält in etwa folgendes Ergebnis:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ base64 
test.user@gmail.com 
dGVzdC51c2VyQGdtYWlsLmNvbQo=</pre></div></div>

<p>Das Passwort wird genauso mit Base64 kodiert. Wenn das erledigt ist, baut man die verschlüsselte Verbindung zum Mailserver mit openssl auf:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ openssl s_client -starttls smtp -crlf -connect smtp.googlemail.com:25</pre></div></div>

<p>Es folgt eine wirklich lange Ausgabe im Terminal, in der man unter anderem sehen kann, dass Zertifikate ausgetauscht werden. Wenn diese erste Hürde überwunden ist, begrüßt man den Server wieder mit EHLO:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ehlo hi 
250-mx.google.com at your service, [89.182.218.152] 
250-SIZE 35882577 
250-8BITMIME 
250-AUTH LOGIN PLAIN XOAUTH 
250 ENHANCEDSTATUSCODES</pre></div></div>

<p>Nach der Begrüßung folgt das Login mit dem Befehl AUTH LOGIN und dem Base64-kodierten Benutzernamen gleich dahinter:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">auth login dGVzdC51c2VyQGdtYWlsLmNvbQo=
334 UGFzc3dvcmQ6</pre></div></div>

<p>Der Statuscode 3 zeigt an, dass der Server noch weitere Infos benötigt. Die Beschreibung, die einen darauf hinweisen soll, was genau noch fehlt, ist übrigens auch Base64-kodiert:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ base64 -d 
UGFzc3dvcmQ6 
Password:</pre></div></div>

<p>Das heißt, man soll das Passwort eingeben, natürlich Base64-kodiert:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">RGFzaXN0R2VoZWltCg==
235 2.7.0 Accepted</pre></div></div>

<p><strong>Sender und Empfänger</strong></p>
<p>Nach der Eingabe des Base64-kodierten Passworts wird die E-Mail geschrieben. Mit den Befehlen MAIL FROM und RCPT TO werden Sender und Empfänger der E-Mail festgehalten:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mail from: &lt;test.user@gmail.com &gt; 
250 2.1.0 OK l22sm324987fam.37 
rcpt to: &lt;empfaenger@beispiel.net&gt; 
250 2.1.5 OK l22sm324987fam.37</pre></div></div>

<p>Wichtig ist, dass die E-Mail-Adressen in spitzen Klammern stehen. Man kann RCPT TO auch mehrmals benutzen, wenn man die E-Mail an weitere Empfänger versenden möchte.</p>
<p>Der Befehl DATA gibt an, dass jetzt die E-Mail folgt. Zu Beginn gibt man der E-Mail beliebige Kopfzeilen mit, wobei Absender, Empfänger und Betreffzeile hier am sinnvollsten sind. Welche Adressen man in den Kopfzeilen einträgt, ist egal, es können ganz andere sein, als die, die in den Befehlen MAIL FROM und RCPT TO weiter oben eingetragen wurden. So einfach kann man Absender fälschen.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">data 
354  Go ahead l22sm324987fam.37 
From : Test &lt;test.user@gmail.com&gt;
To: Empfaenger &lt;empfaenger@beispiel.net&gt;
Subject: Hier kommt eine Testmail 
&nbsp;
Hallo Empfaenger,
hier kommt eine Testmail. 
Viele Gruesse.</pre></div></div>

<p>Wenn der Text fertig ist, beendet man den Befehl DATA mit einem einzelnen Punkt in einer separaten Zeile. Nach der Bestätigung der Eingabe durch den Mailserver ist die E-Mail verschickt und man verlässt Telnet wieder über den Befehl QUIT.</p>
<p><strong>Links</strong><br />
[1] <a href="http://de.wikipedia.org/wiki/Telnet">http://de.wikipedia.org/wiki/Telnet</a><br />
[2] <a href="http://www.youtube.com/watch?v=anwy2MPT5RE">http://www.youtube.com/watch?v=anwy2MPT5RE</a><br />
[3] <a href="http://wiki.ubuntuusers.de/Mailserver_testen">http://wiki.ubuntuusers.de/Mailserver_testen</a><br />
[4] <a href="http://www.linux-magazin.de/Heft-Abo/Ausgaben/2002/04/Transport-Sicherung">http://www.linux-magazin.de/Heft-Abo/Ausgaben/2002/04/Transport-Sicherung</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/i-dont-like-spam-oder-wie-man-einen-mailserver-testet/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Windows-Programme mit Python steuern</title>
		<link>http://www.datenteiler.de/windows-programme-mit-python-steuern/</link>
		<comments>http://www.datenteiler.de/windows-programme-mit-python-steuern/#comments</comments>
		<pubDate>Sun, 04 Sep 2011 11:41:02 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6287</guid>
		<description><![CDATA[Im Blog Der Bayer und der Würschtlmann bin ich auf den Beitrag Windows-(GUI-)Programme mit Python fernsteuern von Sebastian gestoßen. Für die Automatisierung der Windows-Programme benutzt er pywinauto, das einen sehr interessanten Eindruck macht, aber leider etwas durch die Abwesenheit von Dokumentation glänzt. Trotzdem soll man laut Sebastian schnell zu guten Ergebnissen kommen. Pywinauto ist sicherlich [...]]]></description>
			<content:encoded><![CDATA[<p>Im Blog <a href="http://dbudwm.wordpress.com">Der Bayer und der Würschtlmann</a> bin ich auf den Beitrag <a href="http://dbudwm.wordpress.com/2011/08/23/windows-gui-programme-mit-python-fernsteuern/">Windows-(GUI-)Programme mit Python fernsteuern</a> von Sebastian gestoßen. Für die Automatisierung der Windows-Programme benutzt er <a href="http://code.google.com/p/pywinauto/">pywinauto</a>, das einen sehr interessanten Eindruck macht, aber leider etwas durch die <a href="http://pywinauto.googlecode.com/hg/pywinauto/docs/index.html">Abwesenheit von Dokumentation</a> glänzt. Trotzdem soll man laut Sebastian schnell zu guten Ergebnissen kommen. Pywinauto ist sicherlich ein Vesuch wert, weil es objektorientierter und pythonmäßiger sein soll. Wenn man sich aber schon etwas mit dem Windows Script Host (WSH) oder dem Component Object Model (COM) auskennt, liegt einem Win32com vielleicht mehr.</p>
<p>Um überhaupt etwas mit Pywinauto oder Win32com zu machen, muss man <a href="http://docs.python.org/using/windows.html">Python unter Windows installiert</a> haben. Ich habe mich zum Beispiel für <a href="http://www.python.org/download/releases/">Python 3.2 entschieden</a>. Alternativ gibt es auch noch die <a href="http://www.heise.de/software/download/activepython_community_edition/37561">Communuty Edition von ActivePython</a>, das schon extra Module wie Win32com mitbringt. Beim original Python muss man auf jeden Fall noch die <a href="http://sourceforge.net/projects/pywin32/files/pywin32/ ">Erweiterung Pywin32</a> herunterladen, wenn man das Modul Win32com nutzen möchte. Allerdings kann es passieren, dass der erste Versuch, das Modul zu importieren, auf einen Fehler hinaus läuft:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> win32com.<span style="color: black;">client</span> 
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:
File <span style="color: #483d8b;">&quot;D:<span style="color: #000099; font-weight: bold;">\E</span>Q<span style="color: #000099; font-weight: bold;">\I</span>nventoryDumps<span style="color: #000099; font-weight: bold;">\t</span>estScript1.py&quot;</span>, line <span style="color: #ff4500;">1</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> win32com.<span style="color: black;">client</span> <span style="color: #ff7700;font-weight:bold;">as</span> win32
File <span style="color: #483d8b;">&quot;D:<span style="color: #000099; font-weight: bold;">\P</span>ython32<span style="color: #000099; font-weight: bold;">\l</span>ib<span style="color: #000099; font-weight: bold;">\s</span>ite-packages<span style="color: #000099; font-weight: bold;">\w</span>in32com<span style="color: #000099; font-weight: bold;">\_</span>_init__.py&quot;</span>, line <span style="color: #ff4500;">5</span>, <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> win32api, <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">os</span>
<span style="color: #008000;">ImportError</span>: DLL load failed: The specified module could <span style="color: #ff7700;font-weight:bold;">not</span> be found.</pre></div></div>

<p>Ist das der Fall, kann man das Problem mit folgendem Befehl beheben:</p>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;">C:\Python32\Scripts\pywin32_postinstall.py</pre></div></div>

<p>Wenn die Installation erfolgreich ist, steht einem die Welt der Windows-Objekte wie COM oder WSH mehr oder weniger offen. So kann man mit COM Anwendungen aus dem Microsoft Office-Paket oder den Internet Explorer automatisieren. COM dient dabei zur Interprozesskommunikation und dynamische Objekterzeugung unter Windows. Bevor man die Funktionen von COM-Objekten nutzen kann, muss man sie instanzieren, wofür die COM-Komponenten Schnittstellen anbieten. Im folgenden Beispiel wird eine Instanz des Internet Explorers durch die Angabe seiner ProgID (&#8220;InternetExplorer.Application&#8221;) erzeugt:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> win32com.<span style="color: black;">client</span>
ie = win32com.<span style="color: black;">client</span>.<span style="color: black;">Dispatch</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;InternetExplorer.Application&quot;</span><span style="color: black;">&#41;</span>
ie.<span style="color: black;">Visible</span> = <span style="color: #ff4500;">1</span>
ie.<span style="color: black;">Navigate</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;http://www.datenteiler.de&quot;</span><span style="color: black;">&#41;</span>
ie.<span style="color: black;">GoHome</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
ie.<span style="color: black;">quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Nach der Instanzierung steht ein Internet Explorer bereit, der allerdings noch nicht zu sehen ist, außer als Prozess im Taskmanager oder mit dem Cmdlet <code>Get-Process</code> in der PowerShell. Der Prozess ist unabhängig vom Python-Interpreter. Wird die Konsole geschlossen, bleibt der Prozess erhalten und aktiv. Erst wenn man der Eigenschaft von <code>Visible</code> auf <em>wahr</em> setzt, wird diese Instanz des Internet Explorers sichtbar.<br />
Wenn man sich mit dem Einsatz von COM-Anwendungen in der PowerShell auskennt, kommt einem der Quelltext doch bekannt vor:</p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #800080;">$ie</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">New-Object</span> <span style="color: #008080; font-style: italic;">-ComObject</span> InternetExplorer.Application
<span style="color: #800080;">$ie</span>.Visible <span style="color: pink;">=</span> <span style="color: #800080;">$true</span>
<span style="color: #800080;">$ie</span>.Navigate<span style="color: #000000;">&#40;</span><span style="color: #800000;">&quot;http://www.datenteiler.de&quot;</span><span style="color: #000000;">&#41;</span>
<span style="color: #800080;">$ie</span>.GoHome<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #800080;">$ie</span>.Quit<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>Das folgende <a href="http://win32com.goermezer.de/content/view/136/254/">SendKey-Beispiel</a> mit dem WSH kann auch zu einem Déjà-vu führen, wenn man den Python-Quelltext mit dem VBScript-Code vergleicht. Erstmal das Beispiel um Tastendrücke zu simulieren in Python:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> win32api
<span style="color: #ff7700;font-weight:bold;">import</span> win32com.<span style="color: black;">client</span>
shell = win32com.<span style="color: black;">client</span>.<span style="color: black;">Dispatch</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;WScript.Shell&quot;</span><span style="color: black;">&#41;</span>
shell.<span style="color: black;">Run</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Notepad&quot;</span><span style="color: black;">&#41;</span> 
win32api.<span style="color: black;">Sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1500</span><span style="color: black;">&#41;</span> 
shell.<span style="color: black;">AppActivate</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Notepad&quot;</span><span style="color: black;">&#41;</span> 
win32api.<span style="color: black;">Sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1500</span><span style="color: black;">&#41;</span> 
shell.<span style="color: black;">SendKeys</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Hallo Welt!{ENTER}&quot;</span><span style="color: black;">&#41;</span> 
shell.<span style="color: black;">SendKeys</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^s&quot;</span><span style="color: black;">&#41;</span>
shell.<span style="color: black;">SendKeys</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;{ENTER}&quot;</span><span style="color: black;">&#41;</span>
win32api.<span style="color: black;">Sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1500</span><span style="color: black;">&#41;</span>
shell.<span style="color: black;">SendKeys</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Hallo.txt{ENTER}&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Das Äquivalent in VBScript sieht dann so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">' SendkeyBeispiel.vbs
</span><span style="color: #E56717; font-weight: bold;">Option</span> <span style="color: #E56717; font-weight: bold;">Explicit</span>
<span style="color: #151B8D; font-weight: bold;">Dim</span> objWScriptShell
<span style="color: #151B8D; font-weight: bold;">Set</span> objWScriptShell = <span style="color: #E56717; font-weight: bold;">CreateObject</span>(<span style="color: #800000;">&quot;WScript.Shell&quot;</span>)
objWScriptShell.Run <span style="color: #800000;">&quot;notepad&quot;</span>
Wscript.Sleep 1500 <span style="color: #008000;">' Warte bis Notepad fertig ist
</span>objWScriptShell.SendKeys <span style="color: #800000;">&quot;Hallo Welt!{ENTER}&quot;</span>
objWScriptShell.SendKeys <span style="color: #800000;">&quot;^s&quot;</span>
objWScriptShell.SendKeys <span style="color: #800000;">&quot;{ENTER}&quot;</span>
Wscript.Sleep 1500
objWScriptShell.SendKeys <span style="color: #800000;">&quot;Hallo.txt{ENTER}&quot;</span>
WScript.Quit</pre></div></div>

<p>Man kann <a href="http://timgolden.me.uk/python/win32_how_do_i.html ">mit dem Win32Com-Modul in Python noch einiges mehr anfangen</a>, zum Beispiel die <a href="http://kvance.livejournal.com/985732.html ">Maus positionieren und Mausklicks senden</a>. Damit sind die Möglichkeiten von Python im Component Object Model oder des Windows Script Host bei weitem noch nicht ausgeschöpft. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/windows-programme-mit-python-steuern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tanz den Bubblesort</title>
		<link>http://www.datenteiler.de/tanz-den-bubblesort/</link>
		<comments>http://www.datenteiler.de/tanz-den-bubblesort/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 18:24:42 +0000</pubDate>
		<dc:creator>Christian Imhorst</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.datenteiler.de/?p=6275</guid>
		<description><![CDATA[Endlich habe ich mal verstanden, wie der Bubblesort funktioniert! Nicht schlecht was die Jungs und Mädels dort Vortanzen. Hier zum Beispiel der Tanz in Python implementiert, allerdings nur mit dem unsortierten Anfang, dem sortierten Ende und ohne das Ganze im Mittelteil: # Bubblesort in Python &#160; def bubblesort&#40;a&#41;: for j in range&#40;len&#40;a&#41; - 1&#41;: for [...]]]></description>
			<content:encoded><![CDATA[<p>Endlich habe ich mal verstanden, wie der Bubblesort funktioniert! Nicht schlecht was die Jungs und Mädels dort Vortanzen. Hier zum Beispiel der Tanz in Python implementiert, allerdings nur mit dem unsortierten Anfang, dem sortierten Ende und ohne das Ganze im Mittelteil:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># Bubblesort in Python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> bubblesort<span style="color: black;">&#40;</span>a<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>a<span style="color: black;">&#41;</span> - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>a<span style="color: black;">&#41;</span> - j - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> a<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> a<span style="color: black;">&#91;</span>i+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
                tmp = a<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
                a<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> = a<span style="color: black;">&#91;</span>i+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
                a<span style="color: black;">&#91;</span>i+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = tmp
    <span style="color: #ff7700;font-weight:bold;">return</span> a
&nbsp;
a = <span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">5</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Unsortiert: &quot;</span>, a<span style="color: black;">&#41;</span>
&nbsp;
result = bubblesort<span style="color: black;">&#40;</span>a<span style="color: black;">&#41;</span>	
<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Sortiert  : &quot;</span>, result<span style="color: black;">&#41;</span></pre></div></div>

<p>Ich hoffe nur, dass ich die Musik auch wieder aus meinem Kopf bekomme. ;-)</p>
<p><object style="height: 390px; width: 640px"><param name="movie" value="http://www.youtube.com/v/lyZQPjUT5B4?version=3"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/lyZQPjUT5B4?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="540" height="390"></object></p>
<p>[via <a href="http://www.zipfelmaus.com">zipfelmaus.com</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.datenteiler.de/tanz-den-bubblesort/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

