Опция установки MSI - удаление приложения

Если я запускаю приведенный ниже код, я почти уверен, что должен получить Имя продукта и GUID (например, Путь к приложению | {xxx}) для приложения. Но я только получаю путь, и GUID не отображается. Кто-нибудь может мне помочь?

// 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))
    {
        Console.WriteLine(subkey.GetValue("UninstallString"));
        //string prdctId = uninstlString.Substring((uninstlString.IndexOf("{")));
        string prdctId = uninstlString.Substring(12);
        uninstallProcess.StartInfo.FileName = "MsiExec.exe";
        uninstallProcess.StartInfo.Arguments = " /x " + prdctId + " /quiet /norestart";
        uninstallProcess.StartInfo.UseShellExecute = true;
        uninstallProcess.Start();
        uninstallProcess.WaitForExit();
        break;
        //Console.WriteLine(subkey.GetValue("UninstallString"));
    }
}

Это изображение, которое я получил, запустив код Это изображение, которое я получил, запустив код

1 ответ

Я верю UninstallString значение - это то, что выполняется при удалении приложения через Add/Remove Programs, Как показывает вывод вашей консоли, это путь к исполняемому файлу.

То, как вы получаете идентификатор продукта...

string prdctId = uninstlString.Substring(12);

... поэтому неверно, потому что вы идете по частичному пути. Что нужно передать MsiExec.exe /x это код продукта, который сам является именем раздела реестра, то есть...

string prdctId = keyName;

Если вы вызывали эту командную строку из Command Prompt Я уверен, что фигурные скобки потребуют поставить кавычки вокруг кода продукта; Я не уверен, нужно ли вам это делать при непосредственном вызове исполняемого файла, но это не повредит...

uninstallProcess.StartInfo.Arguments = " /x \"" + prdctId + "\" /quiet /norestart";
Другие вопросы по тегам