C# Тихая установка msi не работает - PullRequest
0 голосов
/ 17 июня 2020

Я хочу создать тихую установку msi в c#. Я уже нашел нужную команду в командной строке: msiexec /i c:\temp\Setup1.msi /quiet /qn /norestart /log c:\temp\install.log ALLUSERS=1. Когда я запускаю эту команду в командной строке с правами администратора, все работает нормально.

Теперь я хочу сделать то же самое в c#. Я уже реализовал файл app.manifest (чтобы пользователь мог открыть программу только с правами администратора): <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />.

Я искал inte rnet несколько дней и пробовал много других вещей - ничего сработало.

Вот несколько попыток:

System.Diagnostics.Process installerProcess;
installerProcess = System.Diagnostics.Process.Start("cmd.exe", @"msiexec /i C:\temp\Setup1.msi /quiet /qn /norestart ALLUSERS=1");

while (installerProcess.HasExited == false)
{
    System.Threading.Thread.Sleep(250);
}

или

System.Diagnostics.Process installerProcess;
installerProcess = System.Diagnostics.Process.Start(@"C:\temp\Setup1.msi", "/quiet /qn /norestart ALLUSERS=1");

while (installerProcess.HasExited == false)
{
    System.Threading.Thread.Sleep(250);
}

В отчаянии я также создал пакет только со строкой, которая работает в cmd, и пытается выполнить этот пакет в c#, но мне тоже не удалось:

File.WriteAllText(@"C:\temp\Setup1.bat", @"msiexec /i c:\temp\Setup1.msi /quiet /qn /norestart ALLUSERS=1");

ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo();
si.CreateNoWindow = true;
si.FileName = @"C:\temp\Setup1.bat";
si.UseShellExecute = false;
System.Diagnostics.Process.Start(si);

Ничего не работает. Код программы прогоняется без ошибок, ничего не устанавливается. Даже если я включу создание файла журнала в аргументы (/log c:\temp\install.log), этот файл будет создан, но пуст.

Может ли кто-нибудь мне здесь помочь?

Большое спасибо !!!

1 Ответ

0 голосов
/ 17 июня 2020

Вы также должны запустить новый процесс с повышенными правами:

  string msiPath = @"C:\temp\Setup1.msi";
  string winDir = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
  ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(winDir, @"System32\msiexec.exe"), $"/i {msiPath} /quiet /qn /norestart ALLUSERS=1");
  startInfo.Verb = "runas";
  startInfo.UseShellExecute = true;
  Process.Start(startInfo);
...