卸载程序

时间:2018-09-10 08:53:08

标签: c#

我正在尝试使用此代码卸载程序。但是,它似乎不起作用。我尝试了其他答案,但似乎也没有用。有人可以帮助我吗?我正在尝试使用给定名称(displayName)卸载程序

例如,我给displayName = Appname,那么此代码应从我的计算机上卸载Appname程序。

public static void UninstallApplictionInstalled(string p_name)
    {
        string displayName;
        string uninstlString;
        RegistryKey key;

        ProcessStartInfo info = new ProcessStartInfo();
        Process uninstallProcess = new Process();
        string temp;

        // search in: CurrentUser
        key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
        foreach (String keyName in key.GetSubKeyNames())
        {
            RegistryKey subkey = key.OpenSubKey(keyName);
            displayName = Convert.ToString(subkey.GetValue("DisplayName"));
            uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));

            if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
            {

                uninstallProcess.StartInfo.FileName = "MsiExec.exe";
                uninstallProcess.StartInfo.Arguments = " /x " + uninstlString + " /quiet /norestart";
                uninstallProcess.Start();
                uninstallProcess.WaitForExit();
                break;

                //Console.WriteLine(subkey.GetValue("UninstallString"));
            }
        }

        // search in: LocalMachine_32
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
        foreach (String keyName in key.GetSubKeyNames())
        {
            RegistryKey subkey = key.OpenSubKey(keyName);
            displayName = Convert.ToString(subkey.GetValue("DisplayName"));
            uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));

            if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
            {
                uninstallProcess.StartInfo.FileName = "MsiExec.exe";
                uninstallProcess.StartInfo.Arguments = " /x " + uninstlString + " /quiet /norestart";
                uninstallProcess.Start();
                uninstallProcess.WaitForExit();
                break;

                //Console.WriteLine(subkey.GetValue("UninstallString"));
            }
        }

        // search in: LocalMachine_64
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
        foreach (String keyName in key.GetSubKeyNames())
        {
            RegistryKey subkey = key.OpenSubKey(keyName);
            displayName = Convert.ToString(subkey.GetValue("DisplayName"));
            uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));

            if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
            {
                //string prdctId = uninstlString.Substring((uninstlString.IndexOf("{")));

                uninstallProcess.StartInfo.FileName = "MsiExec.exe";
                uninstallProcess.StartInfo.Arguments = " /x " + uninstlString + " /quiet /norestart";
                uninstallProcess.Start();
                uninstallProcess.WaitForExit();
                break;
                //Console.WriteLine(subkey.GetValue("UninstallString"));
            }
        }
      }

仅弹出。 enter image description here

1 个答案:

答案 0 :(得分:0)

重复 :欢迎使用Stackoverflow。顺便提一下,我看到至少有3种不同口味的问题。我们将不得不关闭您的一些问题,因为重复会分散答复,并且如果人们回答(貌似)未回答的重复会浪费很多时间。

简而言之:请不要多次发布相同的问题。这是其他问题:


C# :无论如何使用C#都是笨拙的。我不会将命令行推送到 msiexec.exe ,而是直接通过MSI API进行操作。可以通过Win32 functionsCOM automation访问此API。

  

MSI的卸载方法 :供您参考,MSI有多种踢法   卸载:   Uninstalling an MSI file from the command line without using msiexec

     上面链接中的

第14 部分显示了如何使用C ++卸载-如果可以的话。但是:Visual Studio 2017模板又有变化,因此可能需要进行调整才能“即用即用”。

但是,我将使用MSI API(如前所述),并且我建议您通过本机Win32函数进行操作,并建议您使用WiX工具包中的DTF(部署工具基金会)。它是MSI API的.NET包装器-可以节省许多样板代码,但必须与产品一起部署DTF DLL: Microsoft.Deployment.WindowsInstaller.dll 。我不知道这是否可以接受。如果需要的话,我的代码不依赖于DTF,但是它要长得多。

C#模拟样例 。需要对 Microsoft.Deployment.WindowsInstaller.dll 的项目引用。然后在一个新的C#.NET项目中尝试以下代码。您可以通过安装the WiX toolkit(用于创建MSI文件的开源工具包)来获取该DLL。安装后,请检入 %ProgramFiles(x86)%\WiX Toolset v3.11\bin (适用于WiX版本-自2018年9月起有效)。

安装程序GUI :首先重要说明:通过 Installer.SetInternalUI UI级别 >功能。如果以静默方式运行,则需要运行提升权限的可执行文件才能使卸载正常工作,否则会发生访问异常。在完全GUI模式下运行时,您需要自行提升安装-只要您有权这样做。

using System;
using Microsoft.Deployment.WindowsInstaller;

namespace UninstallMsiViaDTF
{
    class Program
    {
        static void Main(string[] args)
        {
            // Update this name to search for your product. This sample searches for "Orca"
            var productcode = FindProductCode("orca");

            try
            {
                if (String.IsNullOrEmpty(productcode)) { throw new ArgumentNullException("productcode"); }

                // Note: Setting InstallUIOptions to silent will fail uninstall if uninstall requires elevation since UAC prompt then does not show up 
                Installer.SetInternalUI(InstallUIOptions.Full); // Set MSI GUI level (run this function elevated for silent mode)
                Installer.ConfigureProduct(productcode, 0, InstallState.Absent, "REBOOT=\"ReallySuppress\"");

                // Check: Installer.RebootInitiated and Installer.RebootRequired;
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: " + e.Message);
            }

            Console.ReadLine(); // Keep console open
        }

        // Find product code for product name. First match found wins
        static string FindProductCode(string productname)
        {
            var productcode = String.Empty;

            foreach (ProductInstallation product in ProductInstallation.AllProducts)
            {
                if (product.ProductName.ToLower().Contains(productname.ToLower()))
                {
                    productcode = product.ProductCode;
                    break;
                }
            }

            return productcode;
        }
    }
}