4

我正在研究文件关联。我已经确定有一个键被调用UserChoice

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

UserChoice只要创建它并且它尚未由 Windows 创建,我就能够读取和写入密钥。但是,如果 Windows 已经创建了密钥UserChoice,那么我需要以管理员身份运行才能访问密钥。我的最终目标是删除密钥。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 创建密钥时,它会为 Type DenyUserChoice的当前用户添加一个安全规则;许可:特殊。此规则不会被继承,仅适用于UserChoice键。

随着一些混乱和以管理员身份运行,我可以访问它RegistryAccessRule。但是,即使以管理员身份运行,我也无法删除此规则。我在研究中的某处读到,没有一种程序化的方法可以做到这一点。我可以通过 RegEdit 删除此规则。我还可以UserChoice使用 NirSoft 的文件类型管理器删除密钥。所以我认为有一些方法可以做到这一点。

摘要:有没有办法可以删除拒绝规则以便我可以删除UserChoice密钥?

4

3 回答 3

2

您的代码示例和@ali的答案UserChoice中建议的修订使我找到了一个解决方案,以克服 Windows 放置在使我能够删除该密钥的密钥上的安全设置。

我的解决方案假定UserChoice密钥存在于HKEY_CURRENT_USER( HKCU) 配置单元中。如果是这种情况,则用户拥有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);
}
于 2016-12-22T19:14:20.110 回答
0

一个快速的想法。如果您在更改规则之前获得 regKey 的所有权,它是否有效

于 2011-08-12T11:18:09.750 回答
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);


}
于 2015-02-01T21:22:38.887 回答