Bootstrapper WIX поиск во всех подпапках реестра для поиска папки с указанным c DisplayName - PullRequest
0 голосов
/ 30 апреля 2020

Я делаю загрузчик, который должен установить sql сервер и ssms. Я нашел 2 ссылки о том, что вы не можете искать в подпапках регистры. И ускоритель не позволяет легко использовать настраиваемые действия.

WiX RegistrySearch во всех подкаталогах

В WiX как проверить наличие ключа реестра (не значение) для Oracle ODP. Net

Как использовать CustomAction в WIX Bundle?

В настоящее время мой код выглядит следующим образом:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="Bootstrapper1" Version="1.0.0.0" Manufacturer="Test" UpgradeCode="ab854268-4ffb-46d4-862f-067fadd29aa9">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 14" Value="DisplayName" Variable="Unistall" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 14" Value="DisplayName" Variable="Unistall64" Win64="yes"/>
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 14\{91a1b895-c621-4038-b34a-01e7affbcb6b}" Value="DisplayName" Variable="UnistallSMSS" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{91a1b895-c621-4038-b34a-01e7affbcb6b}" Value="DisplayName" Variable="Unistall64SMSS" Win64="yes"/>

<Chain>
    <ExePackage Id="SQL" Name="MicrosoftSQLServer2017" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" 
      InstallCommand="/ACTION=INSTALL /Q /IACCEPTSQLSERVERLICENSETERMS /SECURITYMODE=SQL /SAPWD=Eltel2eltel /FEATURES=SQLENGINE,REPLICATION,SNAC_SDK /INSTANCENAME=MSSQLSERVER"
      SourceFile="SQLEXPR_x64_ENU.exe"
      DetectCondition="(Unistall=&quot;Microsoft SQL Server 2017&quot;) OR (Unistall64=&quot;Microsoft SQL Server 2017&quot;)"/>

    <ExePackage Id="SSMS" Name="SQLServerManagementStudio" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" 
      InstallCommand="/install /Quiet SSMSInstallRoot=C:\\Program Files\\Microsoft SQL Server /norestart"
      SourceFile="SSMS-Setup-ENU.exe"
      DetectCondition="(UnistallSMSS=&quot;Microsoft SQL Server Management Studio - 17.9.1&quot;) OR (Unistall64SMSS=&quot;Microsoft SQL Server Management Studio - 17.9.1&quot;)"/> 

    <RollbackBoundary />

    <MsiPackage Id="MainPackage" SourceFile="InstallerWix\SetupProject1\bin\Debug\en-us\SetupProject1.msi" DisplayInternalUI="yes" Compressed="yes" Vital="yes" />
</Chain>

Я не хочу и даже не могу выписать все параметры пути для различных версий sql сервера и SSMS. Я был бы склонен использовать метод ergohack из третьей ссылки. Проблема в том, что такое настраиваемое действие ничего не возвращает. Поэтому я не буду проверять, существует ли такой регистр, но мне пришлось бы запустить всю установку C #.

Этим сообщениям уже несколько лет. Возможно, что-то изменилось.

Это код в c #, который я хотел бы достичь в загрузчике:

    StatusSql = CheckInstalled("Microsoft Sql Server 2017") == true ? "SQL 2017" : "DontExist";

    public static bool CheckInstalled(string c_name, string c_added = null)
    {
        string displayName;

        string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
        RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey);
        if (key != null)
        {
            foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
            {
                displayName = subkey.GetValue("DisplayName") as string;
                if (displayName != null && ((displayName.ToLower() == c_name.ToLower() && c_added == null) || (displayName.ToLower().Contains(c_name.ToLower()) && displayName != null && displayName.ToLower().Contains(c_added.ToLower()))))
                {
                    return true;
                }
            }
            key.Close();
        }

        registryKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
        key = Registry.LocalMachine.OpenSubKey(registryKey);
        if (key != null)
        {
            foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
            {
                displayName = subkey.GetValue("DisplayName") as string;
                if (displayName != null && ((displayName.ToLower() == c_name.ToLower() && c_added == null) || (displayName.ToLower().Contains(c_name.ToLower()) && displayName != null && displayName.ToLower().Contains(c_added.ToLower()))))
                {
                    return true;
                }
            }
            key.Close();
        }
        return false;
    }
...