Archiv für die Kategorie ‘SystemTools’

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 0×1 werden die Verwaltungstools angezeigt, bei 0×0 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:
# 0×41,0×42,0×43,0×44
# \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) # 0×0

}
}

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  (0×0)
        SERVICE_EXIT_CODE  : 0  (0×0)
        CHECKPOINT         : 0×0
        WAIT_HINT          : 0×0
        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  (0×1)
        SERVICE_EXIT_CODE  : 0  (0×0)
        CHECKPOINT         : 0×0
        WAIT_HINT          : 0×0

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    0×0

und unter Windows 8:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
    NoInteractiveServices    REG_DWORD    0×1

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.

GHOST32.EXE-Ersatz mittels Windows 8 bzw. WinPE 4 oder wie erstelle ich ein Festplattenimage mit Windows Bordmitteln?

2 Juli 2012

Wer Symantecs Ghost32.EXE aus der Enterprise Edition einsetzt, der weiß wie einfach es sein kann, Festplattenimages zu erstellen bzw. eine alte Platte durch eine neue Platte zu ersetzen.

Schon lange bin ich auf der Suche nach einer Ersatzlösung für Ghost32.exe z. B. http://newyear2006.wordpress.com/2010/11/21/ghost-enterprise-ersatz/ oder http://newyear2006.wordpress.com/2007/02/09/festplatten-clonen-mit-windows-vista-dvd-und-robocopy/ aber es war nichts so einfach wie Ghost32.EXE. Ein Problem das massiver wird, ist, dass GHOST32.EXE eben ein 32Bit Programm ist. Da aber alle neuen Windows Versionen in der Regel 64Bit sind und 32Bit WinPE-Umgebungen über kurz oder lang aussterben. Dies bedeutet, dass die alte Ghost32.EXE dort nicht mehr gestartet werden kann.

Nun gibt es wohl schon einige Zeit eine neue Version von Ghost, die auch 64Bit-fähig ist, aber warum soll man sich damit herumschlagen, zumal es nur Bestandteil einer größeren Suite ist, wenn das Betriebssystem die Sache selber mitbringt.

Eine weitere Altnative war noch die ImageX-Lösung um WIM-Dateien zu erstellen aber alles irgendwie nicht so aus einem Guss. ImageX war nicht von Haus aus enthalten.

Aber MS hat ein Einsehen gehabt und bringt nun alles nötige von Haus aus mit. Quasi wurde ImageX in DISM integriert. DISM.EXE kennt nun die Befehlszeilenoptionen /APPLY-IMAGE und /CAPTURE-IMAGE und ist auf jeder Windows 8 bzw. Server 2012 DVD enthalten!

Mittels

DISM.EXE  /Capture-Image  /ImageFile:Backup.wim  /CaptureDir:C:\  /Name:Backup

erhält man die Datei Backup.WIM mit dem kompletten Inhalt von C:\.

http://technet.microsoft.com/en-us/library/hh825041

Was die Sache so interessant macht ist, dass man mehrere Sicherungen in eine WIM-Datei packen kann und dabei mehrfach vorkommende Dateien nur einmal hinterlegt werden. Siehe Parameter /APPEND-IMAGE http://technet.microsoft.com/en-us/library/hh825258.

Was leider komplett fehlt ist der Punkt eine 1:1 Kopie zu erstellen, wo Sektor für Sektor kopiert wird. Aber für Forensiker bleibt ja noch das alte GHOST32 oder eben DD der Linuxler.

Die Sachen sind übrigens wichtig, um die von Windows 8 angepriesenen Funktionen wie “Refresh your PC” bzw. “Reset your PC” zu unterstützen. Beides läuft auch unter dem Punkt “Push-button reset”. http://technet.microsoft.com/en-us/library/hh824917

Ob alles reibungslos funktioniert, wird die Zeit zeigen…

MD5 und SHA1 Datei-Checksummen mittels Powershell errechnen – ein Ersatz für FCIV

25 Juli 2011

In letzter Zeit explodieren gewisse Downloads, wie z. B. der aktuelle Small Business Server 2011. Wenn man den herunterlädt, dann bekommt man gleich mal über 6GB zu installierende Daten.

Wenn es nun Probleme bei der Installation gibt, dann sollte man als erstes eine MD5 oder SHA1 Checksumme der Datei prüfen, weicht diese vom von Microsoft angegebenen Wert ab, dann ist nochmal ein Download angesagt. Übrigens gibt es auch in letzter Zeit immer mehr USB-Sticks, die so tun als ob alles korrekt wäre, aber in Wahrheit haben sie Probleme mit so großen Dateien.

Seither konnte man sich auf die Schnelle nur durch das FCIV-Tool (http://www.microsoft.com/download/en/details.aspx?id=11533) von Microsoft zum Errechnen der Checksumme behelfen. Auch 7-ZIP zeigt bei den Eigenschaften die Checksummen an. Aber was tun wenn man beides gerade nicht zur Verfügung hat?

Na einfach mit Powershell probieren. Für MD5 hilft:

[BitConverter]::ToString((new-object Security.Cryptography.MD5CryptoServiceProvider).ComputeHash((new-object IO.FileInfo("c:\windows\explorer.exe")).OpenRead())).Replace("-","").ToLower()

Für SHA1 dieses:

[BitConverter]::ToString((new-object Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash((new-object IO.FileInfo("c:\windows\explorer.exe")).OpenRead())).Replace("-","").ToLower()

Weitere Provider, für z. B. SHA256 usw: http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx

Jetzt wäre es noch schön, wenn Microsoft generell bei seinen Download-Dateien die Checksummen angeben würde. Das würde manchen Ärger ersparen.

Referenz: http://msmvps.com/blogs/alunj/archive/2011/07/24/1796672.aspx


Follow

Erhalte jeden neuen Beitrag in deinen Posteingang.