詭異案例系列: 無(wú)法啟動(dòng)的系統(tǒng)服務(wù)
上周二,我接到了一個(gè)很詭異的案例,表現(xiàn)為任務(wù)欄右下角網(wǎng)絡(luò)連接圖標(biāo)始終為一個(gè)紅叉,已排除網(wǎng)卡硬件、鏈路和網(wǎng)卡驅(qū)動(dòng)的問(wèn)題。主板都新?lián)Q了一塊,可是問(wèn)題依舊,這無(wú)疑將問(wèn)題的根源指向了操作系統(tǒng)。本想通過(guò)網(wǎng)絡(luò)疑難解答包先自動(dòng)排錯(cuò),可是發(fā)現(xiàn)該疑難解答提示服務(wù)未能啟動(dòng)因此不能進(jìn)行自動(dòng)排錯(cuò),經(jīng)查證,Diagnostic Policy Service 服務(wù)處于起不來(lái)的狀態(tài),報(bào)錯(cuò)"錯(cuò)誤5:拒絕訪問(wèn)"。
經(jīng)過(guò)我的排查,我發(fā)現(xiàn)系統(tǒng)的很多服務(wù)都未能啟動(dòng),尤其是網(wǎng)絡(luò)相關(guān)的很多服務(wù),例如DHCP,防火墻,ICS,IPSec Policy Agent 等等。當(dāng)我手動(dòng)嘗試啟動(dòng)這些服務(wù)時(shí),除了有些報(bào)相關(guān)服務(wù)尚未啟動(dòng)之外,無(wú)一例外地,都報(bào)了一個(gè)錯(cuò)誤——錯(cuò)誤5:拒絕訪問(wèn)。(需要先啟動(dòng)的相關(guān)服務(wù)都是該錯(cuò)誤)

查看系統(tǒng)日志,將里面的更詳細(xì)的錯(cuò)誤代碼拿去微軟搜索,發(fā)現(xiàn)沒(méi)有什么收獲。在一些社區(qū)解決方案中,也沒(méi)能找到行之有效的解決辦法,甚至微軟官方論壇有一個(gè)同樣的案例,一個(gè)錯(cuò)誤的/不太相關(guān)的解答被標(biāo)記為正解……
這顯然不是正解,我得找到一個(gè)解決該問(wèn)題的辦法。于是經(jīng)過(guò)各種嘗試,我最后通過(guò) Process Monitor 的幫助,找到了服務(wù)無(wú)法啟動(dòng)的直接原因和解決辦法。由于當(dāng)時(shí)沒(méi)有截圖,所以今天我還原了一個(gè)當(dāng)時(shí)的情景,以 Base Filtering Engine 服務(wù)的無(wú)法啟動(dòng)為例,闡述當(dāng)時(shí)我的解決思路。Base Filtering Engine 服務(wù)簡(jiǎn)稱 BFE,相關(guān)的網(wǎng)絡(luò)安全服務(wù)(如 Windows 防火墻和 IPSec)依賴于它。
在打開(kāi) Process Monitor 的記錄以后,我立即點(diǎn)擊啟動(dòng)服務(wù),來(lái)嘗試啟動(dòng) BFE。它立即報(bào)錯(cuò)"拒絕訪問(wèn)",我同時(shí)也嘗試啟動(dòng)了那些不能啟動(dòng)的服務(wù),都成功地重現(xiàn)了問(wèn)題。停止 ProcMon 的記錄后,在已記錄下的log中,我可以看見(jiàn)當(dāng)該問(wèn)題重現(xiàn)時(shí)系統(tǒng)各進(jìn)程所做的一些操作。通過(guò)粗略的快速瀏覽翻查和關(guān)鍵字"denied"搜索,引起我注意的是,很多注冊(cè)表的訪問(wèn)遇到了 access denied 的錯(cuò)誤。而在文件訪問(wèn)中,尚未發(fā)現(xiàn)該錯(cuò)誤。為了精細(xì)地驗(yàn)證,我對(duì)當(dāng)前記錄下的log進(jìn)行了篩選器的應(yīng)用。
|
篩選條件 |
處理方式 |
|
Process Name = svchost.exe |
包含 |
|
Result = ACCESS DENIED |
排除 |


應(yīng)用篩選后,我們可以看見(jiàn)所有相關(guān)的 Access Denied 的條目。當(dāng)時(shí)真實(shí)環(huán)境里的可以看見(jiàn)很多這樣的條目,因?yàn)楹芏喾?wù)都出現(xiàn)了無(wú)法啟動(dòng)的故障,而撰寫本文時(shí)的實(shí)驗(yàn)環(huán)境里,我只制造了 BFE 這一種服務(wù)的該問(wèn)題。通過(guò) Path 列,我們可以看見(jiàn)其具體的路徑為 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE\Parameters\Policy\Persistent . 右擊該條目,選擇 Jump To… ,注冊(cè)表編輯器便會(huì)被調(diào)用打開(kāi)打開(kāi),并且自動(dòng)定位到該鍵。我查看其權(quán)限設(shè)置,發(fā)現(xiàn)所有條目繼承于 Policy 鍵。

那我們就來(lái)看看該處的 Policy 鍵上的權(quán)限設(shè)置,與正常的計(jì)算機(jī)的同一位置的權(quán)限設(shè)置有何不同。
|
|
|
|
當(dāng)前 Policy 鍵上的權(quán)限 |
正常 Policy 鍵上的權(quán)限 |
不難發(fā)現(xiàn),服務(wù)不能啟動(dòng)(尤其是提示拒絕訪問(wèn))的直接原因是因?yàn)椋摲?wù)無(wú)權(quán)訪問(wèn)注冊(cè)表的這個(gè)鍵。(通過(guò) Process Monitor 可以看出,它實(shí)際上要訪問(wèn)的是 Policy 的子鍵"Persistent"卻遭到拒絕)
要嘗試恢復(fù),那我們要做的就是至少在 Persistent 鍵及其子鍵/鍵值上授予 BFE 合適的訪問(wèn)權(quán)限。為了一步到位,我做的是參照正常的系統(tǒng),將正常的 ACE 項(xiàng)在權(quán)限傳播的起始處——Policy 鍵上設(shè)置,并往下傳播。設(shè)置時(shí),除了還原應(yīng)有的 BFE 的權(quán)限,還完全一致地將其他缺失權(quán)限補(bǔ)齊,將多余權(quán)限刪除,這樣可以避免一些額外的潛在問(wèn)題。(例如權(quán)限仍過(guò)小或者過(guò)大)
值得注意的是,BFE 這個(gè)服務(wù)賬號(hào)不同于一般用戶賬號(hào)和組,所以直接鍵入 BFE 時(shí)間查不到名稱的。正確的做法是鍵入"NT Service\BFE"檢查名稱。

而默認(rèn)地,BFE 在 BFE 服務(wù)的注冊(cè)表項(xiàng)上的訪問(wèn)權(quán)限是特殊的。雖然我們可以直接授予完全控制權(quán)限來(lái)解決該問(wèn)題,但是我們最好還是參照 LUA 原則,跟系統(tǒng)默認(rèn)的一樣,將其設(shè)為特殊權(quán)限。特殊權(quán)限的具體項(xiàng)目如下圖所示:

好了,設(shè)置好并且應(yīng)用權(quán)限之后,再次點(diǎn)擊啟動(dòng)服務(wù)按鈕,就可以看到該服務(wù)正常啟動(dòng)了。
最后,對(duì)于該詭異案例,有幾個(gè)說(shuō)明:
1. 究竟是什么操作導(dǎo)致了系統(tǒng)出現(xiàn)這樣的問(wèn)題,讓諸多系統(tǒng)服務(wù)注冊(cè)表鍵權(quán)限變成非默認(rèn)值,至今尚不明確。據(jù)用戶稱,他就是出了個(gè)差,回來(lái)后就這樣了,其間沒(méi)有裝過(guò)什么軟件或者手動(dòng)做過(guò)這種設(shè)置注冊(cè)表權(quán)限的危險(xiǎn)操作。搜索互聯(lián)網(wǎng),很多人都有遇到此問(wèn)題的經(jīng)歷,但是沒(méi)有哪個(gè)帖子能夠明確指出是什么操作引起了這個(gè)問(wèn)題。如果您恰好有過(guò)此方面的研究,歡迎告訴我。
2. 事實(shí)上,該用戶最后重裝系統(tǒng)了,這也是我建議他做的。因?yàn)椋搯?wèn)題的發(fā)生,可能還伴有其他的一些未知的系統(tǒng)嚴(yán)重性更改,修復(fù)了注冊(cè)表權(quán)限,并且讓服務(wù)啟動(dòng)后,不能確保他在該系統(tǒng)上,今后不會(huì)遇到其他的怪異問(wèn)題。
3. 就像我遇到的這個(gè)真實(shí)案例一樣,該錯(cuò)誤一旦發(fā)生,往往會(huì)伴有很多系統(tǒng)服務(wù)遇到此拒絕訪問(wèn)的啟動(dòng)問(wèn)題。如果要應(yīng)用此方法全面修復(fù),那是非常耗費(fèi)時(shí)間和精力的。這里給出一個(gè)能盡量加速解決此問(wèn)題的思路:
|
步驟 |
思路 |
優(yōu)化的實(shí)現(xiàn)方法 |
備注 |
|
1 |
跟同一環(huán)境下的另一臺(tái)健康計(jì)算機(jī)(公司加域情況、網(wǎng)絡(luò)情況一致)做服務(wù)啟動(dòng)狀態(tài)比較,定位出本機(jī)不正常的服務(wù) |
用 PowerShell 執(zhí)行 Get-Service,兩份結(jié)果用 Excel 做比較 |
這步可以用查看系統(tǒng)服務(wù)日志找出未能啟動(dòng)的服務(wù)來(lái)替代(看從上次啟動(dòng)以后記錄到的日志) |
|
2 |
發(fā)現(xiàn)這些未能啟動(dòng)的服務(wù)背后相關(guān)聯(lián)的權(quán)限不正常的注冊(cè)表鍵 |
使用 Process Monitor 監(jiān)控 Access Denied 的項(xiàng)目,注意合理應(yīng)用篩選條件可以得到?jīng)]有干擾的直接結(jié)果。得到結(jié)果后,將Path 欄的唯一值(注冊(cè)表路徑)整理成一份列表 |
|
|
3 |
獲取正常系統(tǒng)上這些注冊(cè)表位置的默認(rèn)權(quán)限 |
通過(guò) PowerShell 編寫腳本,去 query 正常系統(tǒng)上這些對(duì)應(yīng)的注冊(cè)表鍵值的權(quán)限設(shè)置,并保存每一項(xiàng)對(duì)應(yīng)的權(quán)限 |
|
|
4 |
將默認(rèn)權(quán)限應(yīng)用到問(wèn)題計(jì)算機(jī) |
通過(guò) PowerShell 腳本,將上一步獲取到的權(quán)限批量應(yīng)用到問(wèn)題計(jì)算機(jī)本地,實(shí)現(xiàn)定點(diǎn)修復(fù)。完畢后重啟計(jì)算機(jī),相關(guān)服務(wù)自然隨著預(yù)設(shè)的"自動(dòng)啟動(dòng)"類型重新啟動(dòng) |
話說(shuō)當(dāng)年 NT 5.0 時(shí)代,可以通過(guò)系統(tǒng)自帶的 secedit 命令重置所有安全設(shè)置和權(quán)限,但是現(xiàn)在已然不行了。鑒于目前尚未發(fā)現(xiàn)任何 fix 程序能夠自動(dòng)重置系統(tǒng)服務(wù)的默認(rèn)注冊(cè)表權(quán)限的,只能用以上4步進(jìn)行修復(fù)。如果您所遇到的情形中只有一兩項(xiàng)服務(wù)有此問(wèn)題,那么完全可以不采用腳本的方式,而是采用 GUI 的工具去看服務(wù)以及手動(dòng)修復(fù)權(quán)限設(shè)置。等我今后有空的話,會(huì)寫一個(gè)重置系統(tǒng)自帶服務(wù)對(duì)應(yīng)的注冊(cè)表權(quán)限的腳本。(貌似意義不太大)若您有高見(jiàn),請(qǐng)不吝賜教。
佘華煜 (Eric Sheh),微軟 MVP,致力于為微軟 Windows 和 Office 用戶及 IT 專業(yè)人士提供更好的幫助與支持。 關(guān)注我的 新浪微博,加入 我要做電腦達(dá)人 微群,收聽(tīng)每日 Office 效率提升秘籍~



浙公網(wǎng)安備 33010602011771號(hào)