C# 拆下一个';否认';来自'的规则(许可);用户选择';通过C在注册表中输入#

C# 拆下一个';否认';来自'的规则(许可);用户选择';通过C在注册表中输入#,c#,security,registry,registrykey,C#,Security,Registry,Registrykey,我正在处理文件关联。我已经确定在以下位置有一个名为UserChoice的键: HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\[ext]。 如果我创建了UserChoice键,并且该键尚未由Windows创建,我就能够读取和写入该键。但是,如果Windows已经创建了UserChoice密钥,那么我需要以管理员身份运行才能访问该密钥。我的最终目标是删除UserChoice键 我注

我正在处理文件关联。我已经确定在以下位置有一个名为
UserChoice
的键:

HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\[ext]。
如果我创建了
UserChoice
键,并且该键尚未由Windows创建,我就能够读取和写入该键。但是,如果Windows已经创建了
UserChoice
密钥,那么我需要以管理员身份运行才能访问该密钥。我的最终目标是删除
UserChoice

我注意到Windows在
UserChoice
键上放置了一个Deny规则,阻止我删除该键。如果我能够成功删除该规则,我相信我将能够删除
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
键时,它会为类型为Deny的当前用户添加一个安全规则;权限:特殊。此规则不是继承的,仅适用于
UserChoice

通过一些混乱和作为管理员运行,我能够访问该
RegistryAccessRule
。但是,即使以管理员身份运行,我也无法删除此规则。我在我的研究中读到,没有一种程序化的方法来做这件事。我可以通过RegEdit删除此规则。我还可以使用NirSoft中的文件类型管理器删除
UserChoice
键。所以我想有办法做到这一点


摘要:是否有一种方法可以删除拒绝规则,以便删除
UserChoice
键?

快速思考。在更改注册表项的规则之前,如果您拥有注册表项的所有权,它是否有效?

您的代码示例和@ali中建议的修订将为我提供一个解决方案,以克服Windows在
用户选择
项上设置的安全设置,该设置使我能够删除该注册表项

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);


}
我的解决方案假定
UserChoice
键存在于
HKEY\u CURRENT\u USER
HKCU
)配置单元中。如果是这种情况,则用户拥有
UserChoice
密钥,因此具有更改该密钥上的安全设置并最终删除该密钥的必要权限。(这意味着用户不需要是Administrators组的成员。)

此方法的
extensionKey
参数是
UserChoice
键的父键

static void DeleteUserChoiceKey(注册表项扩展键)
{
常量字符串userChoiceKeyName=“UserChoice”;
使用(RegistryKey用户选择键)=
OpenSubKey(userChoiceKeyName,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.ChangePermissions)
{
如果(userChoiceKey==null){return;}
字符串userName=WindowsIdentity.GetCurrent().Name;
RegistrySecurity security=userChoiceKey.GetAccessControl();
授权规则集合累积=
GetAccessRules(true,true,typeof(NTAccount));
foreach(应计项目中的RegistryAccessRule ar)
{
如果(ar.IdentityReference.Value==用户名&&
ar.AccessControlType==AccessControlType.Deny)
{
security.RemoveAccessRuleSpecific(ar);//删除“拒绝”权限
}
}
userChoiceKey.SetAccessControl(安全);//还原所有原始权限
//*除了“拒绝”权限之外*
}
DeleteSubKeyTree(userChoiceKeyName,true);
}

有人找到了这样做的方法吗?我也遇到了同样的问题。不幸的是,据我所知不是这样。我在这方面做了更多的工作,但我认为它需要非托管代码………@ScruffyDuck您的代码肯定在正确的轨道上。您的代码和中提供的修订代码使我成功。没有必要求助于非托管代码。请看。你能再详细一点吗?谢谢