2011-05-24 178 views
4

我正在處理文件關聯。我已經確定,有一個名爲UserChoice鍵:通過C#從註冊表中的'UserChoice'鍵刪除'拒絕'規則(權限)

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\[ext]. 

我已經能夠讀取和寫入提供創建它的UserChoice關鍵,它具有已創建的視窗。但是,如果UserChoice密鑰已經由Windows創建,那麼我需要以管理員身份運行才能訪問密鑰。我的最終目標是刪除UserChoice鍵。

我注意到,Windows將拒絕規則放在UserChoice密鑰上,這會阻止我刪除該密鑰。如果我能成功取消該規則,我相信我將能夠刪除UserChoice密鑰。這裏是我已經試過代碼:

public static void ShowSecurity(RegistryKey regKeyRoot, string user) { 
    RegistrySecurity security = regKeyRoot.GetAccessControl(AccessControlSections.All); 

    foreach (RegistryAccessRule ar in 
     security.GetAccessRules(true, true, typeof(NTAccount))) { 

     if (ar.IdentityReference.Value.Contains(User) && 
       ar.AccessControlType.ToString().ToLower() == "deny") { 

      security.RemoveAccessRuleSpecific(ar); 
      regKeyRoot.SetAccessControl(security); 
     } 
    } 
} 

當Windows創建UserChoice鍵將其添加爲拒絕類型的當前用戶安全規則;許可:特殊。此規則不會被繼承,只適用於UserChoice密鑰。

隨着管理員的一些混亂和運行,我可以訪問那RegistryAccessRule。但是,即使以管理員身份運行,我也無法刪除此規則。我在我的研究中讀到過,沒有一種編程方式可以做到這一點。我可以通過RegEdit刪除這條規則。我還可以使用NirSoft的文件類型管理器來刪除UserChoice密鑰。所以我假設有一些方法可以做到這一點。

摘要:有沒有辦法可以刪除拒絕規則,以便我可以刪除UserChoice密鑰?

+0

任何人都找到了一種方法來做到這一點?我遇到了同樣的問題。 – Jason 2011-05-31 16:00:07

+0

不幸的是,據我所知不是。我已經做了一些更多的工作,但我認爲它需要非託管代碼.......... – ScruffyDuck 2011-06-02 18:03:35

+0

@ScruffyDuck你的代碼絕對是正確的。你的代碼和[ali的答案](http://stackoverflow.com/a/28268069/1497596)中提供的修訂代碼使我獲得成功。 *不*必須訴諸非託管代碼。請參閱[我的答案](http://stackoverflow.com/a/41290208/1497596)。 – DavidRR 2016-12-22 19:51:02

回答

0

一個快速的想法。請問,如果你把所有的OG REGKEY,它的工作改變它的規則

+0

你可以擴展一下嗎?謝謝 – ScruffyDuck 2011-08-12 11:51:15

0
public static void ShowSecurity(RegistryKey regKeyRoot, string user) 
{ 

regKeyRoot.OpenSubKey("", RegistryKeyPermissionCheck.ReadWriteSubTree, 
        RegistryRights.ChangePermissions); 

RegistrySecurity security = regKeyRoot.GetAccessControl(AccessControlSections.All); 

security.SetGroup(new NTAccount("Administrators")); 
security.SetOwner(new NTAccount("ali")); //Your account name 
security.SetAccessRuleProtection(true, false); 
regKeyRoot.SetAccessControl(security); 

//--------- 

    foreach (RegistryAccessRule ar in security.GetAccessRules(true, true, typeof(NTAccount))) 
    { 
    if (ar.IdentityReference.Value.Contains(User) && ar.AccessControlType == AccessControlType.Deny) 
     security.RemoveAccessRuleSpecific(ar); 
    } 

regKeyRoot.SetAccessControl(security); 


} 
2

你的代碼示例前和answer通過@ali建議的修訂使我的解決方案克服了安全設置的Windows的地方在UserChoice密鑰,使我能夠刪除該密鑰。

我的解決方案假定HKEY_CURRENT_USERHKCU)配置單元中存在UserChoice密鑰。如果是這種情況,用戶擁有UserChoice密鑰,因此具有必要的權限來更改該密鑰上的安全設置並最終刪除它。 (這意味着該用戶不需要是管理員組的成員。)

該方法的extensionKey參數是UserChoice密鑰的母密鑰。

static void DeleteUserChoiceKey(RegistryKey extensionKey) 
{ 
    const string userChoiceKeyName = "UserChoice"; 

    using (RegistryKey userChoiceKey = 
     extensionKey.OpenSubKey(userChoiceKeyName, 
      RegistryKeyPermissionCheck.ReadWriteSubTree, 
      RegistryRights.ChangePermissions)) 
    { 
     if (userChoiceKey == null) { return; } 
     string userName = WindowsIdentity.GetCurrent().Name; 
     RegistrySecurity security = userChoiceKey.GetAccessControl(); 

     AuthorizationRuleCollection accRules = 
      security.GetAccessRules(true, true, typeof(NTAccount)); 

     foreach (RegistryAccessRule ar in accRules) 
     { 
      if (ar.IdentityReference.Value == userName && 
       ar.AccessControlType == AccessControlType.Deny) 
      { 
       security.RemoveAccessRuleSpecific(ar); // remove the 'Deny' permission 
      } 
     } 

     userChoiceKey.SetAccessControl(security); // restore all original permissions 
                // *except* for the 'Deny' permission 
    } 

    extensionKey.DeleteSubKeyTree(userChoiceKeyName, true); 
}