4

私はファイルの関連付けに取り組んでいます。呼び出されたキーがあることを確認しUserChoiceました:

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

キーを作成し、Windows によってまだ作成されていなけれUserChoiceキーの読み取りと書き込みを行うことができました。ただし、キーWindows によって既に作成されている場合は、管理者として実行してキーにアクセスする必要があります。私の最終的な目標は、キーを削除することです。UserChoiceUserChoice

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 で削除できます。UserChoiceNirSoft の File Types Manager を使用してキーを削除することもできます。したがって、これを行う何らかの方法があると思います。

概要:キーを削除できるように拒否ルールを削除する方法はあり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 に答える