Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过注册表卸载软件_C#_Windows_Registry_Uninstallation - Fatal编程技术网

C# 通过注册表卸载软件

C# 通过注册表卸载软件,c#,windows,registry,uninstallation,C#,Windows,Registry,Uninstallation,我知道以前有人问过这个问题,但请容忍我。我有一个实用程序,它读取注册表中的Unistall位置,然后将结果与需要删除的应用程序列表进行比较。80%的情况下,这是可行的,但诀窍是要删除的项目之一是防病毒(因此可以用AVG安装替换)。对于很多公司来说,这是行不通的。下面是我如何安装软件的一个片段: const string Win32Loc = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; //const string Win32Lo

我知道以前有人问过这个问题,但请容忍我。我有一个实用程序,它读取注册表中的Unistall位置,然后将结果与需要删除的应用程序列表进行比较。80%的情况下,这是可行的,但诀窍是要删除的项目之一是防病毒(因此可以用AVG安装替换)。对于很多公司来说,这是行不通的。下面是我如何安装软件的一个片段:

const string Win32Loc = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
//const string Win32Loc = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\USerData\S-1-5-18";     
    const string Win64Loc = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";

    List<Application> apps = new List<Application>();
    string location = bool64BitOs ? Win64Loc : Win32Loc;

    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(location))
    {
        foreach (string skName in rk.GetSubKeyNames())
        {
            using (RegistryKey sk = rk.OpenSubKey(skName))
            {
                apps.Add(new Application { DisplayName = sk.GetValue("DisplayName") == null ? "" : (string)sk.GetValue("DisplayName"), AppKey = skName });
            }
        }
    }
const string Win32Loc=@“SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall”;
//常量字符串Win32Loc=@“SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\USerData\S-1-5-18”;
常量字符串Win64Loc=@“软件\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”;
列表应用程序=新列表();
字符串位置=bool64BitOs?Win64Loc:Win32Loc;
使用(RegistryKey rk=Registry.LocalMachine.OpenSubKey(位置))
{
foreach(rk.GetSubKeyNames()中的字符串skName)
{
使用(RegistryKey sk=rk.OpenSubKey(skName))
{
Add(新应用程序{DisplayName=sk.GetValue(“DisplayName”)==null?”:(字符串)sk.GetValue(“DisplayName”),AppKey=skName});
}
}
}
写入文本文件时,结果如下所示:


名称PowerDVD密钥安装屏蔽{6811CAA0-BF12-11D4-9EA1-0050BAE317E1}

名称ESC主页插件密钥InstallShield{E738A392-F690-4A9D-808E-7BAF80E0B398}

名称Intuit SiteBuilder密钥Intuit SiteBuilder

名称Microsoft Visual J#2.0可再发行软件包密钥Microsoft Visual J#2.0可再发行软件包

名称诺顿防病毒密钥导航

名称Windows Live Essentials密钥WinLiveSuite

<微软> Visual C++ 2008 ATL更新KB97 39 24 -x86 7.0.30727.4148密钥{02D9D5E-2B6D3B6D-9BC4-3D7D6DCB735C


因此,您将看到一些安装有密钥,而一些没有。这意味着80%的安装有MSIEXEC调用的密钥,而其他安装失败。我正在使用安装程序/UserData/UserXXXXX/Products,但我不知道如何为所有用户遍历。在我提供的转储中,Norton需要去,但我看不到如何去做


任何帮助都将不胜感激。

我同意selbie关于改用“卸载字符串”的评论(虽然有时您也不会有,但对于MSI的使用,只需获取GUID并使用
msiexec/x{GUID}


尽管如此,我不建议通过这种方法卸载诺顿A/V产品。因为他们的卸载程序都是垃圾,并且经常会留下许多本应删除的软件,赛门铁克提供了一个真正安全完成工作的工具:the。极力推荐!

对。您不能依赖此信息ng准确。不要求安装程序在注册表中包含信息。尤其是行为不好的应用程序(Norton是这些应用程序的典型代表)无法使用您的“暴力”卸载方法正常工作。您无法找到此问题的答案的原因是因为没有答案。祝您好运删除Norton(通过编程或其他方式!)。这是商店购买的预装电脑的癌症!如果你知道以前有人问过,为什么还要再问?你不能使用前面的答案之一吗?值得记住的是,许多应用程序也使用NSI来安装,而不是MSI。你需要阅读他们的卸载程序可执行文件的位置,NSIS通常非常适合放置这些文件进入注册表。有几件事:1)您可能应该枚举64位操作系统上的Win32 Loc和Win32 64 Loc注册表项。32位应用程序可以安装在64位操作系统上,但可以将其uinstall注册表项放在非Wow64注册表中。(取决于原始安装程序是否禁用了清单和/或注册表重定向).2)对于非MSI安装,要卸载的命令行是“UninstallString”注册表键值。为什么不使用它来启动卸载?这对于Norton这个可怕的问题来说是完美的。谢谢。对于其他卸载问题,我必须再次解决。