我正在研究文件关联.我已经确定在UserChoice中有一个名为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创建UserChoice键时,它为Type Deny的当前用户添加安全规则;许可:特别.此规则不是继承的,仅适用于UserChoice键.
随着管理员的一些混乱和运行,我能够访问RegistryAccessRule.但是,即使以管理员身份运行,我也无法删除此规则.我在研究中的某处读到,没有一种程序化的方法可以做到这一点.我可以通过RegEdit删除此规则.我还可以使用NirSoft的文件类型管理器删除UserChoice密钥.所以我认为有一些方法可以做到这一点.
简介:有没有办法可以删除Deny规则,以便删除UserChoice密钥?
最佳答案 您的代码示例以及@ali在
answer中建议的修订引导我找到一个解决方案,用于克服Windows在UserChoice键上放置的安全设置,这使我能够删除该密钥.
我的解决方案假设UserChoice密钥存在于HKEY_CURRENT_USER(HKCU)配置单元中.如果是这种情况,则用户拥有UserChoice密钥,因此具有更改该密钥的安全设置并最终将其删除的必要权限. (这意味着用户不需要是Administrators组的成员.)
此方法的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);
}