Bestimmen ob WLAN aktuelle Internet Netzwerk Schnittstelle in Windows Phone 7/8 ist

Neulich musst ich feststellen, dass Windows Phone automatisch auf eine Handy Netz Connection umswitcht wenn über das WLAN kein Internet zubekommen ist. Das ist sehr unpraktisch, insbesondere wenn man als App Entwickler sicherstellen möchte das der Traffic nur über das WLAN fließt. Früher habe ich mit den folgenden Zeilen einfach abgeprüft ob das WLAN aktiviert wurde:

using Microsoft.Phone.Net.NetworkInformation;
if(DeviceNetworkInformation.IsWiFiEnabled == true)
{
// Add code
}

Besser ist allerdings:

using Microsoft.Phone.Net.NetworkInformation;
if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
{
// Add code
}

Der Unterschied ist durchaus nicht zu vernachlässigen. Die 1. Methode testet schlicht ob WLAN überhaupt aktiviert ist. Die 2. Methode hingegen testet ob aktuell alle Daten welche ins Internet wollen über das WLAN fließen und dies auch funktioniert.

Leave a Comment

Filed under C#, Windows Phone

Erstellen eines OpenVPN Tunnels inc. Forwarding

Wollte ich schon lange mal machen, nun bin ich auch tatsächlich dazu gekommen. Ziel ist es einen OpenVPN Tunnel zu einem Server aufzubauen und diesen als Ausgangspunkt für jede Art von Internet Traffic zu nutzen.

Der OpenVPN Server läuft bei mir unter einem Ubuntu 12.04 LTS. Als Client kommt ein Windows 7/8 64bit vor. Die Konfiguration erfolgt so:

Server

Als erstes installieren wir OpenVPN und kopieren die Konfigurationsbeispieldateien nach /etc/openvpn:

apt-get install openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gz
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa2
cd /etc/openvpn/easy-rsa2/
mkdir keys

Hier editiert man nun die Zeilen und passt die Werte an seinen eigenen an:

export KEY_COUNTRY=DE
export KEY_PROVINCE=NRW
export KEY_CITY=Düsseldorf
export KEY_ORG=”Vpntest”
export KEY_EMAIL=”onlyspam [at] myhomepage.net”

Danach gehts in der Command Line weiter:

source ./vars
./clean-all
./build-ca
./build-key-server server
./build-dh
./build-key MeinRechnerName

Da der OpenVPN User am besten unter einem eigenen User läuft, legen wir diesen schnell an:

adduser --system --no-create-home --disabled-login openvpn
addgroup --system --no-create-home --disabled-login openvpn

In der Datei /etc/openvpn/server.conf müssen einige Zeilen wie folgt angepasst werden:

...
ca ./easy-rsa2/keys/ca.crt
cert ./easy-rsa2/keys/server.crt
key ./easy-rsa2/keys/server.key # Diese Datei geheim halten.
dh ./easy-rsa2/keys/dh1024.pem # Diffie-Hellman-Parameter
...
push "redirect-gateway def1 bypass-dhcp" #Aktiviert den OpenVPN Server als Standard Gateway auf den Clients
push "dhcp-option DNS 208.67.222.222" #Setz den OpenDNS Server als DNS Server auf den Clients
push "dhcp-option DNS 208.67.220.220" #Setz den OpenDNS Server als DNS Server auf den Clients
...
user openvpn
group openvpn

Zum Abschluss der Server Konfiguration müssen wir noch ein paar ipTables Regeln definieren:

iptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT

Client

Als erstes besorgen wir die Client Software, dieses gibts hier. Nun brauchen wir vom Server noch das Client Zertifikat + Private Key, außerdem noch das CA Zertifikat.
Da es bei der Übertragung vom Server öfters zu Encoding Fehlern kommt, packen wir das schnell in ein zip Archiv:

zip -r zipped.zip MeinRechnerName.crt MeinRechnerName.key ca.crt

Die 3 Dateien packen wir dann nach „C:\Program Files (x86)\OpenVPN\config“ und benennen diese wie folgt:

MeinRechnerName.crt --> client.crt
MeinRechnerName.key --> client.key
ca.crt --> Muss nicht umbenannt werden

Zum Abschluss kopieren noch aus dem Ordner „C:\Program Files (x86)\OpenVPN\sample-config“ die Datei „client.ovpn“ nach „C:\Program Files (x86)\OpenVPN\config“ und editieren dort folgende Zeile.
Hier muss my-server-1 durch den Hostname/IP des OpenVPN Servers ersetzt werden:

remove my-server-1 11194

Nun startet man nur noch das Programm „OpenVPN GUI“ und klickt auf „Connect“.

Dieses HowTo passiert im auf der Anleitung von Ubuntu Users Wiki. Für ausführliche Erklärungen was was macht, bitte dort schauen.

Leave a Comment

Filed under Allgemein

Autor von Revision in SVN Resporitory ändern

Eben mal schnell den Usernamen geändert mit welchem ich in mein persönliches SVN Repository commite. Da fiel mir dann auf, dass es irgendwie blöd aussieht das noch der alten Namen in den SVN Logs rumgeistert. Also mal schnell danach gegooglet und tatsächlich das kann man ändern. Folgendes muss getan werden:

1. Checkout des SVN Resporitorys (z.b. nach /root/svn)
2. In /root/svn eine Bash Script Datei anlegen und folgendes reinpasten:
Die 3 Variablen authenticationUserName, authenticationPassword, newAuthorName müssen selbst verständlich noch durch richtige Daten ersetzt werden.

#!/bin/sh
authenticationUserName="USERNAME"
authenticationPassword="PASSWORD"
newAuthorName="NEWAUTHORNAME"
maxrevision=`svn info | grep Revision | sed 's/Revision: \([0-9]\)/\1/g'`

for revision in `seq 1 $maxrevision`; do
svn propset --revprop -r $revision svn:author $newAuthorName --username $authenticationUserName --password $authenticationPassword;
done

Das wars auch schon 🙂
Je nachdem wie das SVN Repository konfiguriert ist kann es jedoch zu folgender Fehlermeldung kommen:

svn: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent
svn: At least one property change failed; repository is unchanged
svn: Error setting property 'author':
Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook

Dies ist nicht weiter schlimm. Es liegt schlicht an einem fehlenden ‚pre-revprop-change‘ Script (/path/to/svn/repository/hooks/pre-revprop-change).
Einfach schnell erstellen und gut ist:

echo '#!/bin/sh' > /path/to/svn/repository/hooks/pre-revprop-change && chmod +x /path/to/svn/repository/hooks/pre-revprop-change

Leave a Comment

Filed under Bash, Linux

SCP Upload via PSCP und PowerShell

Ich mag ja Batch (CMD.exe) sowas von garnicht, inzwischen schreibe ich alles in PowerShell. Hier mal ein kurzes Beispiel für einen SCP Upload auf ein Unix System mit Hilfe von pscp.exe.
Dies ist die Command Line SCP Version von Putty und lässt sich hier runterladen.

$PathToPSCPEXE = "C:\Program Files (x86)\Putty\pscp.exe"
$PathToPrivateKey = '"C:\Path\To\PrivateKey.ppk"'
$PrivateKeyPassPhrase = "PASSPHRASE"
$UserName = "root"
$UploadHostName = "hostname.example.org"
$PathToUploadFile = "C:\Path\To\File.txt"
$UploadPath = "/root/" # With closing "/"!
[Array]$Arguments = "-i", $PathToPrivateKey, "-pw", $PrivateKeyPassPhrase, $PathToUploadFile,($UserName,"@",$UploadHostName,":",$UploadPath,$PathToUploadFile.Split("\")[-1] -join "")

& $PathToPSCPEXE $Arguments

Leave a Comment

Filed under PowerShell

Alle möglichen Bildschirm Auflösungen mit PowerShell herausfinden

Gerade mal wieder was interessantes in PowerShell gefunden. Und zwar ging es mir darum die möglichen Auflösungen auszulesen, welche auf dem Rechner möglich sind.
Nach einigem Knobel kam folgendes dabei raus:

$Query = "SELECT * FROM CIM_VideoControllerResolution"
$res = Get-WMIObject -query $Query | Select Caption

Um die größtmögliche Auflösung herauszubekommen, kann folgendes verwendet werden:

$Query = "SELECT * FROM CIM_VideoControllerResolution"
$res = Get-WMIObject -query $Query | Select Caption | Select-Object -Last 1 | %{$_.Caption.Split("x")} | %{$_.Trim()} | Select-Object -First 2
$maxwidth = $res[0]
$maxheigth = $res[1]

Leave a Comment

Filed under PowerShell, Windows

Energieeinstellungen in PowerShell ändern

Mich hat eben interessiert ob ich nicht auch die Energieeinstellungen von Windows via PowerShell setzen kann. Nach kurzer Recherche stellt sich raus, ja kann ich und das sogar extrem simple:

powercfg -list
Bestehende Energieschemen (* Aktiv)
-----------------------------------
GUID des Energieschemas: 381b4222-f694-41f0-9685-ff5bb260df2e  (Ausbalanciert)
GUID des Energieschemas: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c  (Höchstleistung) *
GUID des Energieschemas: a1841308-3541-4fab-bc81-f71556f20b4a  (Energiesparmodus)

Das aktuelle gesetzte Energieschema kann man dann wie folgt auslesen:

powercfg -getactivescheme

Gesetzt wird das Energieschema dann mit:

powercfg -setactive $GUID

3 Comments

Filed under PowerShell, Windows

Erste eigene Windows Phone 7 App: MPC-Remote

Anfang Dezember war es bei mir mal wieder soweit, ich brauchte ein neues Handy. Da mir Windows Phone 7 schon bei meinen ersten Tests sehr gut gefallen hatte und mich das Design des neuen Nokia Lumia 800 sehr angesprochen hat, war schnell klar welches es wird.

Da ich mich unter anderem auch ein wenig auf die Programmierung mit C# verstehe war schnell klar, dass ich auch eigene Apps schreiben möchte. Um ein wenig in die Entwicklung rein zu kommen, welche doch ein Stück von der Desktop-App Entwicklung abweicht, besuchte ich das ‚Windows Phone 7 Coding Camp‘ welches von Microsoft in Zusammenarbeit mit der Hochschule der Medien in Stuttgart abgehalten wurde.

Ohne lange nachdenken zu müssen, war mir klar was für eine App ich schreibe. Und zwar eine Remote Control für Media Player Classic – Home Cinema. Warum? Weil ich den Player schlicht dem VLC vorziehe und es noch keine, meinen Ansprüchen genügende, App gab.

Meine App hab ich auf den Namen ‚MPC-HC Remote‘ getauft. Finden könnt ihr sie im Marketplace auf eurem Smartphone oder direkt über diesen Link.

Features:

  • Play/Pause
  • Nächster/letzter Titel
  • Lautstärken Steuerung
  • Vollbild de-/aktivieren

Geplante Features:

  • Browse Funktion
  • Schlagt mir was vor 😉

1 Comment

Filed under C#, Windows Phone

Exception Bug in .Net WebClient DownloadStringAsync Methode [Update]

Tja da frag ich mich ewig warum die ‚DownloadStringAsyn‚-Methode der ‚WebClient‚-Klasse von .Net mir eine NullReferenz Exception zurück gibt und am Ende muss ich feststellen, dass es an meiner URL lag… Von vorne:

Ich versuche mit der ‚DownloadStringAsync‘-Methode die browser.html von ‚MPC-HC‚ abzurufen um so die dort aufgeführten Werte in der dazugehörigen Windows Phone 7 App zu verarbeiten. Dies aber funktioniert nie, da ich immer eine NullReferenz Exception zurückbekomme.

So sieht z.B. eine der aufgerufenen URLs aus:

http://10.41.2.2:13579/browser.html?path=C:\Users\username\Desktop

Das Problem?
Die ‚DownloadStringAsync‘-Methode kommt nicht mit den Backslash’s klar und wirft eine absolut nichts sagende Exception.

Die Lösung?
‚MPC-HC‘ akzeptiert es auch, wenn man den Pfad Namen durch Slash’s trennt. Und schon läufts 🙂 Dies ist natürlich kein Bugfix sondern lediglich ein Workaround. Der Bug selbst ist hier schon bei Microsoft gemeldet.

[Update]: Ok, ich habe nun ein gut funktionierenden Workaround gefunden, man muss nur alle Backslashs mit „%5C“ ersetzen dann klappt alles wie gewollt.

Exception Message Ausschnitt:

-		error	{"An exception occurred during a WebClient request. "}	System.Exception {System.Net.WebException}
+		[System.Net.WebException]	{"An exception occurred during a WebClient request. "}	System.Net.WebException
		_data	null	System.Collections.IDictionary
		_HResult	-2146233079	int
-		_innerException	{""}	System.Exception
		_data	null	System.Collections.IDictionary
		_HResult	-2146233088	int
+		_innerException	{"0x80000012"}	System.Exception
		_message	""	string
+		_methodDescs	{System.IntPtr[9]}	System.IntPtr[]
		_optionalData	null	object[]
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2146233088	int
-		InnerException	{"0x80000012"}	System.Exception
		_data	null	System.Collections.IDictionary
		_HResult	-2146233088	int
		_innerException	null	System.Exception
		_message	"0x80000012"	string
+		_methodDescs	{System.IntPtr[15]}	System.IntPtr[]
		_optionalData	null	object[]
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2146233088	int
		InnerException	Der Ausdruck konnte nicht ausgewertet werden.	System.Exception
		Message	"0x80000012"	string
		StackTrace	"   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)\r\n   at MS.Internal.XcpImports.WebRequest_Send(InternalWebRequest request)\r\n   at MS.Internal.InternalWebRequest.Send()\r\n   at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer)\r\n   at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation()\r\n   at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state)\r\n   at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)\r\n   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)\r\n   at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken)\r\n   at MPC_Remote.MainPage.button1_Click(Object sender, RoutedEventArgs e)\r\n   at System.Windows.Controls.Primitives.ButtonBase.OnClick()\r\n   at System.Windows.Controls.Button.OnClick()\r\n   at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)\r\n   at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)\r\n   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)\r\n"	string
		Message	""	string
		StackTrace	"   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)\r\n   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n   at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)\r\n   at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)\r\n   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.b__8(Object state2)\r\n   at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)\r\n   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n   at System.Threading.ThreadPool.WorkItem.doWork(Object o)\r\n   at System.Threading.Timer.ring()\r\n"	string
		_message	"An exception occurred during a WebClient request. "	string
+		_methodDescs	{System.IntPtr[17]}	System.IntPtr[]
		_optionalData	null	object[]
+		Data	{System.Collections.ListDictionaryInternal}	System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
		HResult	-2146233079	int
+		InnerException	{""}	System.Exception
		Message	"An exception occurred during a WebClient request. "	string
		StackTrace	"   at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\r\n   at System.Net.DownloadStringCompletedEventArgs.get_Result()\r\n   at MPC_Remote.MainPage.client_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e)\r\n   at System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e)\r\n   at System.Net.WebClient.DownloadStringOperationCompleted(Object arg)\r\n   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)\r\n   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)\r\n   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)\r\n   at System.Delegate.DynamicInvokeOne(Object[] args)\r\n   at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)\r\n   at System.Delegate.DynamicInvoke(Object[] args)\r\n   at System.Windows.Threading.DispatcherOperation.Invoke()\r\n   at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)\r\n   at System.Windows.Threading.Dispatcher.OnInvoke(Object context)\r\n   at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)\r\n   at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)\r\n   at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)\r\n"	string

Leave a Comment

Filed under C#, Windows

Regex für Media Player Classic – Home Cinema Browse

Ich bastel gerade für Windows Phone 7 eine Remote Control App für ‚Media Player Classic – Home Cinema‚, welche auch die browse.html Seite des Webinterfaces nutzen soll. Um diese sinnvoll verarbeiten zu können, benötigt man einen Regex welcher die benötigten Infos aus der HTML-Seite rausparsed. Das hier hat bei mir in Version 1.5.2.3456 geklappt:

.*path=(?<Path>.*?)\">(?<Name>.*)</a>.*nobr.?>(?<Size>\\d+).*|.*path=(?<Path>.*?)\">(?<Name>.*)</a>.*Directory.*

Das ganze nutze ich so ein ‚Match‘-Regex. Es kommt raus:

  • Pfad zur Datei/Verzeichnis
  • Datei-/Verzeichnisname
  • Wenn vorhanden: Filesize in KiloByte

Leave a Comment

Filed under C#

Windows Phone „Textblock“ Manipulation

Ich entwickle gerade eine App für Windows Phone 7. Hierbei stieß ich auf das Problem, das der Text innerhalb eines ‚Textblocks‘ sich nicht über mehrere Zeilen ausdehnte und nicht mittig war. Nach kurzem googlen, fand ich heraus, dass man dem Textblock folgende Eigenschaften geben muss:

 

Für Text in einem Textblock mehrspaltig zu bekommen:

TextWrapping="Wrap"

Für den Text in einem Textblock mittig zu bekommen:

TextAlignment="Center"

Leave a Comment

Filed under Allgemein