2

我对 c# 相当陌生。我想实现一个接一个地删除多个注册表项,但是第一个键出现异常,之后代码停止删除其他键。我尝试了下面提到的代码,它适用于 if 块中的单个键

string[] keyArray = { @"Wow6432Node\CLSID",
            @"Software\Microsoft\Windows\CurrentVersion\Ext\Settings",
            @"Software\Microsoft\Windows\CurrentVersion\Ext\Stats",
            @"SOFTWARE\Classes\Wow6432Node\CLSID",
            @"SOFTWARE\Wow6432Node\Classes\CLSID",
            @"Wow6432Node\Microsoft\Code Store Database\Distribution Units",
            @"Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility",
            @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ModuleUsage"
    };

foreach (var key in keyArray)
{
    try
    {

        RegistryKey myKey = Registry.ClassesRoot.OpenSubKey(key, true);
        if (myKey != null)
        {
            /*Cisco Secure Desktop*/
            myKey.DeleteSubKeyTree("{705EC6D4-B138-4079-A307-EF13E4889A82}");
            myKey.DeleteSubKeyTree("{F8FC1530-0608-11DF-2008-0800200C9A66}");
            myKey.DeleteSubKeyTree("{E34F52FE-7769-46CE-8F8B-5E8ABAD2E9FC}");
            /*Cisco Hostscan*/
            myKey.DeleteSubKeyTree("{F8FC1530-0608-11DF-2008-0800200C9A66}");
            myKey.DeleteSubKeyTree("{E34F52FE-7769-46CE-8F8B-5E8ABAD2E9FC}");
            /*Cisco AnyConnect Secure Mobility Client*/
            myKey.DeleteSubKeyTree("{55963676-2F5E-4BAF-AC28-CF26AA587566}");
            myKey.DeleteSubKeyTree("{CC679CB8-DC4B-458B-B817-D447B3B6AC31}");
        }
        else
            Console.WriteLine(string.Format("could not open key: {0}", key));
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(
            string.Format("action {0} failed with\n{1}", key, ex.Message));

    }
  }
4

2 回答 2

0

根据您的详细信息,您可以尝试以下代码

string[] keyArray = { @"Wow6432Node\CLSID",
                @"Software\Microsoft\Windows\CurrentVersion\Ext\Settings",
                @"Software\Microsoft\Windows\CurrentVersion\Ext\Stats",
                @"Wow6432Node\Microsoft\Code Store Database\Distribution Units",
                @"Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility",
                @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ModuleUsage",
                @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ModuleUsage",
        };

foreach (var key in keyArray)
{   
    try
    {
        RegistryKey myKey = Registry.ClassesRoot.OpenSubKey(key, true);
        if (myKey != null)
            myKey.DeleteSubKeyTree("{55963676-2F5E-4BAF-AC28-CF26AA587566}");
        else
            System.Diagnostics.Debug.WriteLine(string.Format("could not open key: {0}", key));
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(
            string.Format("action {0} failed with\n{1}", key, ex.Message));
    }                
}

这也应该打印出一些错误信息。

根据您给出的评论ArgumentException(...),您尝试打开/删除一个 {55963676-2F5E-4BAF-AC28-CF26AA587566} 不存在的子项!也许你应该看看Registry.OpenSubKeyDeleteSubKeyTree(..)

编辑:根据给定的详细信息添加了一个新答案

private static void deleteRegistryKeys2()
{
    string[] classIds = {
                    "{538793D5-659C-4639-A56C-A179AD87ED44}",
                        /*Cisco Secure Desktop*/
                    "{705EC6D4-B138-4079-A307-EF13E4889A82}",
                    "{F8FC1530-0608-11DF-2008-0800200C9A66}",
                        /*Cisco Hostscan*/
                    "{F8FC1530-0608-11DF-2008-0800200C9A66}",
                    "{E34F52FE-7769-46CE-8F8B-5E8ABAD2E9FC}",
                        /*Cisco AnyConnect Secure Mobility Client*/
                    "{55963676-2F5E-4BAF-AC28-CF26AA587566}",
                    "{CC679CB8-DC4B-458B-B817-D447B3B6AC31}"
                    };

    string[] regKeys = {  @"Wow6432Node\CLSID",
                        @"Software\Microsoft\Windows\CurrentVersion\Ext\Settings",
                        @"Software\Microsoft\Windows\CurrentVersion\Ext\Stats",
                        @"SOFTWARE\Classes\Wow6432Node\CLSID",
                        @"SOFTWARE\Wow6432Node\Classes\CLSID",
                        @"Wow6432Node\Microsoft\Code Store Database\Distribution Units",
                        @"Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility",
                        @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ModuleUsage"
                    };

    // iterate every regKey
    foreach (var regkey in regKeys)
    {
        // go for each classId
        foreach (var classId in classIds)
        {
            // get a regKey within a hive, pass classId too
            deleteKey(Registry.ClassesRoot.OpenSubKey(regkey, true), classId);

            deleteKey(Registry.CurrentUser.OpenSubKey(regkey, true), classId);
            deleteKey(Registry.LocalMachine.OpenSubKey(regkey, true), classId);
        }
    }
    Console.WriteLine("Cleanup finished. Press any key to exit");
    Console.ReadLine();
}

private static void deleteKey(RegistryKey registryKey, string classId)
{
    // check if there is a key
    if (registryKey != null)
    {
        try
        {
            // try to remove classId within this regKey
            registryKey.DeleteSubKeyTree(classId);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            Console.WriteLine(
                string.Format("could not delete key {0} with classId {1}",
                    registryKey, classId));
        }
    }
}
于 2013-02-10T17:53:32.897 回答
0

最后,我有更好的代码,经过大量努力后可以正常工作请让我知道是否有人可以做得更好

   namespace ConsoleApplication1
   {
    class Program
    {
    static void Main(string[] args)
    {
        string[] clsids = {
                          "{538793D5-659C-4639-A56C-A179AD87ED44}",
                              /*Cisco Secure Desktop*/
                          "{705EC6D4-B138-4079-A307-EF13E4889A82}",
                          "{F8FC1530-0608-11DF-2008-0800200C9A66}",
                              /*Cisco Hostscan*/
                          "{F8FC1530-0608-11DF-2008-0800200C9A66}",
                          "{E34F52FE-7769-46CE-8F8B-5E8ABAD2E9FC}",
                             /*Cisco AnyConnect Secure Mobility Client*/
                          "{55963676-2F5E-4BAF-AC28-CF26AA587566}",
                          "{CC679CB8-DC4B-458B-B817-D447B3B6AC31}"

                          };


        string[] keys = {  @"Wow6432Node\CLSID",
                                @"Software\Microsoft\Windows\CurrentVersion\Ext\Settings",
                                @"Software\Microsoft\Windows\CurrentVersion\Ext\Stats",
                                @"SOFTWARE\Classes\Wow6432Node\CLSID",
                                @"SOFTWARE\Wow6432Node\Classes\CLSID",
                                @"Wow6432Node\Microsoft\Code Store Database\Distribution Units",
                                @"Wow6432Node\Microsoft\Internet Explorer\ActiveX Compatibility",
                                @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ModuleUsage"
};

        /*Classes root hive*/

        for (int i = 0; i<=7; i++ )
        {
        foreach (var regkey in keys)
        {
            try
            {

           using (RegistryKey mykey = Registry.ClassesRoot.OpenSubKey(regkey, true))
                    if (mykey != null)
                    {
                        Console.WriteLine(mykey + @"\"+clsids[i]);
                        mykey.DeleteSubKeyTree(clsids[i]);

                    }

                    else
                    {
                        Console.WriteLine("key does not exist");
                    }

                /*try end*/
            }
            catch
            {
                continue;
            }


        }
        }

        /*Current user hive*/

        for (int i = 0; i <= 7; i++)
        {
            foreach (var regkey in keys)
            {
                try
                {

             using (RegistryKey mykey = Registry.CurrentUser.OpenSubKey(regkey, true))
                        if (mykey != null)
                        {
                            Console.WriteLine(mykey + @"\" + clsids[i]);
                            mykey.DeleteSubKeyTree(clsids[i]);

                        }

                        else
                        {
                            Console.WriteLine("key does not exist");
                        }

                    /*try end*/
                }
                catch
                {
                    continue;
                }


            }
            }

        /*Local Machine hive*/

        for (int i = 0; i <= 7; i++)
        {
            foreach (var regkey in keys)
            {
                try
                {
            using (RegistryKey mykey = Registry.LocalMachine.OpenSubKey(regkey, true))
                        if (mykey != null)
                        {
                            Console.WriteLine(mykey + @"\" + clsids[i]);
                            mykey.DeleteSubKeyTree(clsids[i]);

                        }

                        else
                        {
                            Console.WriteLine("key does not exist");
                        }

                    /*try end*/
                }
                catch
                {
                    continue;
                }


            }
            }

        Console.WriteLine("Cleanup finished. Press any key to exit");
        Console.ReadLine();
    }
    }
    }
于 2013-02-13T14:32:23.113 回答