2016-07-11 10 views
0

AppData \ Local \ Microsoft \ Windows \ WebCache \에 저장된 IE 10/11 인터넷 기록을 읽는 데 powershell 스크립트를 만들려고합니다. WebCache.dat.ESENT Internet Explorer 10/11 WebCache.dat를 여는 중 항상 EsentPageSizeMismatchException이 throw됩니다.

.NET에서 Win32 Jet API와의 인터페이스를 위해 Managed Esent +를 사용하고 있습니다.

제 문제는 JetAttachDatabase를 호출 할 때 EsentPageSizeMismatchException이 발생하므로 실제로 데이터베이스를 열 수 없다는 것입니다. 이 오류에 대한 조사를 한 후에 IE WebCache의 페이지 크기는 32K입니다. 이 문제를 해결하기 위해 DatabasePageSize 시스템 매개 변수를 0x8000으로 설정하면 JetInit에서 같은 예외가 발생하기 시작했습니다. 여기

내가

#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 
) 
... 

그것은 기본이 아닌 페이지 크기를 갖는 좋아하지 않는 ESENT 엔진처럼 보이는이 코드입니다,하지만 난 인터넷을 샅샅이 한과를 할 수없는 것 엔진 페이지 크기를 변경하는 방법. 이 오류의 원인은 무엇입니까?

답변

0

한 가지 경우에는 예외로 인해 실패한 JetAttachDatabase이고 다른 하나는 JetInit입니다.

실제로 DatabasePageSize를 설정해야합니다. JetInit은 실제로 가난한 이름입니다. JetInitAndReplayLogFiles과 같은 이름이어야합니다. 로그 디렉토리 (기본값 : ".")에있는 트랜잭션 로그 파일 (edb * .log의 기본 이름)을보고 트랜잭션 로그 파일에서 작업을 재생합니다.

이제는 다른 페이지 크기로 생성 된 다른 트랜잭션 로그 파일을 선택하고있을 것입니다. 이론 : 처음 시도 할 때 의도하지 않게 만든 파일 edb*.log을 가져 왔습니다.

일부 잠재적 인 솔루션 : 먼저 로그 파일이 들어있는 디렉토리에

-cd.

- LogFileDirectory를 변경하십시오 (JetSetSystemParameterJET_param.LogFilePath 또는 래퍼 클래스 InstanceParameters.LogFileDirectory을 사용할 수 있습니다). 오, 당신은 또한 InstanceParameters.BaseName을 "v01"로 설정해야합니다. webcache01.dat 파일이 사용하는 것입니다 ("edb.log"와 "v01.log"의 관계에 영향을줍니다).

- 데이터베이스를 '완전 종료'상태로 가져오고 InstanceParameters.Recoveryfalse으로 설정하여 우연히 새 트랜잭션 로그 파일을 만들지 않도록하십시오. 그리고 이미 당신이 AttacheDatabaseGrbit.ReadOnly으로 붙어있는 것을 봅니다.

마지막으로, 나는 이것이 호기심을위한 것이라고 생각합니다. inetcache에서 작업 한 사람들은 언제든지 구현 세부 사항을 변경할 수 있습니다. 법의학적인 목적을 위해 Microsoft는 법 집행 기관의 법의학 조치를 지원합니다.

0

당신은 JetGetDatabaseFileInfo를 사용한다 - 마틴

() 필요한 페이지 크기가 SetSetSystemParameter와 함께 사용할 얻기 위해() 여기

는 C#의 예입니다 (헤이 ... 맞아, 충분히 가까이?)

 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

내 경우에는 수동으로 bin/Debug 폴더로 이동하여 다시 디버깅하기 전에 데이터베이스를 전환 할 때마다 내용을 수동으로 삭제해야했습니다. 이 문제에 직면 해있는 사람에게 도움이되기를 바랍니다.