2009-08-31 54 views
1

我想檢查我是否有顯示的形式,允許用戶更改都寫在關鍵的一些設置之前,在註冊表中特定鍵的寫訪問。RegistryPermission是如何工作的?

碼消毒爲清楚起見

public bool CanWrite() 
{ 
    string key = @"HKEY_LOCAL_MACHINE\SOFTWARE\MyHaccpPlan, Inc.\2.0"; 

    try 
    { 
     RegistryPermission permission = new RegistryPermission(RegistryPermissionAccess.Write, key); 
     permission.Demand(); 
     return true; 
    } 
    catch(SecurityException) 
    { 
     return false; 
    } 
} 

我使用一個具有隻讀訪問權限的用戶運行的應用程序。問題是這個函數返回true,即使用戶沒有寫權限。

後來想

Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\MyHaccpPlan, Inc.\2.0", "Language", "fr-CA"); 

通話將失敗,UnauthorizedAccessException

如何正確試圖寫入之前,檢查註冊表中的權利?

編輯

我不希望當前用戶能夠寫在那裏。我想使用這個註冊表項作爲一個標誌,該軟件中的一個功能應該被禁用。但是,如果用戶是管理員,我希望軟件允許該功能。目標是網絡管理員可以預設設置,並且用戶將無法更改設置。

但實際上寫,等待它崩潰的旁邊,我要檢查使用.NET提供的,如果這是可能的權限系統的安全性。

回答

1

你不應該依賴於.NET代碼訪問安全管理訪問控制到註冊表中;更別說應該在代碼中進行明確的檢查了。用這種方法,用戶仍然可以使用註冊表編輯器並繞過所有的訪問檢查。

相反,你應該使用正確的ACL來限制哪些用戶可以寫入密鑰。

如果您想在運行時測試您是否有權訪問某個密鑰,則應嘗試打開密鑰進行寫入,並捕獲SecurityException(在這種情況下,運行該應用程序的用戶無權修改該密鑰)。

+0

我想我很難解釋。根據客戶端(例如大學)的不同,網絡管理員將在該位置創建密鑰,並使用該註冊表中的ACL限制訪問權限,以確保學生對該密鑰具有隻讀訪問權限。對於其他類型的設置,用戶將在CURRENT_USER中寫入自己的設置,除非該設置在LOCAL_MACHINE中被覆蓋。 – 2009-08-31 22:26:59

+0

但是,這就是我所做的,我使用OpenSubKey和寫權限,並且完全刪除了RegistryPermission。我會將這個答案標記爲已接受,因爲這是我所做的。 – 2009-08-31 22:28:41

0

嗯,你可以嘗試使用像盧茨Roeder的反射器的工具用於查看Registry.SetValue方法的內容。

望了一下它,它似乎與下一行代碼做到這一點:

new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); 
+0

此檢查,如果關鍵是遙控鑰匙只能製造。 – 2009-08-31 19:10:35