2016-07-11 11 views
0

Ich versuche, ein Powershell-Skript zu erstellen, um den IE 10/11 Internetverlauf zu lesen, der in AppData \ Local \ Microsoft \ Windows \ WebCache \ gespeichert wird. WebCache.dat.ESENT löst beim Versuch, IE 10/11 WebCache.dat zu öffnen, immer eine EsentPageSizeMismatchException aus

Ich verwende Managed Esent + - Schnittstelle mit dem Win32 Jet API in .NET.

Mein Problem ist, dass ich die Datenbank nie wirklich öffnen kann, da EsentPageSizeMismatchException ausgelöst wird, wenn ich JetAttachDatabase aufrufen. Nach einigen Nachforschungen zu diesem Fehler habe ich festgestellt, dass der IE WebCache eine Seitengröße von 32 KB hat. Als ich versuchte, dies zu korrigieren, startete JetInit die gleiche Ausnahme, indem ich den Systemparameter DatabasePageSize auf 0x8000 einstellte. Hier

ist der Code Ich habe

#stop the things locking the database 
stop-process -name taskhost 
stop-process -name dllhost 
#give powershell access to the interop dlls 
add-type -path "$PSScriptRoot\ManagedEsent 1.6\Esent.Interop.dll" 
$instance = [Microsoft.Isam.Esent.Interop.JET_INSTANCE]::Nil 
#set page size 
[Microsoft.Isam.Esent.Interop.api]::JetSetSystemParameter(
    $instance, 
    [Microsoft.Isam.Esent.Interop.JET_SESID]::Nil, 
    [Microsoft.Isam.Esent.Interop.JET_param]::DatabasePageSize, 
    0x8000, 
    $null 
) 
[Microsoft.Isam.Esent.Interop.Api]::JetCreateInstance([ref]$instance,"testing") 
# init the instance, throws EsentPageSizeMismatchException if the page size is not default 
[Microsoft.Isam.Esent.Interop.Api]::JetInit([ref]$instance) 
$sesid = [Microsoft.Isam.Esent.Interop.JET_SESID]::Nil 
[Microsoft.Isam.Esent.Interop.Api]::JetBeginSession($instance,[ref]$sesid,$null,$null) 
# throws EsentPageSizeMismatchException if page size is default 
[Microsoft.Isam.Esent.Interop.api]::JetAttachDatabase(
    $sesid, 
    "C:\Users\Administrator\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat", 
    [Microsoft.Isam.Esent.Interop.AttachDatabaseGrbit]::ReadOnly 
) 
... 

Es scheint, wie der ESENT Motor nicht wie die Nicht-Standard-Seitengröße, aber ich habe das Internet durchforstet und es scheint nicht zu sein Möglichkeit, die Seitengröße der Engine zu ändern. Was verursacht diesen Fehler?

Antwort

0

Wenn Sie bemerken, ist es in einem Fall JetAttachDatabase, die mit der Ausnahme und in der anderen fehlschlägt.

Sie sind tatsächlich richtig, dass Sie DatabasePageSize festlegen müssen. ist eigentlich ein armer Name. Es sollte so etwas wie JetInitAndReplayLogFiles heißen. Es schaut sich die Transaktionsprotokolldateien (Standardname von edb * .log) im Protokollverzeichnis an (Standard: ".") Und spielt die Vorgänge in den Transaktionsprotokolldateien erneut ab.

Wahrscheinlich werden jetzt andere Transaktionsprotokolldateien mit einer anderen Seitengröße abgerufen. Theorie: Sie nehmen die edb*.log Dateien auf, die Sie unbeabsichtigt bei Ihrem ersten Versuch erstellt haben.

Einige mögliche Lösungen:

-CD in das Verzeichnis, das zuerst die Protokolldateien enthält.

- Ändern Sie das LogFileDirectory (Sie können entweder JetSetSystemParameter mit JET_param.LogFilePath oder die Wrapper-Klasse InstanceParameters.LogFileDirectory verwenden). Oh, du musst auch InstanceParameters.BaseName auf "v01" setzen, da das die Datei webcache01.dat zu benutzen scheint (Betrifft die Namen von "edb.log" versus "v01.log").

-Verwenden Sie esentutl.exe -r v01, um die Datenbank in den Status 'sauberes Herunterfahren' zu versetzen, und setzen Sie InstanceParameters.Recovery auf false, um das versehentliche Erstellen neuer Transaktionsprotokolldateien zu vermeiden. Und ich sehe, dass Sie bereits mit AttacheDatabaseGrbit.ReadOnly anfügen.

Endlich hoffe ich, dass dies nur aus Neugier ist. Die Personen, die am inetcache gearbeitet haben, können die Implementierungsdetails jederzeit ändern. Wenn es für forensische Zwecke verwendet wird, unterstützt Microsoft forensische Bemühungen der Strafverfolgungsbehörden.

-martin

0

Sie sollten JetGetDatabaseFileInfo() verwenden, die erforderliche Seitengröße mit SetSetSystemParameter verwenden, um get()

Hier ein Beispiel in C# ist (hey ... das ist nah genug, nicht wahr?)

 int pageSize; 
     JET_INSTANCE instance; 
     JET_SESID sesId; 

     // match the Page size 
     Api.JetGetDatabaseFileInfo(databasePath, out pageSize, JET_DbInfo.PageSize); 
     Api.JetSetSystemParameter(JET_INSTANCE.Nil, JET_SESID.Nil, JET_param.DatabasePageSize, pageSize, null); 
0

Für meinen Fall musste ich manuell in den bin/Debug-Ordner gehen und den Inhalt jedes Mal manuell löschen, wenn ich die Datenbanken wechselte, bevor ich sie erneut debuggte. Ich hoffe, das hilft jemandem, der sich mit diesem Problem konfrontiert sieht.