Я делаю загрузчик, который должен установить 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="Microsoft SQL Server 2017") OR (Unistall64="Microsoft SQL Server 2017")"/>
<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="Microsoft SQL Server Management Studio - 17.9.1") OR (Unistall64SMSS="Microsoft SQL Server Management Studio - 17.9.1")"/>
<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;
}