Удаление программы

Я пытаюсь удалить программу с этим кодом.. Но, похоже, не работает. Я попробовал другие ответы, но, похоже, тоже не сработало.. Может кто-нибудь помочь мне с этим? Я пытаюсь удалить программу по указанному имени (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"));
            }
        }
      }

Только это выскакивает.. введите описание изображения здесь

1 ответ

Дубликаты: Добро пожаловать в Stackru. Просто упомянуть, что я вижу этот вопрос, по крайней мере, в трех разных вариантах. Нам придется закрыть некоторые из ваших вопросов, так как дублирование рассеивает ответы и может потратить много времени, если люди ответят (на первый взгляд) на оставшиеся без ответа дубликаты.

Короче говоря, пожалуйста, не размещайте один и тот же вопрос несколько раз. Вот другие вопросы:


C#: использование C# для этого может быть неуклюжим - независимо от того, как вы это делаете. Я бы не стал выдвигать командную строку msiexec.exe, но идти напрямую через API MSI. Доступ к этому API можно получить с помощью функций Win32 или автоматизации COM.

Удаление Appraches для MSI. Для справки существует множество способов удаления MSI: удаление файла MSI из командной строки без использования msiexec.

Раздел 14 по ссылке выше показывает, как удалить с помощью C++ - если это вариант. Тем не менее, в шаблонах Visual Studio 2017 снова произошли изменения, поэтому может потребоваться настройка для работы "из коробки".

Однако я бы использовал MSI API - как уже было сказано - и я бы порекомендовал вам пройти через встроенные функции Win32 и использовать DTF (Deployment Tools Foundation), который является частью инструментария WiX. Это оболочка.NET для MSI API, которая сэкономит вам много стандартного кода за счет необходимости развертывания библиотеки DTF: Microsoft.Deployment.WindowsInstaller.dll вместе с вашим продуктом. Я не знаю, приемлемо ли это. У меня есть код, который не зависит от DTF, если это необходимо, но это гораздо дольше.

Макет C# Образец. Ссылка на проект Microsoft.Deployment.WindowsInstaller.dll необходимо. Затем попробуйте приведенный ниже код в свежем C# .NET проекте. Вы можете получить эту DLL, установив инструментарий WiX - инструментарий с открытым исходным кодом для создания файлов MSI. После установки проверить в %ProgramFiles(x86)%\WiX Toolset v3.11\bin (с учетом версии WiX - по состоянию на сентябрь 2018 года).

GUI установщика: Важное примечание: уровень пользовательского интерфейса установки устанавливается через Installer.SetInternalUIфункция. Если вы работаете в режиме без вывода сообщений, вам нужно запустить исполняемый файл с повышенными правами, чтобы деинсталляция работала правильно, или возникает исключение доступа. Когда вы работаете в режиме полного графического интерфейса пользователя, вам необходимо повысить уровень установки самостоятельно - при условии, что у вас есть на это права.

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;
        }
    }
}
Другие вопросы по тегам