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

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

Вы уверены, что у вашего приложения есть разрешение на удаление? Вы запускаете это как администратор? Кроме того, пробовали ли вы запустить его без / quiet и с включенным / L ведением журнала

pstrjds 10.09.2018 10:55

Все, что находится внутри UninstallString, должно быть полный, отдельной командой для удаления программы. Нет никакой гарантии, что msiexec /x - правильный способ удалить любую данную программу, и даже если это является, UninstallString уже будет содержать этот текст.

Damien_The_Unbeliever 10.09.2018 10:57

Не могли бы вы рассказать нам, что означает does not seem to be working? Будет более полезно, если вы предоставите нам какое-то «сообщение об ошибке», которое вы получаете при запуске этой программы.

Aniket Inge 10.09.2018 10:57

Первое, что меня поражает, когда я читаю ваш код, - это void IsApplicationInstalled. Учитывая название, я ожидал bool вместо void. Тело вашей функции также совершенно не соответствует своему названию. Это как если бы вы спросили кого-то «Эй, у тебя есть молоко?», а он ответил бы «ммх дайте мне проверить ... ага, я только что вылил его в туалеты» или еще хуже: он вылил это в унитаз и ничего вам не сказал. (Просто говорю)

Rafalon 10.09.2018 10:59

всплывающее окно означает, что вы неправильно использовали синтаксис команды. Вы предоставили msi / код продукта для этого / x или отображаемого имени? отображаемое имя не то же самое.

BugFinder 10.09.2018 11:02

@BugFinder, как показано в коде, который я дал Uninstallstring ... я думаю ... не отображаемое имя

BongJae 10.09.2018 11:05

Общее замечание: не делайте if (p_name.Equals(value) == true) - IMO это плохой стиль, он уже возвращает логическое значение, просто сделайте if (p_name.Equals(value))

Peter B 10.09.2018 11:06

Строка удаления может быть другими методами удаления, например, у меня есть пара, которая: c: \ users \ name \ appdata \ local \ app \ uninstall.exe, или одна, которая c: \ program files \ ... blah \ something configuration - uninstallApp more blah ... Вы можете предположить, что это все файлы удаления msi

BugFinder 10.09.2018 11:16

Возможный дубликат Опция установщика MSI - удаление приложения

Lance U. Matthews 11.09.2018 04:27
0
9
601
1

Ответы 1

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

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


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

Uninstall Appraches for MSI: For your reference, there is a myriad of ways to kick of an MSI uninstall: Uninstalling an MSI file from the command line without using msiexec.

Section 14 from the link above shows how to uninstall using C++ - if that is an option. However:, there are changes in the Visual Studio 2017 templates again, so it might need a tune-up to work "out-of-the-box".

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

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

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

Run Elevated: How to check for admin rights: Check if the current user is administrator.

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;
        }
    }
}

Вы отвечаете информативно, но почему именно string.ToLower().Contains(string.Tolower())? и это в цикле ... Вы создаете 2 новые строки за итерацию, они вам не нужны. Это лучше, чем string.IndexOf(string, StringComparison) > -1?

Steeeve 06.08.2021 18:18

Другие вопросы по теме