離線編輯 Windows 登錄機碼
日前 DR 處理公司一部仍在使用 Windows XP 的電腦,但卻在操作登錄編輯程式(regedit)時,不慎誤刪了一個項目,如下:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4d36e96b-e325-11ce-bfc1-08002be10318}\UpperFilters。結果重開機後便造成鍵盤在 Windows 裡完全沒反應,改插其它鍵盤也是一樣。
事實上不只是舊版 Windows 會這樣,後來 DR 也在 Windows 10 上測試過,若刪除該機碼也會有相同的結果。然而只是誤刪一個機碼,鍵盤就完全不能用,毫無自動復原的機制……如此這般設計會不會太誇張了一點?
雖然這項失誤並不影響滑鼠功能,但偏偏那部電腦是設定成透過網域帳戶登入的,在無法使用鍵盤輸入密碼的情況下,就無法進入桌面嘗試做出任何修正。因此這番處境便讓 DR 想起 Offline Windows Password & Registry Editor 這款工具,因為它就如字面上所示,其實並不僅僅是 Windows 的密碼清除工具,還是個登錄機碼編輯器,只是 DR 過去未曾使用過它的登錄機碼編輯功能。
於是 DR 便花了點時間摸索一下,試圖重建誤刪的 UpperFilters,並填回正確的內容(kbdclass),而以下就是操作步驟的記錄。
在以 ntpasswd 工具完成開機後,分割區選擇的部份如常,通常按預設值按下 Enter 即可。然而在選取登錄區載入的部份,不同於日常清除密碼的需求,這裡要選擇選項 3(Load almost all of it, for regedit tec [system software sam security]),而非預設的 1(附圖 1)。
接著在完成登錄檔載入後,選擇選項 9(Registry editor, now with full write support!),隨即便會進入一個非常原始的命令行操作介面(附圖 2),用於進行登錄機碼瀏覽及編輯的動作。輸入問號(?)可以取得可用的指令清單。
不過在開始執行登錄機碼的編輯前,需要先對登錄區(registry hives)的概念有一點瞭解。先前的選項已將 system、software、sam 及 security 這四個登錄區一併載入,而它們分別代表著登錄機碼的下列路徑:
system | HKEY_LOCAL_MACHINE\System |
software | HKEY_LOCAL_MACHINE\Software |
sam | HKEY_LOCAL_MACHINE\SAM |
security | HKEY_LOCAL_MACHINE\Security |
由於編輯器預設會選取 system 作為欲編輯的登錄區,因此命令行介面的根目錄即是 HKEY_LOCAL_MACHINE\System,而這剛好吻合我們的工作需求。如果想要確認當前的登錄區為何,可以輸入 hive 指令,後面若接著數字編號則可以進行切換。
之所以說這個命令行介面非常原始,是因為它並未支援 Tab 補全、也無法使用方向鍵。不過幸好在面對又臭又長的登錄機碼路徑時,它至少容許輸入少量的開頭文字,就能夠自動切換到符合的路徑。因此,當我們要前往 ControlSet001\Control\Class\{4d36e96b-e325-11ce-bfc1-08002be10318} 路徑時(ControlSet001 即等同於進入 Windows 後會看到的 CurrentControlSet),只需要接連輸入下列指令(附圖 3):
- cd Control
- cd Control
- cd Class
- cd {4D36E96B
大小寫是有差別的,所以輸入時請以 dir 指令所列出的路徑名稱為準。然後便是新增項目:
- nv 7 UpperFilters
中間數字指的是機碼的儲存類型,數字 7 是指 REG_MULTI_SZ,可以單純輸入 nv 取得完整的對應清單。
在新增 UpperFilters 後,緊接著修改它的內容:
- ed UpperFilters
由於這個修改功能在外觀上可能不是很容易理解,因此以下會特別標示按下 Enter 的時機,總共需要輸入兩個字串及兩次 Enter:
- kbdclass [Enter]
- --n [Enter]
第二次 Enter 後便會跳出修改功能(附圖 4),這時若輸入「cat UpperFilters」則可以檢視該項目的內容。之後就可以輸入 q 跳出,然後記得在詢問是否寫入檔案(About to write file(s) back! Do it?)時輸入 y 確認(附圖 5)。如此一來,Windows 的鍵盤功能就恢復原狀了。