Archive for the ‘SystemTools’ Category

Festplatten löschen (wipen) mit Windows Bordmitteln

23 Oktober 2014

Unglaublich was man manchmal für Entdeckungen macht und sich wundert, warum man davon noch nie gehört hat. Per Zufall bin ich heute über Cipher.EXE gestolpert. Hatte ich zuvor noch nie gehört. Wenn man die Hilfe von Cipher.EXE anschaut, dann wird schnell klar, dass es für die Verschlüsselung von Dateien und Verzeichnissen zuständig ist.

Aber dann taucht da auch der Parameter /W für Wipe auf:

    /W       

Entfernt Daten aus verfügbarem, nicht verwendetem Speicherplatz auf dem Volume. Alle anderen Optionen werden ignoriert, wenn diese Option ausgewählt wird. Das angegebene Verzeichnis kann sich an einer beliebigen Position auf dem lokalen Volume befinden. Wenn es sich um einen Bereitstellungspunkt oder einen Verweis auf ein Verzeichnis auf einem anderen Volume handelt, werden die Daten auf diesem Volume entfernt.

Es agiert also nicht wie Sdelete von Sysinternals und überschreibt bestehende Dateien, sondern überschreibt den freien Speicherbereich eines Volume.

Wenn man nun eine Festplatte mittels DISKPART Befehl CLEAN löscht, dann eine Partition darauf einrichtet, dann kann man mittels CIPHER /W die Festplatte komplett löschen.

Spannend wird die Sache in Verbindung mit WinPE. Schade das WinPE, WinRE und die Windows-Bootmedien keine direkte Unterstützung für CIPHER.EXE haben. Aber oft hat man ja sowieso irgendwo ein Windows bzw. auf der zu löschenden Platte ein vorhandenes Windows.

Man muss also einfach nur CIPHER.EXE von der lokalen Windows-Installation kopieren. Dabei ist allerdings zu beachten, ob die WinPE-Umgebung 32-Bit oder 64-Bit unterstützt. Je nachdem verwendet man dann C:\Windows\System32\cipher.exe oder C:\Windows\SysWOW64\cipher.exe. Wenn die Cipher.EXE von dem Laufwerk kommt, welches gelöscht werden soll, kopiert man es auf das RAM-Laufwerk X: und startet es von dort aus.

Ach noch was: Man könnte auch den CLEAN Befehl mit dem Parameter ALL bei DISKPART verwenden, dann würde auch alles mit 0x00 überschrieben. Warum sollte man dann CIPHER.EXE verwenden? CIPHER.EXE geht beim Überschreiben anders vor, es überschreibt in drei Durchgängen. Zuerst wird alles mit 0x00 dann mit 0xFF und am Schluss mit Zufallswerten überschrieben. Dies ist auch der Grund, warum CIPHER.EXE nachgesagt wird, es wäre langsam.

http://blogs.technet.com/b/chad/archive/2012/08/16/tip-53-wipe-your-hard-drive-without-any-extra-programs.aspx

Und noch was: Bei SSDs gibt es nicht die sichere Möglichkeit wirklich alles zu löschen. In diesem Fall sollte man schauen, ob die betreffende SSD eine interne AES-Verschlüsselung bietet und ob man dort den zugehörigen Key löschen kann.

Fehlende Rechte bei Standardbenutzer zur Konfiguration von Geräte-Manager oder Modemoptionen unter Windows 8

23 Juli 2014

Auf einer aktuellen Windows 8.1 Maschine musste ein Callbridge TAPI Treiber installiert werden. Abgesehen vom ganzen Vorspiel, dass wegen eines Bugs von Microsoft bzw. eine Änderung der TAPI-API bei Windows 8.1 64-Bit, eine komplette neue Telefonanlage nötig war, sollte nur ein TAPI Treiber konfiguriert werden.

Nach der Treiberinstallation wurde unter der Systemsteuerung Modem und Telefonoptionen aufgerufen sowie das Register Erweitert. Hier kann man üblicherweise Konfigurieren anklicken, damit man die betreffenden zusätzlichen Einstellungen vornehmen kann. Leider war dies immer ausgegraut. Denn der angemeldete Benutzer ist nur Standardbenutzer. Ist ja eigentlich kein Problem aber obwohl bei der Konfigurationsschaltfläche das Schild für die höheren Adminrechte angezeigt wurde, wurde nie nach den Adminrechten gefragt. Jeder Klick wurde großzügig ignoriert.

Dies äußert sich auch an viel prominenterer Stelle. Klickt man auf System und dann auf Geräte-Manager, erscheint dies:

—————————
Geräte-Manager
—————————
Sie sind als Standardbenutzer angemeldet. Dies ermöglicht Ihnen zwar das Anzeigen von Geräteinstellungen im Geräte-Manager, zum Vornehmen von Änderungen müssen Sie jedoch als Administrator angemeldet sein.
—————————
OK  
—————————

Dabei war davor am Link auch noch das Zeichen mit dem Schild zu sehen, wo normalerweise nach Adminrechten gefragt wird. Aber das interessiert halt nicht.

Wieder mal typisch MS Chaos. Was tun?

Diese Liste verzeichnet Programme die man direkt aufrufen kann: http://newyear2006.wordpress.com/2008/02/08/direktstartprogramme-unter-windows-vista-und-windows-xp/. Unter anderem gibt es hier telephon.cpl. Genau das wird benötigt aber mit mehr Rechten, also:

C:\>runas /profile /user:pc\admin "cmd.exe /c start telephon.cpl"
Geben Sie das Kennwort für "pc\admin" ein:
Es wird versucht, cmd.exe /c start telephon.cpl als Benutzer "rms\admin" zu starten…

Trommelwirbel: Das wars. Damit war Konfigurieren anklickbar. OK, das war die komplizierte Lösung. Es reicht eigentlich wenn man eine Eingabeaufforderung als Admin aufmacht und dann

start telephon.cpl

oder

devmgmt.msc

für den Gerätemanager aufruft.

Auf der Suche nach Powershell ISE, Ereignisanzeige

18 März 2013

Wer auf einem einfachen Windows 8 Rechner auf der Suche der Powershell ISE ist, der wundert sich, wo diese versteckt ist. Wenn man im Kachelstartmenü einfach Powershell eingibt, erscheint nur die Powershell Eingabeaufforderung. Wo ist der Rest?

Er ist da und gut versteckt! Für die Powershell ISE könnte man direkt %windir%\system32\WindowsPowerShell\v1.0\Powershell_ISE.exe aufrufen. Aber es gibt noch eine weitere Variante.

Bei aktiver Startseite, öffnet man die Charms-Leiste, klickt auf Einstellungen und noch auf Kacheln. Hier ändert man den Schalter Verwaltungstools anzeigen von Nein auf Ja. Danach findet man die Powershell ISE. Eine Alternative stellt die Tastenkombination WIN+I und dann die Eingabetaste dar.

Insgesamt werden durch die Änderung des Schalters diese Tools freigeschaltet:

Aufgabenplanung
Computerverwaltung
Datenträgerbereinigung
Dienste
Ereignisanzeige
iSCSI-Initiator
Komponentendienste
Laufwerke defragmentieren und optimieren
Leistungsüberwachung
ODBC-Datenquellen (32-Bit)
ODBC-Datenquellen (64-Bit)
Ressourcenmonitor
Systeminformationen
Systemkonfiguration
Windows PowerShell (x86)
Windows PowerShell SE (x86)
Windows PowerShell SE
Windows-Firewall mit erweiterter Sicherheit
Windows-Speicherdiagnose

Wie gesagt, sind alle sowieso da aber durch die Änderung des Schalters, werden Sie auf der Startseite auch eingeblendet.

Man kann die aktuelle Einstellung auch über die Registrierung abfragen. Mittels

REG QUERY HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

erhält man unter anderem den Eintrag StartMenuAdminTools angezeigt, ist dieser 0x1 werden die Verwaltungstools angezeigt, bei 0x0 nicht. Leider bringt eine Änderung des Registry-Eintrags nichts, auch wenn man einen Neustart probiert.

Windows Driverstore mittels Powershell auslesen

12 Februar 2013

Seit Windows Vista gibt es den sogenannten Windows Driverstore. Im Windows Driverstore sind alle Treiber welche Windows mitbringt verzeichnet. http://msdn.microsoft.com/en-us/library/windows/hardware/ff544868(v=vs.85).aspx

Man kann die enthaltenen Treiber mittels DISM auslesen (als Admin):

dism /online /get-drivers /all /format:Table

Dabei bekommt man eine Liste wie diese

Tool zur Abbildverwaltung für die Bereitstellung
Version: 6.1.7600.16385

Abbildversion: 6.1.7600.16385

Liste aller Treiber wird aus dem Treiberspeicher abgerufen…

Treiberpaketauflistung:

———————————- | ———————————- | ————– | ———————- | —
——————————————————– | ———- | —————-
Veröffentlichter Name              | Originaldateiname                  | Windows-intern | Klassenname            | Anb
ietername                                                | Datum      | Version
———————————- | ———————————- | ————– | ———————- | —
——————————————————– | ———- | —————-
1394.inf                           | 1394.inf                           | Ja             | 1394                   | Mic
rosoft                                                   | 21.06.2006 | 6.1.7601.17514
61883.inf                          | 61883.inf                          | Ja             | 61883                  | Mic
rosoft                                                   | 21.06.2006 | 6.1.7600.16385
acpi.inf                           | acpi.inf                           | Ja             | System                 | Mic
rosoft                                                   | 21.06.2006 | 6.1.7601.17514
acpipmi.inf                        | acpipmi.inf                        | Ja             | System                 | Mic
rosoft                                                   | 21.06.2006 | 6.1.7601.17514
adp94xx.inf                        | adp94xx.inf                        | Ja             | SCSIAdapter            | Ada
ptec                                                     | 11.11.2008 | 1.6.6.4
adpahci.inf                        | adpahci.inf                        | Ja             | SCSIAdapter            | Ada
ptec                                                     | 27.04.2007 | 1.6.6.2
adpu320.inf                        | adpu320.inf                        | Ja             | SCSIAdapter            | Ada
ptec                                                     | 25.01.2007 | 7.2.0.0

sieht nicht schön aus, aber hat Gehalt.

Ok, aber wir bewegen uns in der Powershell-Welt, wie siehts da aus? Leider bringt erst Windows 8 DISM-Cmdlets mit. Aber mittels Piping kann man DISM zur Mitarbeit überreden:

$ds=dism /online /get-drivers /all /format:Table

ließt zunächst die ganze Tabelle in die Variable $ds ein. Die spannenden Teile bekommt man mittels

$ds[14..($ds-length-4)]

ausgegeben.

Mittels dieser Zeile bekommt man alles schön brav als Powershell-Objekte präsentiert:

$di=$ds[14..($ds.length-4)]|foreach {$f=$_.Split("|"); new-object -typename psobject -Property  @{PublishedName=$f[0];OriginalFileName=$f[1];Inbox=$f[2];ClassName=$f[3];ProviderName=$f[4];Date=Get-Date($f[5]);Version=$f[6]} }

Nun kann man die üblichen Powershell-Spielchen bringen wie z. B. die Ausgabe in einer Tabelle:

$di | out-gridview

Hier eine Übersicht der einzelnen Treiber je Klasse:

$di | group -property Classname | select count, name

Oder Ausgabe aller Druckertreiber:

$di | where {$_.Classname -eq "Printer"}

Oder die Druckertreiber eines Herstellers wie HP:

$di | where {$_.Classname -eq "Printer" -and $_.Providername -match "HP"}

Was zur Ausgabe

Date             : 29.10.2010 00:00:00
Version          : 61.109.9.8874
PublishedName    : oem5.inf
OriginalFileName : hpcu109u.inf
ProviderName     : HP
ClassName        : Printer
Inbox            : Nein

Date             : 21.06.2006 00:00:00
Version          : 6.1.7600.16385
PublishedName    : prnhp002.inf
OriginalFileName : prnhp002.inf
ProviderName     : HP
ClassName        : Printer
Inbox            : Ja

Date             : 21.06.2006 00:00:00
Version          : 6.1.7600.16385
PublishedName    : prnhp003.inf
OriginalFileName : prnhp003.inf
ProviderName     : HP
ClassName        : Printer
Inbox            : Ja

Date             : 21.06.2006 00:00:00
Version          : 6.1.7600.16385
PublishedName    : prnhp004.inf
OriginalFileName : prnhp004.inf
ProviderName     : HP
ClassName        : Printer
Inbox            : Ja

Date             : 21.06.2006 00:00:00
Version          : 6.1.7600.16385
PublishedName    : prnhp005.inf
OriginalFileName : prnhp005.inf
ProviderName     : HP
ClassName        : Printer
Inbox            : Ja

hat.

Moment hier tauchen nur fünf Treiber auf? Komisch oder?

Aber kein Problem es gibt einen weiteren DISM-Befehl der weitere Infos zutage fördert:

dism /online /get-driverinfo /driver:prnhp005.inf

Mittels diesem erhält man weitere Treiberinformationen:

Tool zur Abbildverwaltung für die Bereitstellung
Version: 6.1.7600.16385

Abbildversion: 6.1.7600.16385

Treiberpaketinformationen:

Veröffentlichter Name : prnhp005.inf
Treiberspeicherpfad : C:\Windows\System32\DriverStore\FileRepository\prnhp005.inf_amd64_neutral_914d6c300207814f\prnhp00
5.inf
Klassenname : Printer
Klassenbeschreibung : Drucker
Klassen-GUID : {4D36E979-E325-11CE-BFC1-08002BE10318}
Datum : 21.06.2006
Version : 6.1.7600.16385
Für den Start erforderlich : Nein

Treiber für Architektur : amd64

    Hersteller : HP
    Beschreibung : HP Photosmart C309a series
    Architektur : amd64
    Hardware-ID : HPPhotosmart_C309a_s277D
    Dienstname :
    Kompatible IDs : HP_Photosmart_C309a_series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Photosmart C309a series BT
    Architektur : amd64
    Hardware-ID : HPPhotosmart_C309a_sA58A
    Dienstname :
    Kompatible IDs : HP_Photosmart_C309a_series_BT
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8000 A809 Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_8000e3dd
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8000_A809_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8500 A909n Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_8500e33c
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8500_A909n_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8500 A909g Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_8500e5fc
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8500_A909g_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8500 A909a Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_8500e77c
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8500_A909a_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8500 A909n Series BT
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_85007188
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8500_A909n_Series_BT
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8500 A909g Series BT
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_8500ed8b
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8500_A909g_Series_BT
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet Pro 8500 A909a Series BT
    Architektur : amd64
    Hardware-ID : HPOfficejet_Pro_8500658b
    Dienstname :
    Kompatible IDs : HP_Officejet_Pro_8500_A909a_Series_BT
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet 6500 E709n Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_6500_E70e4a2
    Dienstname :
    Kompatible IDs : HP_Officejet_6500_E709n_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet 6500 E709a Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_6500_E70e0e2
    Dienstname :
    Kompatible IDs : HP_Officejet_6500_E709a_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet 6000 E609a Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_6000_E604cdc
    Dienstname :
    Kompatible IDs : HP_Officejet_6000_E609a_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Officejet 6000 E609n Series
    Architektur : amd64
    Hardware-ID : HPOfficejet_6000_E60489c
    Dienstname :
    Kompatible IDs : HP_Officejet_6000_E609n_Series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Deskjet F4400 series
    Architektur : amd64
    Hardware-ID : HPDeskjet_F4400_seri4818
    Dienstname :
    Kompatible IDs : HP_Deskjet_F4400_series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Photosmart C4600 series
    Architektur : amd64
    Hardware-ID : HPPhotosmart_C4600_sEC29
    Dienstname :
    Kompatible IDs : HP_Photosmart_C4600_series
    Ausschluss-IDs :

    Hersteller : HP
    Beschreibung : HP Deskjet D2600 series
    Architektur : amd64
    Hardware-ID : HPDeskjet_D2600_seri56FC
    Dienstname :
    Kompatible IDs : HP_Deskjet_D2600_series
    Ausschluss-IDs :

Der Vorgang wurde erfolgreich beendet.

Hier kann man nun den einzelnen Druckernamen erkennen.

Diese Druckerinfos kann man wieder in einer Variable einlesen:

$pd=dism /online /get-driverinfo /driver:prnhp005.inf

und natürlich wieder in Powershell-Objekte übertragen:

$pdl=$pd|select-string -Context 7 -Pattern Hersteller

Sorry aus Zeitmangel überlasse ich es jedem selber hier die sinnvollen Informationen auszulesen.

Hier noch zwei Blogeinträge passend zum Thema, wo mittels Excel eine Übersicht über enthaltene Treiber im Driverstore geliefert werden: http://www.verboon.info/index.php/2010/12/inside-the-windows-7-driver-store/ und http://www.verboon.info/index.php/2011/01/inside-the-windows-7-driver-storepart-2/.

Wifi Netzwerksicherheitsschlüssel unter Windows per Powershell auslesen

2 Januar 2013

Es gibt unter Windows zwar wohl eine Methode sich den hinterlegten Netzwerksicherheitsschlüssel für Wifi Netzwerke anzuzeigen aber die Methode ist nur über die GUI-Oberfläche möglich und ist recht umständlich, wenn man die Keys mehrerer Netze abfragen möchte.

Es gibt natürlich auch allerhand Utilities wie z. B. WirelessKeyview von Nirsoft http://www.nirsoft.net/utils/wireless_key.html. Aber wer vertraut per solch sicherheitskritischen Dingen schon gern unbekannter Software. Zumal diese oft von Virenscannern als Malware klassifiziert werden: http://blog.nirsoft.net/2012/10/10/amazing-difference-between-antivirus-false-alerts-on-32-bit-and-64-bit-builds-of-exactly-the-same-tool/.

Was liegt also näher, als die Sache selber mit Bordmitteln zu lösen. Das Thema ist allerdings etwas komplexer weshalb ich als Vorbereitung in den vergangenen Tagen bereits verschiedene Artikel geschrieben habe.

Zuerst werden die Berechtigungen vom Systemdienst benötigt: http://newyear2006.wordpress.com/2013/01/01/eingabeaufforderung-mit-lokalen-systemdienst-rechten-unter-windows-8-und-windows-server-2012/.

Dann ist wichtig, wie man mit SecureStrings in Powershell umgeht: http://newyear2006.wordpress.com/2012/12/30/spa-mit-net-securestring-und-powershell-oder-sicheres-speichern-und-einlesen-von-passwrtern/

Noch etwas mehr Hintergrund, wie man in den tiefen von SecureString die DPAPI benutzt: http://newyear2006.wordpress.com/2012/12/30/in-den-niederungen-von-securestring-mittels-powershell/

Dann braucht man noch die Idee für solch einen Artikel: http://securityxploded.com/wifi-password-secrets.php

So nun zum Script, am besten speichert man es unter WifiUtil.PS1:

# Warmup
ConvertTo-SecureString -AsPlainText -Force Hallo| ConvertFrom-SecureString

function Convert-HexStringToByteArray {
# http://www.sans.org/windows-security/2010/02/11/powershell-byte-array-hex-convert
################################################################
#.Synopsis
# Convert a string of hex data into a System.Byte[] array. An
# array is always returned, even if it contains only one byte.
#.Parameter String
# A string containing hex data in any of a variety of formats,
# including strings like the following, with or without extra
# tabs, spaces, quotes or other non-hex characters:
# 0x41,0x42,0x43,0x44
# \x41\x42\x43\x44
# 41-42-43-44
# 41424344
# The string can be piped into the function too.
################################################################
[CmdletBinding()]
Param ( [Parameter(Mandatory = $True, ValueFromPipeline = $True)] [String] $String )
#Clean out whitespaces and any other non-hex crud.
$String = $String.ToLower() -replace ‘[^a-f0-9\\\,x\-\:]’,”

#Try to put into canonical colon-delimited format.
$String = $String -replace ‘0x|\\x|\-|,’,':’

#Remove beginning and ending colons, and other detritus.
$String = $String -replace ‘^:+|:+$|x|\\’,”

#Maybe there’s nothing left over to convert…
if ($String.Length -eq 0) { ,@() ; return }

#Split string with or without colon delimiters.
if ($String.Length -eq 1)
{ ,@([System.Convert]::ToByte($String,16)) }
elseif (($String.Length % 2 -eq 0) -and ($String.IndexOf(":") -eq -1))
{ ,@($String -split ‘([a-f0-9]{2})’ | foreach-object { if ($_) {[System.Convert]::ToByte($_,16)}}) }
elseif ($String.IndexOf(":") -ne -1)
{ ,@($String -split ‘:+’ | foreach-object {[System.Convert]::ToByte($_,16)}) }
else
{ ,@() }
#The strange ",@(…)" syntax is needed to force the output into an
#array even if there is only one element in the output (or none).
}

function Get-WLANKeyFromProfile {
[CmdletBinding()]
param(
  [xml]$x)

if ($x -ne $null)
{
  $key=$x.WLANProfile.MSM.security.sharedKey.keyMaterial
         $eb=Convert-HexStringToByteArray $key
  $mbl=[System.Security.Cryptography.ProtectedData]::Unprotect($eb,$null,"LocalMachine")
  $key=[System.Text.Encoding]::ASCII.GetString($mbl)
  $key.Substring(0,$key.Length-1) # 0x0

}
}

function Get-SSIDFromProfile {
[CmdletBinding()]
param(
  [xml]$x)

if ($x -ne $null)
{
  $key=$x.WLANProfile.SSIDConfig.SSID.name
  $key
}
}

# C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces

$wifi=Get-ChildItem -Recurse|Select-String -pattern "01000000D08C9DDF0115D1118C7A00C04FC297EB"
$wifi | Add-Member -Type ScriptProperty –Name SSID -Value { Get-SSIDFromProfile $this.XMLProfileFile }
$wifi | Add-Member -Type ScriptProperty -Name WlanKey -Value { Get-WLANKeyFromProfile $this.XMLProfileFile }
$wifi | Add-Member -Type ScriptProperty -Name XMLProfileFile -Value { [xml](Get-Content $this.path) }

Wenn man auf dem Desktop des Systemdienst ist, geht man in das Verzeichnis

CD C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces

und ruft dort Powershell auf und importiert obiges Script mittels

Import-Module WifiUtil.PS1

Man hat nun in $Wifi alle auf dem System bekannten Wifi-Keys mit Angaben zu den SSIDs. Mittels Powershell 3.0 und Out-Gridview gibt es die perfekte Darstellung:

$wifi | Out-GridView

oder man verwendet die klassische Methode:

$wifi | select –Property SSID,WlanKey

So das war aber erst der Anfang mit dieser Methode lässt sich noch viel mehr anstellen.

Eingabeaufforderung mit lokalen Systemdienst-Rechten unter Windows 8 und Windows Server 2012

1 Januar 2013

Gerade erst gebloggt und doch schon nicht mehr aktuell. Blöd sowas aber wer konnte damit rechnen, dass Microsoft eine bestehende Funktionen die seit Ewigkeiten da ist, degradiert. Es geht um diesen Artikel: http://newyear2006.wordpress.com/2012/12/29/eingabeaufforderung-mit-lokalen-systemdienst-rechten-unter-windows/

Ausgehend von

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

und mittels

sc start ntauthcmd

konnte bisher eine Kommandozeile mit lokalen Systemdienstrechten gestartet werden und mehr oder weniger einfach darauf zugegriffen werden.

Dies funktioniert unter Windows 8 und Windows Server 2012 nicht mehr! Zumindest von Haus aus.

Wenn man unter diesen Systemen den Dienst startet, wird kein Icon in der Taskleiste angezeigt. Die Frage ist generell ob die Methode überhaupt noch funktioniert?

Mittels

TASKLIST /FI "IMAGENAME eq cmd.exe"

bekommt man jedoch schnell Klarheit. Denn mit jedem Aufruf von sc start ntauthcmd wird ein weiterer cmd.exe Eintrag hinzugefügt. Auch taucht die cmd.exe unter Services und mit Nummer 0 auf, also scheint dies noch perfekt zu funktionieren. Auch der Taskmanager führt die CMD.EXEs als Hintergrundprozesse.

Aber wie kommt man nun in die 0er Session?

Auf der Suche nach der Lösung hatte ich mir natürlich den Dienst UI0Detect, auch bekannt als “Erkennung interaktiver Dienste” oder in englisch “Interactive Service Detection”, angeschaut. Zunächst dachte ich, die Lösung wäre ganz einfach, denn dieser Dienst ist unter Windows 8 einfach auf manuellen Start eingestellt.

Mittels

sc qc UI0Detect

bekommt man die passenden Infos über den Dienst, hier die Ausgabe bei Windows 7

[SC] QueryServiceConfig ERFOLG

SERVICE_NAME: UI0Detect
        TYPE               : 110  WIN32_OWN_PROCESS (interactive)
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\Windows\system32\UI0Detect.exe
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Erkennung interaktiver Dienste
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

Was soll das? DEMAND_START ist Starttyp Manuell in der GUI! Also kein Unterschied, dennoch läuft das Ding auf Windows 7 automatisch aber bei Windows 8 nicht. Wer es startet? Keine Ahnung.

Aber man kann ja den Dienst einfach mal selber starten. Was scheren einen schon unzählige Programme die leider immer noch nicht sauber mit der Trennung von Diensten und UI umgehen können. Also

sc start UI0Detect

abgesetzt und dies erhalten

SERVICE_NAME: ui0detect
        TYPE               : 110  WIN32_OWN_PROCESS  (interactive)
        STATE              : 4  RUNNING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 6804
        FLAGS              :

Na also sieht doch gut aus, blöd nur dass

sq query ui0detect

dies zurückgibt

SERVICE_NAME: ui0detect
        TYPE               : 110  WIN32_OWN_PROCESS  (interactive)
        STATE              : 1 STOPPED
        WIN32_EXIT_CODE    : 1  (0x1)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

Verdammt, es könnte alles so einfach sein. Unter der GUI heißt die offizielle Meldung:

Der Dienst "Erkennung interaktiver Dienste" auf "Lokaler Computer" konnte nicht gestartet werden.

Fehler 1: Unzulässige Funktion.

Supi und jetzt?

Die Suchmaschine meines Vertrauens förderte gleich beim ersten Eintrag einen brauchbaren Link hervor, nachdem man sie mit den richtigen Parametern gefüttert hatte. https://www.google.de/search?q="interactive+service+detection"+"error+1"

Der Link ist http://www.coretechnologies.com/WindowsServices/FAQ.html#UI0DetectFailsToStart und beschreibt genau obiges Problem. Dabei wird ein Registrierungseintrag beschrieben  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows mit Namen NoInteractiveServices beschrieben.

Also diesen mal kurz abgefragt mittels

reg query HKLM\SYSTEM\CurrentControlSet\Control\Windows /v N
oInteractiveServices

ergibt unter Windows 7

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
    NoInteractiveServices    REG_DWORD    0x0

und unter Windows 8:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
    NoInteractiveServices    REG_DWORD    0x1

Also tatsächlich ein Unterschied. Also diesen Wert mittels

reg add HKLM\SYSTEM\CurrentControlSet\Control\Windows /v N
oInteractiveServices /t REG_DWORD /d 0

geändert und nochmal den Dienst gestartet und flutsch, alles funktioniert wieder so wie gewohnt!

So das war mal wieder viel Geschreibsel für nichts. Aber die entscheidenden Zeilen unter Windows 8 sind:

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

reg add HKLM\SYSTEM\CurrentControlSet\Control\Windows /v NoInteractiveServices /t REG_DWORD /d 0

sc start ntauthcmd

Dabei ist anzumerken, dass die Änderung an der Registrierung nur einmalig gemacht werden muss. Danach reagiert Windows 8 wie Windows 7 und reagiert auf künftige sc start ntauthcmd automatisch.

Auf der Suche nach der Lösung bin ich noch über diese Blogeinträge gestolpert, welche einem das Thema mit UI0Detect und mögliche Problemlösungen nahebringen: http://blogs.msdn.com/b/patricka/archive/2010/04/27/what-is-interactive-services-detection-and-why-is-it-blinking-at-me.aspx und http://blogs.msdn.com/b/patricka/archive/2011/03/14/troubleshooting-interactive-services-detection.aspx. Wenn ich mir dabei die Kommentare so anschaue, dann scheint das immer noch aktuell ein Thema zu sein, dabei ist die Umstellung, wo mit Vista kam, jetzt schon so alt. Vielleicht hat MS die Funktion doch zu früh deaktiviert.

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

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: http://newyear2006.wordpress.com/2011/04/28/ereignisanzeige-query-builder-fr-powershell/

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

Kryptische Gerätenamen in der Windows Ereignisanzeige auflösen und dem passenden Gerät bzw. Laufwerksbuchstaben zuordnen

10 November 2012

Häufiger kommt es vor, dass man bei Problemen in der Windows Ereignisanzeige einen Eintrag findet wie z. B.:


Bei einem Auslagerungsvorgang wurde ein Fehler festgestellt. Betroffen ist Gerät \Device\Harddisk3\DR3.

Diese perfekten, genauen Angaben! Einfach wunderbar. Wenn man nun aber mehrere Laufwerke an einem Rechner, physikalisch und virtuell hat, dann wird die Sache schnell kompliziert.

Leider gibt es nicht eine einfache Lösung mit Bordmitteln. Powershell mit WMI gibt leider zu wenig Infos her. Man benötigt ein Programm Namens WinObj von Sysinternals: http://technet.microsoft.com/en-us/sysinternals/bb896657

Damit sucht man unter dem Ordner GLOBAL?? in der Spalte SymLink den obigen Eintrag für \Device\Harddisk3\DR3 und findet in meinem Fall unter der Spalte Name den Eintrag PhysicalDrive3.

Mit Physicaldrive3 geht die Suche nun mittels Powershell weiter.

gwmi win32_diskdrive

listet alle physikalischen Laufwerke auf und

gwmi win32_diskdrive | where deviceid -eq "\\.\PHYSICALDRIVE3"

findet den gesuchten Eintrag. In meinem Fall kam dann

Partitions : 1
DeviceID   : \\.\PHYSICALDRIVE3
Model      : QNAP iSCSI Storage SCSI Disk Device
Size       : 1408743705600
Caption    : QNAP iSCSI Storage SCSI Disk Device

zu Tage. Damit wusste ich endlich, dass das Problem von einem QNAP NAS herrührte. Aber es gab mehrere QNAP NASse. Also welches wars?

Mittels

gwmi win32_diskdrivetodiskpartition | where Antecedent -match "DRIVE3"

wurde weitergefahndet, welches dieses Ergebnis brachte:

__GENUS          : 2
__CLASS          : Win32_DiskDriveToDiskPartition
__SUPERCLASS     : CIM_MediaPresent
__DYNASTY        : CIM_Dependency
__RELPATH        : Win32_DiskDriveToDiskPartition.Antecedent="\\\\VERONIKA7\\root\\cimv2:Win32_Dis
                   \\\\\.\\\\PHYSICALDRIVE3\"",Dependent="\\\\VERONIKA7\\root\\cimv2:Win32_DiskPar
                   k #3, Partition #0\""
__PROPERTY_COUNT : 2
__DERIVATION     : {CIM_MediaPresent, CIM_Dependency}
__SERVER         : VERONIKA7
__NAMESPACE      : root\cimv2
__PATH           : \\VERONIKA7\root\cimv2:Win32_DiskDriveToDiskPartition.Antecedent="\\\\VERONIKA7
                   iskDrive.DeviceID=\"\\\\\\\\.\\\\PHYSICALDRIVE3\"",Dependent="\\\\VERONIKA7\\ro
                   artition.DeviceID=\"Disk #3, Partition #0\""
Antecedent       : \\VERONIKA7\root\cimv2:Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE3"
Dependent        : \\VERONIKA7\root\cimv2:Win32_DiskPartition.DeviceID="Disk #3, Partition #0"
PSComputerName   : VERONIKA7

Nun nimmt man obiges Ergebnis und speichert es für eine weitere Abfrage

$dp = gwmi win32_diskdrivetodiskpartition | where Antecedent -match "DRIVE3"
gwmi win32_logicaldisktopartition | where Antecedent -eq $dp.Dependent | select Dependent

Mittels dieser letzten Abfrage erhält man dann

\\VERONIKA7\root\cimv2:Win32_LogicalDisk.DeviceID="S:"

Somit hat man endlich den NT Gerätenamen aus dem Eventlogeintrag in einen sinnvollen Namen zugeordnet. Übrigens war hier Laufwerk S: ein Sicherungslaufwerk, welches nur noch 200MB Platz hatte. Aber das ist eine andere Geschichte.

Hier was zu NT Gerätenamen: http://msdn.microsoft.com/en-us/library/windows/hardware/ff557722(v=vs.85).aspx und hier eine etwas bessere Beschreibung: http://support.microsoft.com/kb/235128

Dann gäbe es noch das DOSDEV.EXE welches ich früher schon mal unter http://newyear2006.wordpress.com/2006/11/25/ermitteln-des-zugehorigen-laufwerksbuchstaben-zu-geratenamen/#comment-21354 beschrieben habe. Bin mir aber nicht sicher ob dies unter 64Bit noch läuft.


Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.