Удалите правило (разрешение) «Запретить» из ключа «UserChoice» в Реестре через C # - PullRequest
4 голосов
/ 24 мая 2011

Я работаю над ассоциациями файлов. Я определил, что есть ключ с именем UserChoice в:

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

Я смог прочитать и записать ключ UserChoice при условии, что I его создаст и что он не уже создан Windows. Однако, если UserChoice ключ уже уже создан Windows, то мне нужно запустить от имени администратора, чтобы получить доступ к ключу. Моя конечная цель - удалить ключ UserChoice.

Я заметил, что Windows помещает правило Deny на ключ 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. Я также могу удалить ключ UserChoice с помощью диспетчера типов файлов из NirSoft. Поэтому я предполагаю, есть способ сделать это.

Резюме: Есть ли способ удалить правило запрета, чтобы можно было удалить ключ UserChoice?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2016

Ваш пример кода и исправления, предложенные в ответе @ali, привели меня к решению по преодолению настроек безопасности, которые Windows устанавливает для клавиши UserChoice, что позволило мне удалить этот ключ.

Мое решение предполагает наличие клавиши 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);
}
0 голосов
/ 02 февраля 2015
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);


}
0 голосов
/ 12 августа 2011

Быстрая мысль.Работает ли это, если вы вступаете во владение regKey, прежде чем изменять правила для него

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...