用VS2008建的安装部署,想在卸载时删除注册表指定项,于是重写unintall方法 
代码如下 private void DeleteRegist(string name)
        {
            string[] aimnames;
            RegistryKey hkml = Registry.LocalMachine;
            RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);
            aimnames = software.GetSubKeyNames();
                foreach (string aimKey in aimnames)
                {
                    if (aimKey == name)
                        software.DeleteSubKeyTree(name);
                }        } 
在XP下运行没有问题,但在win7下运行时不成功,关掉UAC了再试还是不成功,想问下有没有高手知道是什么问题,求助

解决方案 »

  1.   

    不好意思哈,再补充一下,win7是64位win7系统
      

  2.   

    你看看注册表读取的路径设置的正确吗
    写一个winform程序测试下,以管理员身份运行看你的代码能卸载注册表,啊
      

  3.   

    路径就是"HKEY_LOCAL_MACHINE\SOFTWARE\ABC"。用WINform 在64位WIN7下以管理员权限运行是能够删除成功的,路径打出来看了,也没有问题,现在就是不知道为啥写在重写的unistall方法里没生效,是卸载时权限不够?
      

  4.   

    既然winfoem测试是可以的 那应该是权限的问题了
      

  5.   

    但我卸载也没法用管理员权限卸呀,奇怪的是关了WIN7的UAC也不成功,有没有方法能在代码中提升执行的权限?或还有其它方法??
      

  6.   

    在win7的64位系统下运行确定路径定位到了"HKEY_LOCAL_MACHINE\SOFTWARE\",但奇怪的是GetSubKeyNames()方法寻找SOFTWARE下的ABC项时,找不到,而且在foreach里面将寻找到的项一个一个打出来看,发现子项和注册表上对不上,但是如果用相同方法用WINFORM测试,找到的子项和注册表是一致的,但是XP下运行发现foreach找到的子项和注册表又是一致的,能找到ABC项删除成功
      

  7.   

    在64位系统下,直接用 Registry.LocalMachine 其实定位到的并不是"HKEY_LOCAL_MACHINE\SOFTWARE\",而是另一个叫做Wow6432Node的键值,如果想要定位到"HKEY_LOCAL_MACHINE\SOFTWARE\"则需要做这样一个转换:
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);如果写CPU类型通用的程序的话可以使用这种方法处理:RegistryKey registryKey;
    if (Environment.Is64BitOperatingSystem == true)
    {
        registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
    }
    else
    {
        registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
    }