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您的代码肯定在正确的轨道上。您的代码和中提供的修订代码使我成功。没有必要求助于非托管代码。请看。你能再详细一点吗?谢谢