打算使用Visual Log Parser,過程一波三折。

下載了setup.exe,發現它以ClickOnce方式部署,程式一開啟時就死在疑似沒法建立副案名關聯的Exception上,完全無法使用,我猜跟未升成Admin權限執行有關,程式最後的更新是在2006年,可能當時尚未考量Vista的UAC機制。

TGIOS(Thank God It's Open Source),二話不說,當下決定Download Source回來自己Build,但又馬上卡在MSUtil COM+參照不存在的問題上。爬了文,發現它是顆佛心元件--LogParser.dll,理論上只要regsvr32 logparser.dll問題就能迎刃而解。

於是開了cmd,cd到LogParser.dll所在目錄,regsvr32 logparser.dll,系統彈出

DllRegisterServer in logparser.dll succeeded.

看似就要展開幸福快樂的日子,那知劇情急轉直下! Visual Studio在COM+ Reference清單中怎麼也找不到MS Utility 1.0 Type Library - LogParser Interface collection。

搞了一陣子,才想到剛剛沒有用Admin身份去跑cmd,而我的Windows 2008 R2有開啟UAC(這是一定要的),註冊元件相關Registry肯定要失敗,切成管理者身份執行的cmd再重新註冊,萬事OK!

所以問題來了,顯然非管理者CMD並未成功註冊logparser.dll,但為何又回報註冊成功? 立刻請茶包一哥出來面對驗證一下:

 

其中PID 5324用一般CMD執行,出現一堆ACCESS DENIED,這在預期內;而PID 6804是用管理者身份執行的CMD,寫入Registry動作一切如常。由此看來,問題出在regsvr32在未能寫入Registry時,還是粉飾太平地回報註冊完成,耽誤了我寶貴的青春。(更新: 其實是寫入User專屬的虛擬Registry中,因Visual Studio未使用同一身份執行,故看不到,此為Vista以後OS新增的特性)

進一步測試Windows 2008 R2 x64/Windows 7 x86,都發現regsvr32未啟用管理者權限,註冊失敗卻回報正常的狀態,故傾向判定此為regsvr32的Bug,但樣本數尚少,暫不下定論。有相關資料的朋友,歡迎回饋給我。

[更新2010-04-28]經小朱指點,這是Registry Virtualization的機制使然,regsvr32將資料寫到虛擬Registry區,之前只知其然,這次算有了深刻體驗!


Comments

# by 安東尼

我的LyfUPload.dll也不能在win2008/r2內run ~~可以幫忙嗎

Post a comment