Archive for Dezember 2012

Probleme mit Windows Schrittaufzeichnung aufzeichnen (blöder Name), im englischen heißt es Problem Steps Recorder funktioniert sogar mit Windows 8 und Touchgesten sowie Windows Store Apps

31 Dezember 2012

So ich glaub das war mein längster Titel bisher aber musste sein. Also worum geht es? Oft hat man das Problem dass ein Benutzer bestimmte Aktionen macht, die man nicht nachvollziehen kann vor allem jetzt mit den Windows 8 Touchgeräten. Über eine Fernwartungssitzung lässt sich eben die Touchbewegung nicht so einfach nachvollziehen.

Aber zum Glück gibt es eine geniale Lösung. Die Windows Schrittaufzeichnung. Einfach in der Suche PSR eingeben und schon wir der Windows Problem Steps Recorder die PSR.EXE gefunden. Führt man diese aus und aktiviert die Aufzeichnung, bekommt man fein säuberlich die Wischbewegungen des Anwenders aufgezeichnet.

Cool dabei ist, dass es sogar bei Windows Store Apps geht. Somit kann man ganz einfach und toll seinen Spielfortschritt dokumentieren!!

Aber Achtung, wer sich wundert warum im Bericht auf einmal nicht alle erwarteten Masken auftauchen, dies liegt daran, dass Standardmäßig nur die letzten 25 Fenster aufgezeichnet werden. Eine Lösung ist die Angabe des Parameters /maxsc 100 oder mehr. Aber Vorsicht, wer das Ding nachher mailen möchte, sollte an die Größenbeschränkungen der Postfächer der Empfänger denken.

Hier noch ein guter Artikel über den PSR als solches, wo auch gleich die ganzen Kommandozeilenoptionen erklärt sind: http://blogs.technet.com/b/askperf/archive/2009/10/21/windows-7-windows-server-2008-r2-problem-steps-recorder.aspx

Advertisements

Schnelldiagnose mittels Powershell anstatt über die Ereignisanzeige

31 Dezember 2012

Um einen schnellen Überblick über die größten Nöte eines Systems zu finden, kann man diese Powershell Befehle verwenden:

Genereller Überblick

get-eventlog –Logname System | where {$_.EntryType –eq ‚Error‘} | select –First 10

get-eventlog –Logname System | where {$_.EntryType –eq ‚Warning‘} | select –First 10

get-eventlog –Logname Application | where {$_.EntryType –eq ‚Error‘} | select –First 10

get-eventlog –Logname Application | where {$_.EntryType –eq ‚Warning‘} | select –First 10

get-eventlog -LogName Security | where {$_.Entrytype -ne "SuccessAudit"} | select –First 10

Seit Windows Vista und Server 2008 wurde die Ereignisanzeige massiv erweitert durch die Windowsereignisse.

Einen schnellen Überblick über Hyper-V Probleme bekommt mittels:

Get-WinEvent –ProviderName "*Hyper-V*"

oder wo ein besitmmter Computername auftaucht

Get-WinEvent –ProviderName "*Hyper-V*" | where {$_.Message –match "Computername"}

oder wo ein Fehler aufgetreten ist:

Get-WinEvent –ProviderName "*Hyper-V*" | where {$_.LevelDisplayName –eq "Fehler"}

Wenn man wissen möchte, was an einem bestimmten Tag geschah:

Get-WinEvent-ProviderName "*Hyper-V*" | where {(Get-Date $_.TimeCreated –format d) –eq (Get-Date 13.10.2012 –format d)}

Wenn man wissen möchte, was zu einer bestimmten Stunde passierte:

Get-WinEvent-ProviderName "*Hyper-V*" | where {(Get-Date $_.TimeCreated –format "yyyyMMddHH") –eq (Get-Date "13.10.2012 11:00" –format "yyyyMMddHH")}

Hierbei ist zu beachten, das alles was vor 11:00Uhr also um 10:59 geschah unberücksichtigt bleibt. Wenn aber ein Ereignis um 11:01Uhr Probleme machte, sollte man natürlich den Überprüfungszeitraum auf 10:xxUhr ausdehnen!

Genau dies macht dieser Befehl, es wird etwas mit Zeiten jongliert und zwar werden dem Ursprungsereignis immer 20 Minuten hinzuaddiert, dadurch rutscht ein Ereignis von 10:45Uhr in das 11:00Uhr Zeitfenster:

Get-WinEvent-ProviderName "*Hyper-V*" | where {(Get-Date (Get-Date $_.TimeCreated).AddMinutes(20) –format "yyyyMMddHH") –eq (Get-Date "13.10.2012 11:00" –format "yyyyMMddHH")}

Logischerweise fallen dann Ereignisse nach 11:40 unter den Tisch.

Wer kompliziertere Abfragen oder gar Remoteabfragen braucht, der sollte sich bei Get-WinEvent einen Filter basteln und diesen angeben, weitere Infos dazu: https://newyear2006.wordpress.com/2011/04/28/ereignisanzeige-query-builder-fr-powershell/

In den Niederungen von SecureString mittels Powershell

30 Dezember 2012

Im ersten Blogbeitrag zu SecureString bin ich auf die allgemeine Anwendung von SecureStrings in Powershell und indirekt im .Net-Framework eingegangen. https://newyear2006.wordpress.com/2012/12/30/spa-mit-net-securestring-und-powershell-oder-sicheres-speichern-und-einlesen-von-passwrtern/

Wenn man mit den SecureStrings herumspielt, fällt einem schnell auf, dass diese quasi immer einen gleichen Header verwenden. Dieser beginnt immer mit der folgenden Zeichenfolge:

01000000d08c9ddf0115d1118c7a00c04fc297eb

Ab hier wird es nun interessant. Wenn man Google bemüht, kommen nicht all zu viele Treffer bei raus: https://www.google.de/search?q=01000000d08c9ddf0115d1118c7a00c04fc297eb. Aber unter den wenigen Treffern, sind wahre Perlen dabei! Denn es geht um nichts anderes als um eine eindeutige Kennung für DPAPI BLOBs welche von Windows seit Windows 2000 verwendet werden um Passwörter sicher in der Registrierung, Festplatte und Speicher abzulegen. DPAPI steht für Data Protection API. http://msdn.microsoft.com/en-us/library/ms995355.aspx.

Bleiben wir zunächst bei Powershell. Michal Grzegorzewski hat auf seiner Seite die Einträge mittels Debugger auseinandergenommen, hier die englische Übersetzung mittels Google: http://translate.googleusercontent.com/translate_c?depth=1&hl=de&prev=_dd&rurl=translate.google.de&sl=auto&tl=en&u=http://zine.net.pl/blogs/mgrzeg/archive/2011/03/11/dpapi-internals-a-securestring-w-powershellu.aspx&usg=ALkJrhhOdJ83W5rHYAcEnuML-v-KZ1KqNw. Dabei hat er festgestellt, dass Powershell die Methode Protect aus der ProtectedData Klasse aus dem .Net-Framework verwendet. http://msdn.microsoft.com/de-de/library/system.security.cryptography.protecteddata.protect.aspx. Protect verwendet wiederum CryptProtectData aus Crypt32.dll. http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.110).aspx. Ein Punkt der bei Powershells ConvertFrom-SecureString und ConvertTo-SecureString zu kurz kommt, ist die Sache dass es sich um benutzerbezogene Verschlüsselungen handelt. D. h. ein Passwort welches mittels ConvertFrom-SecureString als verschlüsselter Standardstring konvertiert und gespeichert wurde, kann nur von dem selben Benutzer auf dem ursprünglichen Rechner wieder gelesen und verwendet werden! Um die Sache dann noch weiter zu komplizieren, sei noch darauf hingewiesen, dass das verwendete Passwort des Benutzers auch noch eine Rolle spielt, was wiederum beim Zurücksetzten von Passwörtern wichtig werden kann: http://support.microsoft.com/kb/309408. Zu welchen Probleme das benutzerbezogene Speichern führen kann, schildert schön dieser Artikel: http://blog.codeassassin.com/2012/05/17/powershell-remoting-user-profiles-delegation-and-dpapi/.

Im zweiten Bereich seines ersten Blogeintrags unter “DAPI Internals” streift Grzegorzewski noch die Geschichte von Masterkeys und dass auf jedem Windows immer die vorhergehenden Keys gespeichert sein müssen, um auf ältere, verschlüsselte Daten zurückgreifen zu können. Thema CREDHIST. Aber das Thema lassen wir außen vor. Im zweiten Blog-Artikel geht er dann noch näher auf die Internas von DAPI Blobs ein http://translate.google.de/translate?hl=de&sl=auto&tl=en&prev=_dd&u=http%3A%2F%2Fzine.net.pl%2Fblogs%2Fmgrzeg%2Farchive%2F2011%2F03%2F30%2Fdpapi-internals-a-securestring-w-powershellu-cz-2.aspx. Dort nennt er Picod and Bursztein, welche das Tool libDPAPIck.dll, zu finden unter http://dpapick.com/ entwickelt haben. Das Tool erlaubt das Lesen von EFS-verschlüsselten Laufwerken von Linux oder anderen Offlinesystemen aus.

So nach dem kleinen Ausflug, wieder zurück zum Thema SecureStrings und Powershell. Im ersten Artikel https://newyear2006.wordpress.com/2012/12/30/spa-mit-net-securestring-und-powershell-oder-sicheres-speichern-und-einlesen-von-passwrtern/ wurde ja schon gezeigt, wie man ein Passwort wiederherstellen und sichtbar machen kann. Nun wollen wir die von Grzegorzewski verwendete Methode mittels Powershell auf den verschlüsselten Standardstring anwenden.

Wir haben also aus unserem ersten Artikel die Zeichenfolge

01000000d08c9ddf0115d1118c7a00c04fc297eb01000000d13e0b3adb59f6469325c229ee5b0d520000000002000000000003660000c0000000100
00000d57efc5b5ccd1e52e71296ec9b91a3530000000004800000a0000000100000006b946cd8b1c877db8c8ae6f39f4932bd10000000858fb31747
0ef57f405d954a5857409a14000000e2154da0885013dc5dbf21097c61c1d429f1e8ce

Dabei handelt es sich um einen Hexstring. Für den Aufruf von Unprotect http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.unprotect wird als Parameter ein Bytearray benötigt. Dazu benötigen wir als erstes eine Hilfsfunktion, welche den verschlüsselten Standardstring in ein ByteArray umwandelt, diese gibt es hier: http://www.sans.org/windows-security/2010/02/11/powershell-byte-array-hex-convert und nennt sich Convert-HexStringToByteArray. Also los gehts:

# $es enthält obigen String
Import-Module .\HexHelper.PS1
$eb=Convert-HexStringToByteArray $es
$mb=[System.Security.Cryptography.ProtectedData]::Unprotect($eb,$null,"CurrentUser")
[System.Text.Encoding]::Unicode.GetString($mb)

Zurück bekommen wir dann das ursprüngliche “Hallo”.

Dabei gibt es noch ein paar Dinge zu beachten. Der Aufruf von Unprotect funktioniert erst, wenn davor ConvertFrom-SecureString bereits benutzt wurde! Falls dies nicht der Fall ist, bekommt man die Fehlermeldung

Der Typ [System.Security.Cryptography.ProtectedData] wurde nicht gefunden: Vergewissern Sie sich, dass die Assembly, die diesen Typ usw…

Zum Warmlaufen kann man diesen Befehl vorher verwenden:

Read-Host – AsSecureString | ConvertFrom-SecureString

Wie oben bereits geschrieben, die Strings sind immer benutzerbezogen, wenn man also den String auf einer anderen Maschine versucht zu verarbeiten, erhält man die Meldung:

Ausnahme beim Aufrufen von "Unprotect" mit 3 Argument(en):  “Schlüssel ist im angegebenen Status nicht gültig."

Spaß mit .Net SecureString und Powershell oder sicheres Speichern und Einlesen von Passwörtern

30 Dezember 2012

Wer sich per .Net dem Thema SecureString annähert wird sich irgendwann fragen: “Warum bekomm ich den hinterlegten String nicht einfach zurück?”. Tja die Sache liegt in der Natur des SecureString selber. Er soll sicher sein!

Fangen wir mal mit einer einfachen Geschichte an, man möchte ein Passwort sicher eingeben:

PS> $pw=Read-Host –AsSecureString
*****
PS>

Sieht schon mal gut aus. Meine Passworteingabe lautete Hallo und es wurden aber nur Sternchen angezeigt. Wer jetzt denkt, man bekommt bei Abfrage von $pw das Passwort der täuscht sich:

PS> $pw
System.Security.SecureString

OK, dann halt über ein Property?

PS> $pw | Get-Member

   TypeName: System.Security.SecureString

Name         MemberType Definition
—-         ———- ———-
AppendChar   Method     void AppendChar(char c)
Clear        Method     void Clear()
Copy         Method     securestring Copy()
Dispose      Method     void Dispose(), void IDisposable.Dispose()
Equals       Method     bool Equals(System.Object obj)
GetHashCode  Method     int GetHashCode()
GetType      Method     type GetType()
InsertAt     Method     void InsertAt(int index, char c)
IsReadOnly   Method     bool IsReadOnly()
MakeReadOnly Method     void MakeReadOnly()
RemoveAt     Method     void RemoveAt(int index)
SetAt        Method     void SetAt(int index, char c)
ToString     Method     string ToString()
Length       Property   int Length {get;}

Na supi! Nur Length ist als Property vorhanden. Na dann vielleicht ToString()?

PS> $pw.ToString()
System.Security.SecureString

Nene, das Ding soll ja sicher sein!

Übrigens was gibt Length zurück?

PS> $pw.Length
5

Das würde passen, “Hallo” hat genau fünf Buchstaben. Kurz gesagt, es gibt keine direkte Möglichkeit den String zurückzubekommen.

Wofür braucht man nun das Ding? Die aktuelle Beschreibung auf MSDN (V4.5), gibt keinen Tipp. http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx

Also mal etwas recherchiert:

Sicher gibt es noch mehr Stellen, aber die kleine Auswahl sollte erst mal reichen.

OK, der Anwendungszweck gegeben, aber was kann ich damit anfangen? Vor allem im Zusammenhang mit Powershell? Ein erster Hinweis steht in der SecureString Doku auf MSDN:

Note that SecureString has no members that inspect, compare, or convert the value of a SecureString. The absence of such members helps protect the value of the instance from accidental or malicious exposure. Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

Aha, man muss also in die Niederungen der InteropServices absteigen. Dann legen wir gleich mal los:

PS> $BSTR=[System.Runtime.InteropServices.marshal]::SecureStringToBSTR($pw)
PS> $BSTR
39018744
PS> $pws = [System.Runtime.InteropServices.marshal]::PtrToStringAuto($BSTR)
PS> $pws
Hallo
PS> [System.Runtime.InteropServices.marshal]::ZeroFreeBSTR($BSTR)

Hier findet nun die ganze Show statt. Zuerst holt man sich mittels SecureStringToBSTR die ursprüngliche Eingabe und einen Pointer auf die Stelle, wo der String nun temporär abgelegt wird. Bei PtrToStringAuto wird der temporäre String ausgelesen, zurückgegeben und in $pws gespeichert. Mit ZeroFreeBSTR wird der temporäre String wieder freigegeben, bzw der temporäre Speicherplatz mit Nullen überschrieben (Secure!). Blöd nur, dass wir das Passwort nun in $pws haben, denn ab nun ist die Sache nicht mehr sicher!!

Hier noch der Link zu SecureStringToBSTR: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.securestringtobstr.aspx

Damit schließt sich der Kreis. Aber Moment, da geht noch mehr.

Passwörter in Dateien speichern
Es gibt nämlich die tollen Funktionen ConvertTo-SecureString und ConvertFrom-SecureString. Wer glaubt, damit ließe sich obige Prozedur abkürzen, der täuscht sich. Denn diese dienen nur dazu den SecureString zu serialisieren bzw. in einen Standard-String zu wandeln, um ihn z. B. in einer Datei speichern zu können.

Machen wir genau dies und speichern unseren String mal in einer Datei, dazu wandeln wir ihn zuerst, lassen ihn ausgeben und prüfen ob es ein String ist:

PS> $pwe = ConvertFrom-SecureString –SecureString $pw
PS> $pwe
01000000d08c9ddf0115d1118c7a00c04fc297eb01000000d13e0b3adb59f6469325c229ee5b0d520000000002000000000003660000c0000000100
00000d57efc5b5ccd1e52e71296ec9b91a3530000000004800000a0000000100000006b946cd8b1c877db8c8ae6f39f4932bd10000000858fb31747
0ef57f405d954a5857409a14000000e2154da0885013dc5dbf21097c61c1d429f1e8ce
PS> $pwe.GetType()

IsPublic IsSerial Name                                     BaseType
——– ——– —-                                     ——–
True     True     String                                   System.Object

PS> Set-Content –Value $pwe –Path pwenc.txt
PS> type .\pwenc.txt
01000000d08c9ddf0115d1118c7a00c04fc297eb01000000d13e0b3adb59f6469325c229ee5b0d520000000002000000000003660000c0000000100
00000d57efc5b5ccd1e52e71296ec9b91a3530000000004800000a0000000100000006b946cd8b1c877db8c8ae6f39f4932bd10000000858fb31747
0ef57f405d954a5857409a14000000e2154da0885013dc5dbf21097c61c1d429f1e8ce

Perfekt. Damit hat man eine saubere Möglichkeit gefunden Passwörter sicher abzuspeichern. Um sicher zu gehen, dass dem so ist, muss man die Sache natürlich auch wieder rückwärts machen können.

SecureString-Passwörter aus Dateien auslesen
Die Geschichte ist einfach erzählt

PS> $pw=Get-Content pwenc.txt | ConvertTo-SecureString

Damit kann man $pw wieder bei SecureStringToBSTR, wie oben gezeigt anwenden und bekommt das gespeicherte Passwort im Klartext zurück.

Eingabeaufforderung mit lokalen Systemdienst Rechten unter Windows

29 Dezember 2012

Hin und wieder braucht man andere Rechte, als Admin hat man zwar auf alles Zugriff aber das System an sich darf noch viel mehr. Um schnell einen Wechsel mit Boardmitteln hinzubekommen, gibt es zwei geniale Befehle:

sc create ntauthcmd binpath= "cmd /K start" type= own type= interact

Obigen Befehl muss man natürlich als Admin absetzen und bekommt dann diesen Warnhinweis:

[SC] CreateService ERFOLG

WARNUNG:  Der Dienst "ntauthcmd" ist als interaktiver Dienst konfiguriert, desse
n Unterstützung abgelehnt wurde. Die einwandfreie Funktion des Dienstes ist nich
t gewährleistet.

Die Warnung kann aber einfach ignoriert werden, zum Starten gibt man:

sc start ntauthcmd

ein, wobei man wieder eine Warnung bekommt:

[SC] StartService FEHLER 1053:

Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderun
g.

Nun obacht geben auf die Taskleiste! Denn dort fängt auf einmal ein kleines Dienstsymbol mit Kamera und Drucker an zu blinken! Klickt man dieses an bekommt man einen Dialog mit folgender Meldung dargestellt:

[Window Title]
Erkennung interaktiver Dienste

[Main Instruction]
Von einem auf diesem Computer ausgeführten Programm wird versucht, eine Meldung anzuzeigen.

[Content]
Möglicherweise sind Informationen oder Berechtigungen erforderlich, damit das Programm den Vorgang abschließen kann.
Woran liegt das?

[V] Programmdetails einblenden  [Meldung anzeigen] [Später erneut nachfragen]

[Expanded Information]
Programme und Geräte, für die ein Eingreifen angefordert wird.

Nachricht:  C:\Windows\system32\cmd.exe
Programmpfad:  C:\Windows\system32\cmd.exe
Empfangen:  ‎Heute, ‎29. ‎Dezember ‎2012, ‏‎22:46:21

Dieses Problem tritt auf, wenn ein Programm nicht vollständig kompatibel mit Windows ist. Wenden Sie sich an den Programm- oder Gerätehersteller, um weitere Informationen zu erhalten.

Sieht alles dramatisch aus, aber führt zum Ziel! Also einfach “Meldung anzeigen” anklicken. Dann flackert bei den meisten Monitoren etwas die Darstellung weil der Grafikmodus geändert wird aber man kommt auf einen einsamen leeren Desktop mit einer Eingabeaufforderung. Es wird auch noch eine weitere Meldung dargestellt:

[Window Title]
Erkennung interaktiver Dienste

[Main Instruction]
Zurück zum Windows-Desktop

[Content]
Für Programm wird ein eigenes Fenster angezeigt, wenn noch weiteres Eingreifen erforderlich ist.

Wenn Sie Ihre Aktionen abgeschlossen haben oder wenn Sie zum Desktop zurückkehren möchten, klicken Sie auf "Jetzt zurück".

[Jetzt zurück]

Klickt man hier auf “Jetzt zurück” bleibt der separate Desktop erhalten und man kann hin und her wechseln. Der separate Desktop verschwindet erst, wenn man die Eingabeaufforderung schließt und dann zurückkehrt.

Frägt man an der Eingabeaufforderung mittels whoami nach, wer man ist, erhält man:

C:\windows\system32>whoami
nt-autorität\system

Da die Sache auf die Dauer auch etwas komisch aussieht, kann man den Dienst auch wieder entfernen:

sc delete ntauthcmd

Eine Alternative zu dieser Vorgehensweise wäre PSEXEC.EXE von den Sysinternals-Tool, aber die braucht man nicht wirklich: http://blogs.technet.com/b/askds/archive/2008/10/22/getting-a-cmd-prompt-as-system-in-windows-vista-and-windows-server-2008.aspx

Quelle: http://myitforum.com/cs2/blogs/cnackers/archive/2009/05/06/nt-authority-context-command-prompt.aspx

Bluetooth-Probleme auf Android 4.2 mit Nexus 7

29 Dezember 2012

Zum Glück streame ich mittlerweile die meiste Musik über WLAN mittels UPnP bzw. DLNA aber dennoch ist im Auto noch A2DP mit Bluetooth angesagt. Dort gab es seither immer Probleme während der Fahrt mit der Musikübertragung von einem Android Google Nexus mit 4.1 und gelegentlichen Hopfern. Was soll ich sagen, nach dem Update auf die aktuelle 4.2.1 Version läuft die Sache perfekt. Weniger Glück scheinen aber die Google Nexus 7 Besitzer gehabt zu haben, wie dieser Bugeintrag zeigt: https://code.google.com/p/android/issues/detail?id=39633

Exchange Server 2010 Anzahl der aktuell angemeldeten Benutzer ermitteln

22 Dezember 2012

Bevor man einen Exchange-Server neu startet oder vom Netz nimmt, macht es Sinn, vorher zu prüfen, wie viel Benutzer auf dem Server aktiv sind.

Am einfachsten geht dies per Powershell

get-counter "\MSExchange OWA\Aktuelle eindeutige Benutzer"
get-counter "\MSExchange RpcClientAccess\Anzahl Benutzer"

Aber Vorsicht auf einem englisch sprachigen Exchange lautet der Counter:

"\MSExchange OWA\Current Unique Users"
"\MSExchange RpcClientAccess\User Count"

Um leichter herauszufinden was es für Möglichkeiten gibt, verwendet man dieses Skript:

(get-counter –ListSet "MSExchange OWA").Counter

Wer nun wissen will, welche Performance Counter den Eintrag “Benutzer” kennen, der verwendet diesen Befehl:

get-counter –ListSet MSExchange* | select –ExpandProperty Counter | where {$_ –match "benutzer"}

Mit dem letzten Schnipsel kann man nun auch schnell die richtige Übersetzung für englische Anleitungen finden!

Beim Zuordnen von Anlagen im Outlook erscheint Meldung “Die Anlagengröße überschreitet das erlaubte Maximum.”

19 Dezember 2012

Wenn diese Meldung erscheint, liegt dies einfach darin, dass Outlook 2010 eine standardmäßige interne Begrenzung auf 20MB für E-Mailanhänge hat.

http://support.microsoft.com/kb/2222370