web-dev-qa-db-ja.com

プログラムでC#を使用してソフトウェアをアンインストールする

コードを使用してソフトウェアをアンインストールしたいのですが、アンインストールを実行するためにすでにwmicアプローチを試しましたが、システムでソフトウェアを見つけることができません。 msiファイルやセットアップファイルを使用せずにアンインストールすることは可能ですか?私はこのコードを見つけましたが、機能しません---

public string GetUninstallCommandFor(string productDisplayName)
{
    RegistryKey localMachine = Registry.LocalMachine;
    string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products";
    RegistryKey products = localMachine.OpenSubKey(productsRoot);
    string[] productFolders = products.GetSubKeyNames();

    foreach (string p in productFolders)
    {
        RegistryKey installProperties = products.OpenSubKey(p + @"\InstallProperties");
        if (installProperties != null)
        {
            string displayName = (string)installProperties.GetValue("DisplayName");
            if ((displayName != null) && (displayName.Contains(productDisplayName)))
            {
                string uninstallCommand = (string)installProperties.GetValue("UninstallString");
                return uninstallCommand;
            }
        }
    }
    return "";
}
13
Anoop Mishra

最も信頼できる方法は、次のシェルコマンドをプログラムで実行することです。

msiexec.exe /x {PRODUCT-GUID}

元のMSIを作成した場合は、PRODUCT-GUIDにアクセスでき、それだけで十分です。 Windowsはまさにこの目的のためにこのコピーを隠しておくので、実際のMSIファイルは必要ありません。

参考までに:

Windows ® Installer. V 5.0.14393.0 

msiexec /Option <Required Parameter> [Optional Parameter]

Install Options
    </package | /i> <Product.msi>
        Installs or configures a product
    /a <Product.msi>
        Administrative install - Installs a product on the network
    /j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]
        Advertises a product - m to all users, u to current user
    </uninstall | /x> <Product.msi | ProductCode>
        Uninstalls the product
Display Options
    /quiet
        Quiet mode, no user interaction
    /passive
        Unattended mode - progress bar only
    /q[n|b|r|f]
        Sets user interface level
        n - No UI
        b - Basic UI
        r - Reduced UI
        f - Full UI (default)
    /help
        Help information
Restart Options
    /norestart
        Do not restart after the installation is complete
    /promptrestart
        Prompts the user for restart if necessary
    /forcerestart
        Always restart the computer after installation
Logging Options
    /l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile>
        i - Status messages
        w - Nonfatal warnings
        e - All error messages
        a - Start up of actions
        r - Action-specific records
        u - User requests
        c - Initial UI parameters
        m - Out-of-memory or fatal exit information
        o - Out-of-disk-space messages
        p - Terminal properties
        v - Verbose output
        x - Extra debugging information
        + - Append to existing log file
        ! - Flush each line to the log
        * - Log all information, except for v and x options
    /log <LogFile>
        Equivalent of /l* <LogFile>
Update Options
    /update <Update1.msp>[;Update2.msp]
        Applies update(s)
    /uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>
        Remove update(s) for a product
Repair Options
    /f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>
        Repairs a product
        p - only if file is missing
        o - if file is missing or an older version is installed (default)
        e - if file is missing or an equal or older version is installed
        d - if file is missing or a different version is installed
        c - if file is missing or checksum does not match the calculated value
        a - forces all files to be reinstalled
        u - all required user-specific registry entries (default)
        m - all required computer-specific registry entries (default)
        s - all existing shortcuts (default)
        v - runs from source and recaches local package
Setting Public Properties
    [PROPERTY=PropertyValue]
20
Armin Sadeghi

これを試して

次の形式を使用してManagementObjectプロパティを取得します:

インストールされているアプリケーションをリストするコードの完全なブロック:

using System.Management
private List<string> ListPrograms()
{
    List<string> programs = new List<string>();

    try
    {
        ManagementObjectSearcher mos = 
          new ManagementObjectSearcher("SELECT * FROM Win32_Product");
        foreach (ManagementObject mo in mos.Get())
        {
            try
            {
                //more properties:
                //http://msdn.Microsoft.com/en-us/library/windows/desktop/aa394378(v=vs.85).aspx
                programs.Add(mo["Name"].ToString());

            }
            catch (Exception ex)
            {
                //this program may not have a name property
            }
        }

        return programs;

    }
    catch (Exception ex)
    {
        return programs;
    }
}

インストールされたアプリケーションのリストができたので、[Name]プロパティをアンインストールメソッドに渡すことができます。

Win32_Productメソッドを呼び出して「アンインストール」する必要があります

アプリケーションをアンインストールするための全体のブロックは次のとおりです。詳しく見てから、詳しく説明します。

  private bool UninstallProgram(string ProgramName)
    {
        try
        {
            ManagementObjectSearcher mos = new ManagementObjectSearcher(
              "SELECT * FROM Win32_Product WHERE Name = '" + ProgramName + "'");
            foreach (ManagementObject mo in mos.Get())
            {
                try
                {
                    if (mo["Name"].ToString() == ProgramName)
                    {
                        object hr = mo.InvokeMethod("Uninstall", null);
                        return (bool)hr;
                    }
                }
                catch (Exception ex)
                {
                    //this program may not have a name property, so an exception will be thrown
                }
            }

            //was not found...
            return false;

        }
        catch (Exception ex)
        {
            return false;
        }
    }
8
Tanmay Nehete