2013-03-10 104 views
0

說明刪除頑固的註冊表項

一名司機留在註冊表中(甚至當我卸載它從系統中)一個爛攤子。如果我檢查安全設置,它將不會在「組或用戶名」中顯示任何內容。當我查看所有者時,它只顯示「無法顯示當前所有者」。當我想要刪除註冊表項時,我必須:

  1. 取得所有權。

  2. 添加組。

  3. 刪除密鑰。

問題是每個註冊表都有幾個子密鑰,我必須在每個密鑰上重複該過程。繼承權限選項在註冊表編輯器中不起作用。是的,我以管理員模式運行註冊表編輯器。

問題

我想寫一個簡單的C#代碼,將循環,並刪除所有密鑰。我發現了一些代碼示例,但在我的情況下,任何OpenSubKey調用都會失敗,並顯示錯誤: System.Security.SecurityException:不允許請求的註冊表訪問。 如果任何OpenSubKey函數調用失敗,我如何更改所有權?有沒有其他命令可以聲明所有權,然後刪除註冊表項?

謝謝大家的支持

+1

您必須以管理員身份運行您的應用程序。看到這個問題:http://stackoverflow.com/questions/2818179/how-to-force-my-net-app-to-run-as-administrator-on-windows-7 – 2013-03-10 11:09:54

+1

你已經找到了一個很好的理由**不**寫一個程序來做到這一點。這並不是說你不能使它工作,而是調試它是如此危險。發生在我們最好的人身上,像[Paul DiLascia](http://www.microsoft.com/msj/1299/comtoys/comtoys.aspx),滾動到「來自地獄的可怕軼事」。 – 2013-03-10 12:08:32

回答

2

正如你知道運行註冊表編輯器作爲管理員,以確保你有適當的權限來修改/刪除註冊表項,你需要做同樣的事情爲您的C#應用​​程序。

因爲你忘了這麼做,所以System.Security.SecurityException被拋出提醒。如異常消息所述,您沒有修改/刪除註冊表項的權限。

要解決此問題,您必須使用管理權限執行您的C#應用​​程序。您可以手動執行此操作,或者將add a manifest添加到您的應用程序中,以使其自動要求管理權限。

0

這是一半的答案。

這個knowledge base article解釋瞭如何取得您無權訪問的密鑰的所有權。

總之,您需要啓用「獲取所有權」權限並使用WRITE_OWNER訪問權限打開密鑰。然後您可以設置所有者。

請注意,這隻適用於以管理員身份運行代碼的情況。

但是,我不知道您是否可以使用內置函數在C#中執行此操作,或者您是否需要使用interop來調用本機API。如果是後者,使用C/C++可能會更快。可以使用SubInAcl工具。它可以獲取文件,註冊表項等的所有權。

+0

這不到答案的一半。正如您在開始時鏈接註釋的知識庫文章所述,除非您擁有訪問權限,否則無法獲得密鑰的句柄。如果沒有處理,你就無法取得所有權。所以你仍然無處可去。如果您可以在沒有第一次訪問權限的情況下獲得所有權,那將會是一個巨大的安全漏洞。 – 2013-03-10 11:38:50

+0

什麼?文章說,你通常無法獲得句柄,然後繼續說「這個問題的解決方案是......」。管理員可以**總是取得所有權,即使他們沒有權限。這是Windows安全模型的核心。知識庫文章介紹瞭如何做到這一點。再讀一遍。 – arx 2013-03-10 11:41:08

+1

同意成爲管理員。這是管理員權限的重點。問題是他沒有使用管理權限運行應用程序。 – 2013-03-10 11:42:07

0

要清楚你右擊,當你談論在管理員模式下運行它以管理員身份運行 - 這是提升的權限,它不會簡單地雙擊發生。即使您以管理員身份登錄,您也必須右鍵單擊並以管理員身份運行才能升級。

我的問題我固定通過寫CURRENT_USER,而不是現在LOCAL_MACHINE我看到你的問題實際上不是由仰角和給予解決。存儲在註冊表中的安全描述符可能被來自AWOL驅動程序的垃圾寫入或發生的任何事情破壞。這意味着你無法做很多事情,包括修復自己或新用戶。

您可能無法運行CCleaner,直到我們清除權限問題。然而,你可以啓動到安全模式並運行SFC/SCANNOW和CHKDSK - SFF固定一個人的問題相似,但它可能是有風險的,所以在自己的風險,但它看起來很有前途,我可能已經做了scannow之前,我嘗試了其他任何事情。安全模式+ SFC/SCANNOW

我會備份數據,並消滅它儘快快得多。我沒找到各種OS說明,腐敗的安全描述符的事 - 爲Win 8和7,所以你不應該有問題,看起來像他們將需要安全模式

祝您好運!