2017-06-12 81 views
0

我正在試驗註冊表功能,因爲我還沒有理解它們。我試圖創建兩個註冊表項,一個具有隻讀權限,另一個具有讀寫權限。我已經成功創建了它們,但在繼續前進之前,我想檢查它們是否具有適當的權限。我知道我可以通過試圖操縱它們來簡單地測試它們,但我認爲必須有一種方法來讀取註冊表項的權限。我可以讀取註冊表權限嗎?如果是這樣,怎麼樣?

有誰知道該怎麼做?

我使用VisualStudio並用C#編寫。我一直在嘗試搜索「讀取註冊表項權限」,「獲取密鑰權限」等等,但我只是獲得了關於什麼是隻讀權限等等的很多信息。有用,但對這個特定任務沒有幫助。

創建這些鍵的代碼如下:

//Create ROKey - "ReadOnlyKey" 
RegistryKey rKey = Registry.CurrentUser.CreateSubKey("ROKey", RegistryKeyPermissionCheck.ReadSubTree); 
//Create WRKey - "ReadWriteKey" 
RegistryKey wKey = Registry.CurrentUser.CreateSubKey("WRKey", RegistryKeyPermissionCheck.ReadWriteSubTree); 

編輯:

在@ itsme86的建議,我已經包括下面的代碼:

var security = rKey.GetAccessControl(); 
var rules = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 
foreach (var rule in rules.Cast<AuthorizationRule>()) 
{ 
    Console.WriteLine(rule.IdentityReference.ToString()); 
} 

security = wKey.GetAccessControl(); 
rules = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 
foreach (var rule in rules.Cast<AuthorizationRule>()){ 
    Console.WriteLine(rule.IdentityReference.ToString()); 
} 

不幸的是,我現在收到以下錯誤:

錯誤1'System.Securit y.AccessControl.AuthorizationRuleCollection'不包含'Cast'的定義,並且沒有找到接受'System.Security.AccessControl.AuthorizationRuleCollection'類型的第一個參數的擴展方法'Cast'(你是否缺少using指令或程序集參考?)C:\ Users \ DoD_Admin \ Documents \ Visual Studio 2013 \ Projects \ RegistryManipulationTest \ RegistryManipulationTest \ rKeyTestClass.cs 249 40 RegistryManipulationTest

我正在使用「System」和「Microsoft.Win32」命名空間。我應該使用另一個命名空間嗎?

編輯2:

我已經添加了「使用Linq;」到節目,現在它承認「演員」。缺點是,它不能識別AuthorizationRule類型。我試着「使用System.Web.Configuration;」,AuthorizationRule類的名字空間,但現在我被告知「名字空間'System.Web''中不存在類型或名稱空間名'Configuration'。

回答

0

你想要的是RegistryKey.GetAccessControl()。它會返回一個RegistrySecurity對象,您可以撥打GetAccessRules()。如果您想更改權限,也有相應的SetAccessControl()方法。

您顯然需要使用提升的權限運行您的應用程序。

這裏有一個如何使用它的一個例子:

using (RegistryKey key = Registry.LocalMachine.OpenSubKey("software")) 
{ 
    var security = key.GetAccessControl(); 
    var rules = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 

    foreach (var rule in rules.Cast<AuthorizationRule>()) 
    { 
     Console.WriteLine(rule.IdentityReference.ToString()); 
    } 
} 
+0

這當然似乎指向我的方向是正確的,但是當我打電話GetAccessControl(),它返回:「System.Security.AccessControl.RegistrySecurity」 ,兩個鍵的輸出相同。我不知道如何使用它,儘管它絕對比我多!你介意提供一個例子,我可以看到它的實現? – MrSpudtastic

+0

@MrSpudtastic我用示例代碼更新了我的答案。 – itsme86

+0

謝謝。我已經實現了它,但現在我得到一個錯誤。我編輯了原始問題以提供更多詳細信息。我認爲它快到了! – MrSpudtastic

相關問題