LoaderException bei Add-Type in Powershell

11 Dezember 2017

Will man in Powershell mittels Add-Type eine DLL Datei laden, so kann es passieren, dass der Versuch mit einer Ausnahme abgebrochen wird:

PS> add-type -path ‚C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.1.22.0\lib\net451\MimeKit.dll‘
add-type : Mindestens ein Typ in der Assembly kann nicht geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen benötigen.
In Zeile:1 Zeichen:1
+ add-type -path ‚C:\Program Files\PackageManagement\NuGet\Packages\Mim …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
    + FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeComma
   nd

Schön solche umfassenden Fehlermeldungen, wo bekomme ich nun aber die LoaderException-Eigenschaft her? Das Fehlerobjekt liefert zunächst nix brauchbares. Der Parameter –Force ist wichtig damit alle Eigenschaften angezeigt werden:

PS> $error|fl * -Force

PSMessageDetails      :
Exception             : System.Reflection.ReflectionTypeLoadException: Mindestens ein Typ in der Assembly kann nicht
                        geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen
                        benötigen.
                           bei System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
                           bei System.Reflection.Assembly.GetTypes()
                           bei Microsoft.PowerShell.Commands.AddTypeCommand.LoadAssemblyFromPathOrName(List`1
                        generatedTypes)
                           bei Microsoft.PowerShell.Commands.AddTypeCommand.EndProcessing()
                           bei System.Management.Automation.CommandProcessorBase.Complete()
TargetObject          :
CategoryInfo          : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
ErrorDetails          :
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : bei <ScriptBlock>, <Keine Datei>: Zeile 1
PipelineIterationInfo : {}

Aber es gibt bei der Exception-Eigenschaft etwas:

PS> $Error.Exception|fl -Force

Types            : {MimeKit.MimeParser, MimeKit.AttachmentCollection, MimeKit.BodyBuilder,
                   MimeKit.ContentDisposition…}
LoaderExceptions : {System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   , System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   , System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   , System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   …}
Message          : Mindestens ein Typ in der Assembly kann nicht geladen werden. Rufen Sie die
                   LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen benötigen.
Data             : {}
InnerException   :
TargetSite       : System.RuntimeType[] GetTypes(System.Reflection.RuntimeModule)
StackTrace       :    bei System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
                      bei System.Reflection.Assembly.GetTypes()
                      bei Microsoft.PowerShell.Commands.AddTypeCommand.LoadAssemblyFromPathOrName(List`1
                   generatedTypes)
                      bei Microsoft.PowerShell.Commands.AddTypeCommand.EndProcessing()
                      bei System.Management.Automation.CommandProcessorBase.Complete()
HelpLink         :
Source           : mscorlib
HResult          : –2146232830

Da der ganze kram Drumherum in diesem Fall nicht interessiert, ist diese Zeile zielführend:

PS> $error[0].exception.loaderexceptions[0]
Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942" oder
eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Also kurz gesagt, es fehlt eine andere Assembly bzw. DLL-Datei, in diesem Fall BouncyCastle. Wenn also bei einer LoaderException bei Add-Type ein Problem auftaucht hilft diese Zeile:

$error[0].exception.loaderexceptions[0]

Advertisements

Bildschirminhalt einer virtuellen Maschine im Hyper-V Server abrufen

6 Dezember 2017

Wenn man auf einem Microsoft Hyper-V Server (https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/hyper-v-server-2016) unterwegs ist, also der frei verfügbaren Version, dann hat man manchmal das Problem, dass man wissen möchte, warum eine virtuelle Maschine noch nicht ansprechbar ist. Meist hat es mit einem Hänger oder mit blöden Updates zu tun. Falls man nun aber direkt auf der Konsole des Servers ist, dann gibt es keine direkten grafischen Mittel die passenden Infos abzurufen.

Aus diesem Grund hab ich ein Script gebastelt, damit man in Zukunft die passenden Funktionen direkt verfügbar hat. Hier zunächst die Ausgangslage, wie man das Bild einer virtuellen Maschine speichert (https://blogs.msdn.microsoft.com/virtual_pc_guy/2016/05/27/capturing-a-hyper-v-vm-screen-to-a-file/) daraus resultierte dieses abgewandelte Skript:

#
Add-Type -AssemblyName "System.Drawing"
Add-Type -AssemblyName "System.Windows.Forms"

function Get-VMScreenBMP {
    param
    (
        $VMName,
        $index=0
    )

    $VMCS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName=’$($VMName)’"

    # Get the resolution of the screen at the moment
    $video = $VMCS.GetRelated("Msvm_VideoHead")
    If ($video.Count -gt 0) {
        If ($index -gt $video.Count) {
            $index = $video.Count
        }
        $x = $video.CurrentHorizontalResolution[$index]
        $y = $video.CurrentVerticalResolution[$index]

        $VMMS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_VirtualSystemManagementService

        # Get screenshot
        $image = $VMMS.GetVirtualSystemThumbnailImage($VMCS, $x, $y).ImageData

        # Transform into bitmap
        $BitMap = New-Object System.Drawing.Bitmap -Args $x,$y,Format16bppRgb565
        $Rect = New-Object System.Drawing.Rectangle 0,0,$x,$y
        $BmpData = $BitMap.LockBits($Rect,"ReadWrite","Format16bppRgb565")
        [System.Runtime.InteropServices.Marshal]::Copy($Image, 0, $BmpData.Scan0, $BmpData.Stride*$BmpData.Height)
        $BitMap.UnlockBits($BmpData)

        $BitMap
    } else {
        Write-Error "No Video Device found, VM not running?"
    }
}

Function Show-Screen([System.Drawing.Image]$img, $VMName) {
    $form = new-object Windows.Forms.Form
    $form.Text = "Screen from $VMName"
    $form.Width = $img.Size.Width;
    $form.Height =  $img.Size.Height;
    $pictureBox = new-object Windows.Forms.PictureBox
    $pictureBox.Width =  $img.Size.Width;
    $pictureBox.Height =  $img.Size.Height;

    $pictureBox.Image = $img;
    $form.controls.add($pictureBox)
    $form.Add_Shown( { $form.Activate() } )
    $form.ShowDialog()
}

Function Show-VMScreen ($vmName, $index=0) {

    $bmp=Get-VMScreenBMP $vmName $index
    Show-Screen $bmp $VmName

}

Function Save-VMScreen ($vmName, $index=0, $filename=($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\$($VMName)Screen.BMP"))) {
       
    $bmp=Get-VMScreenBMP $vmName $index
    $bmp.Save($filename)
   
}

Daraus ergeben sich die Funktionen:

# speichern in eine Datei
Save-VMScreen –VMName SampleVMName –Filename ".\test.bmp"

# direkte Ausgabe am Bildschirm
Show-VMScreen  –VMName SampleVMName

Man kann noch einen Parameter –Index angeben, dieser ist als Vorgabe 0 und spricht einen spezifischen Videohead an. Wie dieser genau definiert ist, ließ sich leider nicht herausfinden. Aber kurz gesagt, kann man damit höher aufgelöste Bilder erhalten.

Man kann sogar das aktuelle Bild in die Windows-Zwischenablage legen, damit man es für Dokuzwecke woanders wieder einfügen kann:

[System.Windows.Forms.Clipboard]::SetImage((Get-VMScreenBMP "SampleVMName"))

Letzte abgestürzte Chrome Sessions Tabs wiederherstellen

5 Dezember 2017

Wenn man, wie ich, Chrome Tabs sammelt um ja nichts zu vergessen, dann kann es in einer ungünstigen Situation passieren, dass man diese z. B. durch einen Neustart des Rechners verliert, oder wenn jemand anderes einfach herumklickt und Chrome öffnet ohne die alten Sessions wiederherzustellen. Zum Glück gibt es aber eine recht einfache Methode die alten Sitzungen wiederherzustellen.

Hier wird der grundsätzliche Weg beschrieben: https://superuser.com/questions/342437/how-to-restore-chrome-without-restore-button-and-the-files-last-session-and/639956#639956.

Hier nochmal der Weg in meinen Worten:

Bestehende Chrome Instanz im Taskmanager beenden

Stop-Process Chrome* –Force

und ins Verzeichnis

CD "$Env:LocalAppData\Google\Chrome\User Data\Default"

wechseln, dann

ren "Current Session" "Current Session.old"
ren "Current Tabs" "Current Tabs.old"
ren "Last Session" "Current Session"
ren "Last Tabs" "Current Tabs"

Nun kann man Chrome wieder starten.

Virtuelle Soundkarte für Windows

30 November 2017

Bei den vielen virtuellen Maschinen mit denen man es heutzutage zu tun hat, gibt es manchmal eine Situation, wo man gerne Sound hören würde. Aber je nach Zugang zur VM ist dies evtl. nicht möglich.

Zum Glück gibt es eine einfache Möglichkeit dieses Problem zu lösen. Man installiert einfach eine virtuelle Soundkarte. Bewährt hat sich Cable von VB Audio: https://www.vb-audio.com/Cable/. Das Programm ist umsonst und ist schnell installiert. Es funktioniert tadellos unter Windows 10 auf x86 sowie x64 Basis.

Logging Komponenten bei Windows 10 Updates und Installationen

27 November 2017

Bei Windows gibt es mehrere setupact.log-Dateien. In diesen wird der komplette Update- bzw. Installationsprozess dokumentiert. Bei den Logeinträgen gibt es die sogenannten Logging-Komponenten. Eine Beschreibung von Microsoft https://docs.microsoft.com/en-us/windows/deployment/upgrade/resolve-windows-10-upgrade-errors#log-entry-structure nennt dabei diese Komponenten:

Kürzel Beschreibung
CONX compatibility information
MOUPG main upgrade component?
PANTHR ?
SP setup platform
IBSLIB Image-based Setup (Lib?)
MIG migration engine
DISM Deployment Image Servicing and Management
CSI Component Servicing Infrastructure
CBS Component-Based Servicing

Wie das immer so ist mit den Beschreibungen, enthält die Realität mehr Überraschungen parat. Wenn man ein aktuelles Windows 10 v1709 mittels dieses Scripts

Get-Content .\setupact.log | % {If ($_) { If ($_.Substring(0, 1)) {  If ($_.length -gt 48) { If ($_.SubString(19, 1) -eq ",") { $_.Substring(43, 6)}}}} }| sort -Unique | ? {$_.trim() -gt 0} | % {$_.trim()}

untersucht, dann kommen weitere Logging-Komponenten zum Vorschein:

Kürzel Beschreibung
DIAG diagnose?
DU Driver/device updates
IBS Image-based Setup
SYSPRP System Preparation

Lässt man obiges Script auf eine erfolgreiche Windows 10 Update-Installation los, wo sich die SetupAct.log in C:\Windows\Panther befindet, dann tauchen noch ein paar Komponenten mehr auf:

Kürzel Beschreibung
CMI  
DIAGER diagnose error?
SXS side by side?
TOOL  
UI user interface?

Hier nochmal alle bisher gefundenen Komponenten in einer Tabelle:

Kürzel Beschreibung
CONX compatibility information
MOUPG main upgrade component?
PANTHR ?
SP setup platform
IBSLIB Image-based Setup (Lib?)
MIG migration engine
DISM Deployment Image Servicing and Management
CSI Component Servicing Infrastructure
CBS Component-Based Servicing
DIAG diagnose?
DU Driver/device updates
IBS Image-based Setup
SYSPRP System Preparation
CMI  
DIAGER diagnose error?
SXS side by side?
TOOL  
UI user interface?

Die SetupAct.log kann man an verschiedenen Stellen finden, je nach Phase des Updatevorgangs. Hier die möglichen Verzeichnisse:

Phase Pfad
Down-Level $Windows.~BT\Sources\Panther
OOBE $Windows.~BT\Sources\Panther\UnattendGC
Rollback $Windows.~BT\Sources\Rollback
Pre-initialization (prior to downlevel) Windows
Post-upgrade (after OOBE) Windows\Panther

Für weitere Unternehmungen in Powershell hier die bekannten Komponenten:

$klc="CONX", "MOUPG", "PANTHR", "SP", "IBSLIB", "MIG", "DISM", "CSI", "CBS", "DIAG", "DU", "IBS", "SYSPRP", "CMI",
"DIAGER", "SXS", "TOOL", "UI"

und so kann man feststellen, ob man es mit neuen Komponenten zu tun hat:

Get-Content .\setupact.log | % {If ($_) { If ($_.Substring(0, 1)) {  If ($_.length -gt 48) { If ($_.SubString(19, 1) -eq ",") { $_.Substring(43, 6)}}}} }| sort -Unique | ? {$_.trim() -gt 0} | % {$_.trim()}| % {If (-not ($_ -in $klc)) {$_}}

Nicht schön aber selten ;–)

Problem mit Downloads bei Microsoft?

9 November 2017

Aktuell war es nicht möglich bestimmte Versionen von Windows bei Microsoft herunterzuladen. Es war immer nur ein Kreis mit Loading zu sehen. Ältere Versionen erschienen, aber nicht die gewünschten Windows 10 v1709 Versionen. Dank dieses Beitrags in den MS-Foren funktionierte es dann: https://social.msdn.microsoft.com/Forums/en-US/69db3839-03b7-4d72-854b-b5867c0d5514/only-loading-notice-when-searching-a-product-on-myvisualstudiocomdownloads?forum=msdnfeedback.

Der Trick war die Sprache im Chrome bei den Einstellungen erreichbar unter chrome://settings/languages von Deutsch auf Englisch umzustellen. Danach ein Refresh der betreffenden Seite und auf einmal funktionierte alles.

Was hat es mit FLTMC.EXE auf sich?

8 November 2017

Mit FLTMC.EXE kann man unter Windows Filtertreiber für Dateisysteme managen. Was sind nun Filtertreiber? Filtertreiber sind Kerneltreiber, welche zwischen anderen Treibern eingeschoben werden können, um bestimmte zusätzliche Funktionen realisieren zu können. Als da wären der Virenscanner, Dateikontingente usw.

Ruft man bei einem Windows 10 (v1703) FLTMC.EXE auf so erhält man z. B. als Ausgabe:

Filtername       Anzahl von Instanzen    Höhe    Frame
—————  ——————–    —-    —–
WdFilter                      6       328010         0
storqosflt                    0       244000         0
wcifs                         1       189900         0
FileCrypt                     0       141100         0
luafv                         1       135000         0
npsvctrig                     1        46000         0
Wof                           4        40700         0
FileInfo                      6        40500         0

Damit weiß man schon mal welche Filtertreiber bekannt sind und welche durch laufende Instanzen aktiv sind. Aber welche ist nun für was zuständig?

Um dies rauszufinden hilft ein kleiner Powershell-Aufruf:

fltmc|Out-String -Stream|select -skip 3|% {($_ -split ‚ ‚)[0]}|% {Get-ChildItem "C:\windows\system32\drivers\$_.sys"}| select name, @{n="Description";e={$_.VersionInfo.FileDescription}}

Name           Description
—-           ———–
WdFilter.sys   Microsoft antimalware file system filter driver
storqosflt.sys QoS-Filter für Speicher
wcifs.sys      Windows Container Isolation FS Filter Driver
FileCrypt.sys  Windows sandboxing and encryption filter
luafv.sys      LUA-Filtertreiber zur Dateivirtualisierung
npsvctrig.sys  Named pipe service triggers
Wof.sys        Windows-Überlappungsfilter
FileInfo.sys   FileInfo Filter Driver

Filtertreiber die nicht gestartet sind, tauchen in der Liste nicht auf. So taucht ein weiterer Treiber auf, wenn z. B. die OneDrive-Unterstützung mittels des cldflt-Dienst gestartet wird, indem man Start-Service cldFlt aufruft:

Name           Description
—-           ———–
WdFilter.sys   Microsoft antimalware file system filter driver
storqosflt.sys QoS-Filter für Speicher
wcifs.sys      Windows Container Isolation FS Filter Driver
CldFlt.Sys    Cloud Files Mini Filter Driver
FileCrypt.sys  Windows sandboxing and encryption filter
luafv.sys      LUA-Filtertreiber zur Dateivirtualisierung
npsvctrig.sys  Named pipe service triggers
Wof.sys        Windows-Überlappungsfilter
FileInfo.sys   FileInfo Filter Driver

Ähnlich verhält es sich, wenn man z. B. Kaspersky Interent Security installiert, dann verschwindet auf einmal der WdFilter.sys von Microsoft und es taucht KLIF.sys auf:

Name           Description
—-           ———–
KLIF.sys      Core System Interceptors [fre_win8_x64]
storqosflt.sys QoS-Filter für Speicher
wcifs.sys      Windows Container Isolation FS Filter Driver
CldFlt.Sys    Cloud Files Mini Filter Driver
FileCrypt.sys  Windows sandboxing and encryption filter
luafv.sys      LUA-Filtertreiber zur Dateivirtualisierung
npsvctrig.sys  Named pipe service triggers
Wof.sys        Windows-Überlappungsfilter
FileInfo.sys   FileInfo Filter Driver

Die Treiber hängen alle vom Filtermanager-Dienst ab. Wenn man den zugehörigen Dienst abfragt, findet man noch weitere Infos, vor allem abhängige Treiber die nicht mittels FLTMC.EXE bearbeitet werden können:

(get-service fltmgr).DependentServices|where status -eq running

Name       DisplayName
—-       ———–
vmcompute  Hyper-V-Hostserverdienst
Wof        Windows Overlay File System Filter Driver
FileInfo   File Information FS MiniFilter
WdFilter   Windows Defender Antivirus-Minifiltertreiber
wcifs      Windows Container Isolation
storqosflt QoS-Filter für Speicher – Treiber
luafv      UAC-Dateivirtualisierung
SysMain    Superfetch
FileCrypt  FileCrypt

Man sieht, dass die Namen sich mit den FLTMC-Namen deckt aber die Bezeichnungen der Dienste von den Dateibeschreibungen vereinzelt abweicht.

Detaillierte Infos zu den einzelnen Diensten findet man hier: https://notesfromthedatacenter.wordpress.com/tag/fltmc/

Schaut man sich die Ausgabe von FLTMC.EXE an, dann gibt es noch die Spalte Höhe bzw. Altitude, dahinter verbirgt sich eine Nummer. Dabei sind dies keine willkürlichen Nummern, sondern es gibt gewisse Nummernblöcke. D. h. jeder Treiber ist einem bestimmten Block zugeordnet:

Block Beschreibung
420000 – 429999 Filter
400000 – 409999 FSFilter Top
360000 – 389999 FSFilter Activity Monitor
340000 – 349999 FSFilter Undelete
320000 – 329998 FSFilter Anti-Virus
300000 – 309998 FSFilter Replication
280000 – 289998 FSFilter Continuous Backup
260000 – 269998 FSFilter Content Screener
240000 – 249999 FSFilter Quota Management
220000 – 229999 FSFilter System Recovery
200000 – 209999 FSFilter Cluster File System
180000 – 189999 FSFilter HSM
170000 – 174999 *FSFilter Imaging (ex: .ZIP)
160000 – 169999 FSFilter Compression
140000 – 149999 FSFilter Encryption
130000 – 139999 FSFilter Virtualization
120000 – 129999 FSFilter Physical Quota Management
100000 – 109999 FSFilter Filter Open File
80000 – 89999 FSFilter Security Enhancer
60000 – 69999 FSFilter Copy Protection
40000 – 49999 FSFilter Bottom
20000 – 29999 FSFilter System

Quelle: https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/allocated-altitudes. Welche Bedeutung die jeweiligen Blöcke haben, findet man hier: https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/load-order-groups-and-altitudes-for-minifilter-drivers.

Festplatten Kontingente bzw. Diskquota unter Windows mittels Kommandozeile setzen

28 September 2017

Da ein Server eines Kunden mitten in der Migration steckte war nirgends das passende Menü zu finden um die Speicherplatzkontingente zu setzen. Vom neuen Server war noch nichts zu sehen, obwohl die Benutzer bereits auf dem neuen Server umgezogen waren.

Die Lösung brachte dann die Verwendung der Kommandozeile in Form von FSUTIL.EXE, denn darüber konnte auf dem alten Server problemlos das Kontingent verändert werden.

C:\>fsutil quota
—- QUOTA Unterstützte Befehle —-

disable         Aktiviert Kontingentnachverfolgung und -durchsetzung.
track           Aktiviert Kontingentnachverfolgung.
enforce         Aktiviert Kontingentdurchsetzung.
violations      Zeigt Kontingentüberschreitungen an.
modify          Legt das Datenträgerkontingent für einen Benutzer fest.
query           Fragt Datenträgerkontingente ab.

So kann mittels “fsutil quota modify” das neue Kontingent gesetzt werden.

Feststellen welches Programm das Entfernen eines USB-Gerätes unter Windows verhindert

30 August 2017

Wenn man unter Windows USB Geräte abmeldet bzw. auswirft, kann es passieren, dass man mit dieser schönen Meldung beglückt wird:

—————————
Fehler beim Abdocken von "USB-Massenspeichergerät"
—————————
Das Gerät "USB-Massenspeichergerät" kann aufgrund eines unbekannten Fehlers nicht beendet werden. Entfernen Sie das Gerät nicht, solange es noch verwendet wird. Schließen Sie alle Programme, von denen das Gerät verwendet wird, und entfernen Sie es anschließend.
—————————
OK  
—————————

Unter Windows 7 sieht die Meldung etwas anders aus, ist aber genauso sinnlos:

—————————
Fehler beim Abdocken von "USB-Massenspeichergerät"
—————————
Dieses Gerät wird gerade verwendet. Schließen Sie alle Programme oder Fenster, die möglicherweise das Gerät verwenden, und wiederholen Sie den Vorgang.
—————————
OK  
—————————

Tja, “Unbekannte Fehler” sind des Benutzers liebste Fehler! Selbst heute in Zeiten von Windows 10 hat es Microsoft noch nicht geschafft diese Meldung mit mehr sinnvollen Informationen zu versehen und kommt immer noch so kryptisch wie zu Windows XP-Zeiten daher.

Aber dank Powershell kann der gequälte Anwender sich etwas mehr Informationen beschaffen. Zumindest bei Windows 7 bis Windows 10.

Get-WinEvent -ProviderName Microsoft-Windows-Kernel-PnP -MaxEvents 5 | where {$_.TimeCreated.Date -eq (Get-Date).Date -and $_.id -eq 225} | ft TimeCreated, Message –Wrap

Denn es werden in der Ereignisanzeige in Windows tiefergehende Informationen zum Vorgang gespeichert und damit kann man in der Regel den Grund für obige Fehlermeldung herausfinden. Man muss nur beim Microsoft-Windows-Kernel-PNP Provider nach der EventID 225 suchen.

In diesem Fall bekommt man z. B.:

TimeCreated         Message
———–         ——-
30.08.2017 17:33:47 Die Anwendung \Device\HarddiskVolume4\Windows\System32\cmd.exe mit der Prozess-ID                     21832 hat das Entfernen oder Auswerfen für das Gerät                     USB\VID_1E68&PID_0035\BB00000XXXXXXX beendet.

angezeigt. D. h. cmd.exe, also die Eingabeaufforderung, mit der ProzessID 21832 hatte Zugriff auf den USB-Stick und verhinderte dadurch das Auswerfen.

Konvertieren von virtuellen Festplattenimages in VHD oder VHDX zur Verwendung in Hyper-V oder Azure

25 August 2017

Man bekommt immer wieder Images von anderen virtuellen Maschinen die man in Hyper-V einbinden möchte. Ich hatte hier schon mal auf ein Utility von Microsoft verlinkt: https://newyear2006.wordpress.com/2012/09/04/konvertieren-von-virtuellen-vmware-maschinen-in-virtuelle-hyper-v-maschinen/. Leider klappt der Link nicht mehr. Auf der Suche nach einer Alternative bin ich auf ein Image-Utility von Qemu gestoßen, welches im Prinzip alle gängigen Formate konvertieren kann. Ein weiterer Vorteil ist, dass es als Open Source vorliegt.

Hier die Binary: https://cloudbase.it/qemu-img-windows/ und hier der Source in github: https://github.com/cloudbase/qemu/. Hier gibt es die ausführliche Hilfe: https://qemu.weilnetz.de/doc/qemu-doc.html#qemu_005fimg_005finvocation.

Es werden alle gängigen Formate unterstützt:

Image-Format (schreibbar) qemu-img Parameter
QCOW2 (KVM, Xen) qcow2
QEMU qcow
QED (KVM) qed
raw raw
VDI (VirtualBox) vdi
VHD (Hyper-V) vpc
VMDK (VMware) vmdk
Linux dm-crypt/cryptsetup luks

Neben obigen Formaten, welche gelesen und geschrieben werden können, gibt es noch ein paar, welche nur gelesen werden können:

Image-Format (nur lesbar) qemu-img Parameter
Bochs x86 PC emulator bochs
Linux Compressed Loop image cloop
Apple disk image dmg
Parallels disk image format parallels

Zu jedem Format gibt es noch spezielle Parameter, eine Beschreibung dazu findet man hier: https://qemu.weilnetz.de/doc/qemu-doc.html#disk_005fimages_005fformats.

Zur Anwendung kann man z. B.

qemu-img.exe convert source.img -O vhdx -o subformat=dynamic dest.vhdx

aufrufen.

Man kann auch den Parameter info verwenden um Informationen über ein Image zu erfahren.

C:\>qemu-img info test.img
image: test.img
file format: vhdx
virtual size: 127G (136365211648 bytes)
disk size: 4.0M
cluster_size: 33554432

Aber Vorsicht, man kann sich nicht immer voll auf die Infos verlassen, denn in Fällen wo unsinnige Daten verwendet werden, werden trotzdem Daten ausgegeben:

C:>echo "Nix da" > test.txt
C:>qemu-img info test.txt
image: test.txt
file format: raw
virtual size: 512 (512 bytes)
disk size: 11

Dabei muss der Hinweis auf das Dateiformat RAW nicht immer heißen, dass es kein gültiges Dateisystem ist! Es bedeutet vielmehr, dass qemu-img das Format nicht zuordnen kann.

Obwohl das Tool ziemlich mächtig ist, fehlt noch die Möglichkeit .GHO-Dateien von Symantec Ghost konvertieren zu können. Dazu gibt es über einen Umweg die Möglichkeit mittels Ghost in VMDK-Dateien und dann mittels qemu-img in VHDX zu konvertieren:

ghost64 -clone,mode=restore,src=source.gho,dst=image.vmdk -batch –sure
qemu-img.exe convert image.vmdk -O vhdx -o subformat=dynamic dest.vhdx

Damit wird Source.GHO in Dest.VHDX konvertiert.

Hier sind noch weitere Parameter für die Konvertierung bei Ghost beschrieben: https://www.symantec.com/connect/articles/converting-image-file-format-gho-vmdk-and-vmdk-gho.

Dank qemu-img hat man nun ein mächtiges Tool für Festplattenimages an der Hand.