1

C# でレジストリ キーを削除する権限があるかどうかをプログラムに判断させようとしています。実際には、レジストリ キーに対する適切なアクセス許可がない場合に true を返すこのコードを試しています。

public static bool CanDeleteKey(RegistryKey key)
{
    try
    {
        if (key.SubKeyCount > 0)
        {
            bool ret = false;

            foreach (string subKey in key.GetSubKeyNames())
            {
                ret = CanDeleteKey(key.OpenSubKey(subKey));

                if (!ret)
                    break;
            }

            return ret;
        }
        else
        {
            RegistryPermission r = new 
          RegistryPermission(RegistryPermissionAccess.AllAccess, key.ToString());
            r.Demand();
            return true;
        }

    }
    catch (SecurityException)
    {
        return false;
    }
}

この関数に渡すレジストリ キーはHKEY_CLASSES_ROOT\eHomeSchedulerService.TVThumbnailCache. CLSIDフル コントロール アクセス許可は TrustedInstaller に対してのみ設定されているため、サブ キーに再帰して false を返す必要があります。

HKEY_CLASSES_ROOT\eHomeSchedulerService.TVThumbnailCache\CLSIDregedit から のアクセス許可は次のとおりです。HKEY_CLASSES_ROOT\eHomeSchedulerService.TVThumbnailCache\CLSID アクセス許可

管理者権限でコードを実行していることに注意してください。また、レジストリ キーを削除するときに try-catch ブロックを使用できることはわかっていますが、事前に削除できるかどうかを知りたいです。

4

2 に答える 2

0

私はGoogleでいくつかの掘り下げを行うことができ、トリックを行うと思われるこのコードを思いつきました:

    /// Checks if we have permission to delete a registry key
    /// </summary>
    /// <param name="key">Registry key</param>
    /// <returns>True if we can delete it</returns>
    public static bool CanDeleteKey(RegistryKey key)
    {
        try
        {
            if (key.SubKeyCount > 0)
            {
                bool ret = false;

                foreach (string subKey in key.GetSubKeyNames())
                {
                    ret = CanDeleteKey(key.OpenSubKey(subKey));

                    if (!ret)
                        break;
                }

                return ret;
            }
            else
            {
                System.Security.AccessControl.RegistrySecurity regSecurity = key.GetAccessControl();

                foreach (System.Security.AccessControl.AuthorizationRule rule in regSecurity.GetAccessRules(true, false, typeof(System.Security.Principal.NTAccount)))
                {
                    if ((System.Security.AccessControl.RegistryRights.Delete & ((System.Security.AccessControl.RegistryAccessRule)(rule)).RegistryRights) != System.Security.AccessControl.RegistryRights.Delete)
                    {
                        return false;
                    }
                }

                return true;
            }

        }
        catch (SecurityException)
        {
            return false;
        }
    }
于 2012-09-28T06:00:56.510 に答える
-1

読み取り権限があれば、キーを開くことができます。使用してみてください:

key.DeleteSubKey(subkey)
于 2012-09-28T02:21:55.387 に答える