|
有些時候想用免安裝軟體的便利,但有時免安裝版的某些功能仍需要登錄碼才會有作用
以7-zip這套軟體為例(只是舉例,這軟體本身還是會動到登錄碼)
免安裝版的沒有快捷選單(pop-up menu),這在使用上有點不便
可以從7-zip的.msi安裝檔中抓出其中的系統登錄碼,設法匯入這些登錄碼,就可讓快捷選單出現
當然以此例而言也能用像FileMenuTools做出類似的選單
也可利用RegScanner,在安裝完7-zip後,找出所有關於7-zip的登錄碼。(這時找到的就不只是安裝程式所寫入的登錄碼而已)
但這裡主要討論「從.msi檔抓出其中的系統登錄碼」這話題
同樣以7-zip.msi為例
UniExtract可解.msi,取出其中的檔案
而要找出.msi檔中的系統登錄碼,可利用.msi編輯軟體
這類軟體有不少
這裡僅提供兩套可免費使用的軟體
一是InstEdit,安裝檔約4.5 mb
另一是Advanced Installer,安裝檔約52 mb
相對於其它同類型的商業軟體,小巧很多,當然功能也可能少了許多
以下就以InstEdit為範例,將7-zip官網上目前供下載的安裝檔7z920-x64.msi,找出其中的登錄碼
軟體的安裝過程就略過不提
安裝好InstEdit後,開啟7z920-x64.msi
參照圖解,移到Registry這個表格,可以發現有11條登錄碼,這是在安裝時會寫入的
請看一下Root那一欄,它是用代碼表示。將滑鼠移過去,可發現1是代表HKEY_CURRENT_USER
順便把另兩個代碼一併列出
0: HKEY_CLASS_ROOT
2: HKEY_LOCAL_MACHINE
Value欄中的那個[INSTALLDIR]就是指軟體的安裝所在
圖中較有用的欄位是Root, Key, Name, Value
知道了這11條登錄碼,只要設法將這11條的東西寫入系統登碼,就可生效(假設已用了免安裝版的7-zip)
方法有幾種,如:
- 自行用regedit.exe逐條編輯。但下回同樣工作,還是得再人工作業一次,太累人了
- 將其編輯成一個.reg檔,存檔後雙擊可將其匯入。那個[INSTALLDIR]也要視實際情形修改
- 利用reg.exe的方式寫入登錄
- 將Registry表格匯出存成一.idt的純文字檔。
接著以InstEdit新增一個Package(即新增一個.msi檔),將該.idt匯入,
並做適當的修改,使這個.msi變成一個專門設置登錄碼的安裝檔。這點自己沒實際做過,但應該是可行的 - 類似前一作法,不過是改用其它種安裝程式製作軟體,如InnoSetup或NSIS,編寫安裝腳本,做成專門設置登錄碼的安裝檔
這裡採用最後一個方法,以InnoSetup為例
InnoSetup有個Third Party(第三方,小三??? )工具叫Inno Script Studio,方便以圖形界面編寫腳本,如下圖
為何圖中是12條?因為新增的那一條是為了方便移除(反安裝)軟體時,可把安裝時寫入的的登錄檔也移除乾淨。(但事實上7-zip程式本身還是會寫入其它的登錄值,所以即使這裡的11條移除乾淨,還是會殘留其它的值)
完整的腳本像這樣- [Setup]
- DefaultDirName={pf}7-Zip
- AppName=7-Zip
- AppVersion= 9.20
- ShowLanguageDialog=no
- DisableProgramGroupPage=yes
- ArchitecturesInstallIn64BitMode=x64
- AllowUNCPath=false
- OutputBaseFilename=7z920-x64_reg
- DisableWelcomePage=true
- UsePreviousGroup=false
- EnableDirDoesntExistWarning=True
- DirExistsWarning=no
- [Registry]
- Root: "HKLM"; Subkey: "Software7-Zip"; ValueType: string; ValueName: "Path"; ValueData: "{app}"; Flags: uninsdeletekey
- Root: "HKLM"; Subkey: "SoftwareMicrosoftWindowsCurrentVersionApp Paths7zFM.exe"; ValueType: string; ValueData: "{app}7zFM.exe"; Flags: uninsdeletekey
- Root: "HKLM"; Subkey: "SoftwareMicrosoftWindowsCurrentVersionApp Paths7zFM.exe"; ValueType: string; ValueName: "Path"; ValueData: "{app}"
- Root: "HKLM"; Subkey: "SoftwareMicrosoftWindowsCurrentVersionShell ExtensionsApproved"; ValueType: string; ValueName: "{{23170F69-40C1-278A-1000-000100020000}"; ValueData: "7-Zip Shell Extension"; Flags: uninsdeletevalue
- Root: "HKCR"; Subkey: "*shellexContextMenuHandlers7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
- Root: "HKCR"; Subkey: "CLSID{{23170F69-40C1-278A-1000-000100020000}"; ValueType: none; Flags: uninsdeletekey
- Root: "HKCR"; Subkey: "CLSID{{23170F69-40C1-278A-1000-000100020000}InprocServer32"; ValueType: string; ValueData: "{app}7-zip.dll"
- Root: "HKCR"; Subkey: "CLSID{{23170F69-40C1-278A-1000-000100020000}InprocServer32"; ValueType: string; ValueName: "ThreadingModel"; ValueData: "Apartment"
- Root: "HKCR"; Subkey: "DirectoryshellexDragDropHandlers7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
- Root: "HKCR"; Subkey: "DirectoryshellexContextMenuHandlers7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
- Root: "HKCR"; Subkey: "DriveshellexDragDropHandlers7-Zip"; ValueType: string; ValueData: "{{23170F69-40C1-278A-1000-000100020000}"; Flags: uninsdeletekey
- Root: "HKCU"; Subkey: "Software7-Zip"; ValueType: string; ValueName: "Path"; ValueData: "{app}"; Flags: uninsdeletekey
複製代碼 此腳本是有包含移除功能的,若不需要,在[Setup]後面加上這行即可把做好的腳本編譯成執行檔
執行時選好7-zip的所在位置,假設是在D:7-zip
此例中的那個7-zip字串自動加上,所以選到D:的位置即可
本例的腳本與安裝檔下載
相關參考 |
本帖子中包含更多資源
您需要 登入 才可以下載或查看,沒有帳號?註冊
x
-
|