C# 静默安装 msi 不起作用
C# Silent installation of msi does not work
我想在 c# 中创建 msi 的静默安装。我已经在命令行中找到了正确的命令:msiexec /i c:\temp\Setup1.msi /quiet /qn /norestart /log c:\temp\install.log ALLUSERS=1
。当我 运行 在具有管理员权限的命令行中使用此命令时,一切正常。
我现在想在 C# 中做同样的事情。我已经实现了一个 app.manifest 文件(这样用户只能以管理员权限打开程序):<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
.
我在互联网上搜索了好几天并尝试了很多其他方法 - 没有任何效果。
这里有一些尝试:
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
),此文件已创建,但为空。
有人可以帮我吗?
非常感谢!!!
您还应该使用提升的权限执行新进程:
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);
我想在 c# 中创建 msi 的静默安装。我已经在命令行中找到了正确的命令:msiexec /i c:\temp\Setup1.msi /quiet /qn /norestart /log c:\temp\install.log ALLUSERS=1
。当我 运行 在具有管理员权限的命令行中使用此命令时,一切正常。
我现在想在 C# 中做同样的事情。我已经实现了一个 app.manifest 文件(这样用户只能以管理员权限打开程序):<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
.
我在互联网上搜索了好几天并尝试了很多其他方法 - 没有任何效果。
这里有一些尝试:
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
),此文件已创建,但为空。
有人可以帮我吗?
非常感谢!!!
您还应该使用提升的权限执行新进程:
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);