2011-03-29 45 views
0

我試圖向註冊表項添加一些訪問規則,但我沒有權限,但我是管理員並正在使用"Run as administrator"命令在鼠標右鍵菜單上。
不幸的是引發異常(System.UnauthorizedAccessException)。
當以管理員身份運行regedit.exe時,我可以更改此密鑰的權限而無任何問題。
如何在我的應用程序中爲此鍵添加任何訪問規則?將註冊表訪問規則添加到我無法訪問的密鑰中,但我是管理員

RegistryKey root = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\some_key", RegistryKeyPermissionCheck.ReadWriteSubTree); 
RegistrySecurity security = new RegistrySecurity(); 
SecurityIdentifier sec = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
RegistryAccessRule rule = new RegistryAccessRule(sec, RegistryRights.ReadKey | RegistryRights.QueryValues, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow); 
security.AddAccessRule(rule); 
root.SetAccessControl(security); 
root.Close(); 
+0

舊線程,但對於那些發現此線程的人(與我一樣),請參閱解決方法: [S.O.設置所有者的註冊表項](http://stackoverflow.com/questions/24742115/asp-net-vb-setting-owner-on-a-registry-key) – 2014-07-21 16:41:26

回答

0

我認爲你應該使用GetAccessControl()方法得到一個RegistrySecurity對象:

RegistryKey root = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\some_key", RegistryKeyPermissionCheck.ReadWriteSubTree); 
RegistrySecurity security = root.GetAccessControl(); 

你可能得到的異常,因爲你試圖覆蓋安全規則,而不是通過修改它們。

+0

此對象(鍵)沒有設置安全規則,並且繼承被禁用,那麼如何獲取?即使我刪除除RegistryKey root = Registry.LocalMachine.CreateSubKey(...)和root.Close()之外的所有代碼行,該程序也崩潰了。 – daftu 2011-03-29 10:37:38

+0

@daftu,也許問題出在@「SOFTWARE \ some_key」。嘗試使用OpenSubKey()首先獲得具有寫入權限的SOFTWARE密鑰。然後在返回的鍵上調用CreateSubKey。 – 2011-03-29 10:57:02

+0

不,這不是一個正確的方法。仍然是同樣的問題。 – daftu 2011-03-29 11:20:56

0

documentation是相當清楚的:

UnauthorizedAccessException:本 當前的RegistryKey對象表示 使用訪問控制安全, 和呼叫者的關鍵不具有 RegistryRights.ChangePermissions 權利。

另請參閱RegistryRights的文檔。

+0

你是說在我的情況下不可能更改/設置此對象的訪問規則? – daftu 2011-03-29 10:47:04

+0

@daftu:當然,我不是這麼說的。 'regedit'做到了,爲什麼你不能? – Jon 2011-03-29 10:47:52

+0

所以請給我建議如何做到這一點,因爲文檔對我來說並不那麼清楚(比如4) – daftu 2011-03-29 10:49:45

0

我知道這是一箇舊的線程,但我以前遇到過這個問題。我發現你需要先用RegistryRights.ChangePermissions打開密鑰,然後才能修改訪問控制。

嘗試打開的關鍵是這樣的:

RegistryKey root = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\some_key", 
RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions); 

然後修改AccessControl的規則。