2011-03-07 143 views
0

我想刪除一些註冊表項,而是VS不斷告訴我,我不能在註冊表項中寫,我不明白爲什麼:如何刪除註冊表項?

public void refInstall() 
{ 
    RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Installer\Folders\MyApp"); 
    foreach(string subKeyName in regKey.GetValueNames()) 
    { 
     bool exist = Directory.Exists(subKeyName); 
     if (!exist) 
     { 
      regKey.DeleteSubKeyTree(subKeyName); 
      Console.WriteLine(subKeyName + ": N'EXISTE PAS"); 
      } 
     } 
    } 
} 
+0

什麼返回實際的錯誤? – 2011-03-07 19:27:30

+0

你能提供確切的錯誤嗎?其次是你作爲管理員運行Visual Studio?試試看。 – 2011-03-07 19:27:53

+0

確切的錯誤:「UnauthorizedAcessPermission:不可能寫在註冊表鍵」(或類似的東西,我正在法國^^運行VS) – darky89 2011-03-07 19:32:20

回答

4

您不必HKLM寫訪問。您需要使用提升的權限運行才能成功。

一直以來,HKLM的權利一直只限於管理員組的成員。當UAC推出時,用戶習慣性地在沒有管理員權限的情況下開始運行,這種情況在Vista中發生了變化。

它可能不是你想聽到的,但你需要擺脫寫入註冊表這個區域的習慣,並找到一種不同的方式來實現你的目標。對於桌面應用程序來說,期望對HKLM(或確實是Program Files目錄)進行寫入訪問的唯一時間是安裝時。

一旦按照arx所述修復代碼,就必須解決此問題。

+0

我是管理員,當我在調試文件夾「以管理員身份」運行.exe時,它崩潰了...... – darky89 2011-03-07 19:30:01

+1

管理員用戶在默認情況下沒有對HKLM的寫入權限。在UAC下,它們使用受限權限令牌運行。他們必須明確提升流程才能獲得充分的權利。但重要的是,你必須改變你的習慣。 – 2011-03-07 19:31:18

1

這有一個明顯的問題:

您是通過註冊表值迭代但試圖刪除它們,好像他們是

如果要使用值使用RegistryKey.DeleteValue

如果你想使用密鑰使用RegistryKey.GetSubKeyNames

另一個問題:

您正在以只讀訪問打開註冊表項。你需要(注意末尾有額外的布爾):(演戲的文件系統上Directory.Exists刪除評論這是經過深思熟慮的darky89如下解釋。)

RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Installer\Folders\MyApp", true); 

+0

「Directory.Exists作用於文件系統,而不是註冊表。」哎喲!! – 2011-03-07 19:32:46

+0

MMMmmmm我知道我在做什麼,我只是清理被刪除的文件夾,但仍在註冊表中:) – darky89 2011-03-07 19:33:53

+0

對不起,這有點兒公道。我已經更新了我的答案。 – arx 2011-03-07 19:54:10