Category Archives: Windows

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]

2 Comments

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#

Autostart für PageAnt – Laden von eigene SSH Keys

Wenn man viel mit Putty und SSH Keys arbeitet ist PageAnt ein ganz nützliches Programm. Es merkt sich die SSH Keys und reicht sie an Putty weiter, wenn dieses sie benötigt. Sollte ein Kennwort benötigt werden, entfällt die Eingabe.
Nun kann es vorkommen, wie etwa bei mir, dass man täglich mit Putty arbeitet. Es lohnt sich also den Einbindevorgang von PageAnt zu automatisieren.
Dies geht wie folgt:

  • Man installiert sich das vollständige Packet von Putty, welches man hier findet.
  • Nun erstellt man sich eine Batch Datei mit folgendem Inhalt:
start /d"%ProgramFiles(X86)%\Putty" pageant.exe "%Pfad zu SSH Key .ppk%"
  • Hier müsst ihr nur noch die Pfade auf euere System anpassen und die Batch Datei in euren Autostart Ordner legen

Das wars auch schon, wird PageAnt bei jedem Start des Systems mitgestartet und läd automatisch den/die SSH Keys. Wenn ein Passwort für den Key notwendig ist, wird dieses einmalig abgefragt.

Leave a Comment

Filed under Windows

Windows und das verschieben von Systemordnern

Ich habe mir neulich eine OCZ Agility 3 60GB gekauft, da diese meiner Meinung nach ein sehr gutes Preis/Leistungsverhältnis hat (~100€).  Nun wie ihr euch vorstellen könnt, kommt es bei 60GB ziemlich schnell zu Speicherplatzproblemen, wenn man nicht unnötige Sachen auslagert. Zum Beispiel habe ich einige GigaByte an Fotos, welche allerdings beim besten Willen nicht den teueren Speicherplatz auf der SSD verbrauchen müssen. Nun hat Windows 7 hier eine sehr praktische Funktion eingebaut und zwar kann man die wichtigsten Systemordner mit 3 Klicks in ein anderes Verzeichnis respektive eine andere Festplatte verschieben. Dies geht wie folgt:

  • Windows 7 - Systemorder - Pfad anpassenNavigiert im Explorer nach C:\Users\{Benutzername}
  • Dort könnt ihr unter: Rechtsklick auf den Ordner -> Eigenschaften -> Pfad den Pfad anpassen an den ihr den Ordner verschieben möchtet.

Das ganze funktioniert mit den Ordnern:

  • Desktop
  • Downloads
  • Eigene Bilder
  • Eigene Dokumente
  • Eigene Musik
  • Eigene Videos

Ich finde es sehr praktisch, da die meisten Daten in diesen Ordnern eh keine Daseinsberechtigung auf SSD Speicherplatz haben.

Noch eine zusätzliche Info für User welche TrueCrypt für die Systemverschlüsselung einsetzen: Wenn man die zweite Festplatte
auch verschlüsselt hat und diese als Systemfavoriten-Volumen bei Start von Windows mit emounten lässt, funktioniert das ganze immer noch ausgezeichnet. Es gibt absolut keine Probleme, auf Grund von zu spät eingebundenen Volumen!

Danke TrueCrypt und Microsoft!

Leave a Comment

Filed under Windows

Viele Rar Dateien entpacken mit PowerShell

Ich hatte soeben das Problem, dass ich einige dutzend .rar Dateien hatte, welche in allen möglichen Unterverzeichnissen einen Ordners lagen. Da ich ehrlich gesagt viel zu faul bin jede Datei einzeln anzuklicken und zu entpacken habe ich vor einiger Zeit das Programm „Muli Unpacker“ gefunden, welches aber einen entscheidenden Nachteil hat: Das Winrar-Entpack Fenster ist immer im Vordergrund. Ergo ziemlich blöd wenn man nebenher irgendwas sinnvolles arbeiten möchte.
Da Winrar standardmäßig aber auch einige Command-Line Tools (rar.exe, unrar.exe) mitbringt, kann man dies auch schnell in der PowerShell automatisieren. Folgendermaßen könnte solch ein Script aussehen:

$input = Read-Host "Bitte Pfad eingeben:"
$files = Get-ChildItem $input -Recurse -Filter *.rar 

foreach ($file in $files)
{
    $Filename = $file.FullName
    $DirectoryName = $file.DirectoryName
    & 'C:\Program Files\WinRAR\UnRAR.exe' x -y $filename $DirectoryName | Out-Null
    if ($LASTEXITCODE -match "0")
    {
        rm "$DirectoryName\*.r*"
        rm "$DirectoryName\*.sfv"
        Write-Host "Gelöscht: $DirectoryName\*.r*"
        Write-Host "Gelöscht: $DirectoryName\*.sfv"
    }
    else
    {
        Write-Host -ForegroundColor Red "ACHTUNG FEHLER! $filename"        
    }
}

Ich hoffe dem ein oder anderen hilft das weiter 🙂 Gute Nacht 🙂

2 Comments

Filed under PowerShell, Windows

PowerShelll ISE und das signieren…

Zur Zeit beschäftige ich mich auf der Arbeit ziemlich viel mit PowerShell, da die Sprache super Möglichkeiten bietet Windows zu automatisieren. Meiner Ansicht nach wäre Linux wohl nicht so groß geworden hätte Microsoft schon früher eine Script Sprache zu Automatisierung bereitgestellt die anständig entwickelt wurde. Aber gut darum solls hier nicht gehen…

Gestern beschäftige ich mit dem Signieren von PowerShell Scripts um diese später in der kompletten Firma sicher ausführen zu können. Wie die Windows-CA Einrichtung funktioniert kann man hier nachlesen, um was es mir geht ist die eigentliche Signierung der Scripts. Dies kann wie folgt durchgeführt werden:
namespace Holding

Set-AuthenticodeSignature c:\foo.ps1 @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

Dies soll dazu führen das der Script C:\foo.ps1 mit dem ersten Zertifikat aus dem lokalem Zertifikatestore “CurrentUser\My” signiert wird.
Wenn man nun allerdings den Script mit der von Microsoft entwickelten PowerShell ISE geschrieben hat, kommt es bei signieren immer und immer wieder zu einem “Unknown Error”. Nun kann man allerdings hergehen, den Inhalt der mit ISE geschrieben Script Datei in eine neue Datei in einem normalen Editor kopiert, diese abspeichert und signiert funktioniert es wunderbar.

Die logische Schlussfolgerung lautet also, die PowerShell ISE speichert die Scripts auf irgendeine andere Art und Weise ab, die nicht kompatibel zu der Signier-Funktion ist.
Warum dies geschieht ist mir völlig schleierhaft. Was macht es für einen Sinn eine eigene Entwicklungsumgebung raus zubringen, mit welcher man keine 100% kompatiblen Scripts erstellen kann?!?!

Naja Gott sei Dank gibt es von einem Drittanbieter ein Ersatztool. Das ganze nennt sich PowerGUI und ist kostenlos hier downloadbar.

Leave a Comment

Filed under PowerShell, Windows