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