Process.Start() 在某些计算机上无法正常工作
Process.Start() does not work properly on some computers
我有一个程序,其中 运行 一些 .msi 文件。该程序从我们的网站下载一些文件和 运行s .msi 文件。当我 运行 如下代码时,它 运行 在大多数计算机上顺利运行并安装设置,但在某些计算机上它显示 windows 安装程序信息屏幕。当我在同一台计算机上使用 VisualStudio 打开项目时,它仍然可以正常工作,没有任何问题。我正在使用 WiX Setup 作为安装程序生成器。如果您对问题的原因有任何想法,能否请您帮忙?
总结
案例 1:程序是 运行 和 visual studio,下面的代码没有任何问题。
情况 2:我正在使用 WiX 安装程序来设置程序。在这种情况下,一些将适用于大多数计算机。在第一种情况下,它在工作计算机上不起作用。
情况 3:如果设置是 运行 由用户手动设置,而不是使用下面的代码,则可以正常工作。
Process p = new Process();
p.EnableRaisingEvents = true;
p.Exited += ProcessExit;
p.StartInfo.FileName = "msiexec";
p.StartInfo.Arguments = string.Format("{0} {1}", "/i", _msiReadPath);
p.StartInfo.UseShellExecute = true;
p.Start();
不是:我认为问题可能出在 WiX 安装程序上,因此我使用安装项目创建了一个新的安装程序。同样的问题仍然存在。在有此问题的计算机上,它会发出警告,提示它可能在使用 Setup Project 安装期间被感染。问题的根本原因可能是 Windows 安装程序吗?
其他更正和注释:
我在电脑上遇到问题的经历如下。
我正在使用使用 WiX 创建程序的设置来安装我的程序。然后我运行在程序中安装过程(Process
)。它可以工作,但会显示安装程序/选项屏幕。
我正在 运行在同一台计算机上使用 Visual Studio 编译的 Debug 文件夹中的 .exe。过程 运行 顺利进行,.msi 文件的安装开始。我在下面重新添加了 WiX 设置代码。
<Product Id="*" Name="My Installer" Language="1033" Version="!(bind.FileVersion.MyInstaller.exe)" Manufacturer="xxxxx" UpgradeCode="14bc5e0c-6535-4488-a6d8-0de89123aef1">
<Package InstallerVersion="200" InstallPrivileges="elevated" AdminImage="yes" Compressed="yes" InstallScope="perMachine" />
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
<Property Id="REINSTALLMODE" Value="amus" />
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Icon Id="icon.ico" SourceFile="$(var.ProjectDir)setupIcon.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<WixVariable Id="WixUILicenseRtf" Value="$(var.ProjectDir)\license.rtf" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UIRef Id="WixUI_InstallDir" />
<MediaTemplate />
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLFOLDER]" After="CostFinalize" />
<Feature Id="ProductFeature" Title="My Installer" Level="1">
<ComponentGroupRef Id="ProductComponents" />
<ComponentGroupRef Id="tr_TR_files" />
<ComponentGroupRef Id="ProgramFilesFolder_files" />
<ComponentGroupRef Id="uz_Latn_UZ_files" />
<ComponentGroupRef Id="ru_ru_files" />
<ComponentGroupRef Id="Ru_files" />
<ComponentGroupRef Id="pt_BR_files" />
<ComponentGroupRef Id="pt_files" />
<ComponentGroupRef Id="fr_FR_files" />
<ComponentGroupRef Id="de_files" />
<ComponentGroupRef Id="cs_CZ_files" />
<ComponentGroupRef Id="cs_files" />
<ComponentGroupRef Id="ar_DZ_files" />
<ComponentGroupRef Id="en_US_files" />
<ComponentGroupRef Id="fr_files" />
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef Id="ApplicationShortcutDesktop" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="My Installer">
<Directory Id="ar_DZ" Name="ar-DZ" />
<Directory Id="cs" Name="cs" />
<Directory Id="cs_CZ" Name="cs-CZ" />
<Directory Id="de" Name="de" />
<Directory Id="en_US" Name="en-US" />
<Directory Id="fr" Name="fr" />
<Directory Id="fr_FR" Name="fr-FR" />
<Directory Id="pt" Name="pt" />
<Directory Id="pt_BR" Name="pt-BR" />
<Directory Id="Ru" Name="Ru" />
<Directory Id="ru_ru" Name="ru-ru" />
<Directory Id="tr_TR" Name="tr-TR" />
<Directory Id="uz_Latn_UZ" Name="uz-Latn-UZ" />
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="My Installer" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
</Fragment>
<Fragment>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="9bd13330-6540-406f-a3a8-d7f7c69ae7f9">
<Shortcut Id="ApplicationStartMenuShortcut" Name="My Installer" Description="My Installer" Target="[INSTALLFOLDER]My Installer.exe" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="RemoveApplicationProgramsFolder" Directory="ApplicationProgramsFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\My Installer" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
<DirectoryRef Id="DesktopFolder">
<Component Id="ApplicationShortcutDesktop" Guid="cde1e030-eb64-49a5-b7b8-400b379c2d1a">
<Shortcut Id="ApplicationDesktopShortcut" Name="My Installer" Description="My Installer" Target="[INSTALLFOLDER]My Installer.exe" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\My Installer" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
注2:如果我将Debug文件夹中的.exe替换为安装程序所在的exe,则可以正常运行。我的猜测是 WiX 安装程序在检索 .exe 时遇到问题。
尝试将 运行 msiexec
作为命令:
var startInfo = new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = $"/c \"msiexec /i {fileName}\"",
UseShellExecute = false,
CreateNoWindow = true
};
在这里回答:invoking MSIEXEC within a Process fails
显然,如果您“使用有效证书对 MSI 进行数字签名”,问题就会消失。
此用户对话框的原因可能是:
漏洞利用方法与您所做的非常相似。
另外根据:
您还需要 运行 提升权限的进程。
startInfo.Verb = "运行as";
改编自其他答案示例:
string winDir = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(winDir, @"System32\msiexec.exe"), $"/i {_msiReadPath} /quiet /qn /norestart ALLUSERS=1");
startInfo.Verb = "runas";
startInfo.UseShellExecute = true;
Process.Start(startInfo);
我有一个程序,其中 运行 一些 .msi 文件。该程序从我们的网站下载一些文件和 运行s .msi 文件。当我 运行 如下代码时,它 运行 在大多数计算机上顺利运行并安装设置,但在某些计算机上它显示 windows 安装程序信息屏幕。当我在同一台计算机上使用 VisualStudio 打开项目时,它仍然可以正常工作,没有任何问题。我正在使用 WiX Setup 作为安装程序生成器。如果您对问题的原因有任何想法,能否请您帮忙?
总结
案例 1:程序是 运行 和 visual studio,下面的代码没有任何问题。
情况 2:我正在使用 WiX 安装程序来设置程序。在这种情况下,一些将适用于大多数计算机。在第一种情况下,它在工作计算机上不起作用。
情况 3:如果设置是 运行 由用户手动设置,而不是使用下面的代码,则可以正常工作。
Process p = new Process();
p.EnableRaisingEvents = true;
p.Exited += ProcessExit;
p.StartInfo.FileName = "msiexec";
p.StartInfo.Arguments = string.Format("{0} {1}", "/i", _msiReadPath);
p.StartInfo.UseShellExecute = true;
p.Start();
不是:我认为问题可能出在 WiX 安装程序上,因此我使用安装项目创建了一个新的安装程序。同样的问题仍然存在。在有此问题的计算机上,它会发出警告,提示它可能在使用 Setup Project 安装期间被感染。问题的根本原因可能是 Windows 安装程序吗?
其他更正和注释:
我在电脑上遇到问题的经历如下。
我正在使用使用 WiX 创建程序的设置来安装我的程序。然后我运行在程序中安装过程(Process
)。它可以工作,但会显示安装程序/选项屏幕。
我正在 运行在同一台计算机上使用 Visual Studio 编译的 Debug 文件夹中的 .exe。过程 运行 顺利进行,.msi 文件的安装开始。我在下面重新添加了 WiX 设置代码。
<Product Id="*" Name="My Installer" Language="1033" Version="!(bind.FileVersion.MyInstaller.exe)" Manufacturer="xxxxx" UpgradeCode="14bc5e0c-6535-4488-a6d8-0de89123aef1">
<Package InstallerVersion="200" InstallPrivileges="elevated" AdminImage="yes" Compressed="yes" InstallScope="perMachine" />
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
<Property Id="REINSTALLMODE" Value="amus" />
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Icon Id="icon.ico" SourceFile="$(var.ProjectDir)setupIcon.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<WixVariable Id="WixUILicenseRtf" Value="$(var.ProjectDir)\license.rtf" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UIRef Id="WixUI_InstallDir" />
<MediaTemplate />
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLFOLDER]" After="CostFinalize" />
<Feature Id="ProductFeature" Title="My Installer" Level="1">
<ComponentGroupRef Id="ProductComponents" />
<ComponentGroupRef Id="tr_TR_files" />
<ComponentGroupRef Id="ProgramFilesFolder_files" />
<ComponentGroupRef Id="uz_Latn_UZ_files" />
<ComponentGroupRef Id="ru_ru_files" />
<ComponentGroupRef Id="Ru_files" />
<ComponentGroupRef Id="pt_BR_files" />
<ComponentGroupRef Id="pt_files" />
<ComponentGroupRef Id="fr_FR_files" />
<ComponentGroupRef Id="de_files" />
<ComponentGroupRef Id="cs_CZ_files" />
<ComponentGroupRef Id="cs_files" />
<ComponentGroupRef Id="ar_DZ_files" />
<ComponentGroupRef Id="en_US_files" />
<ComponentGroupRef Id="fr_files" />
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef Id="ApplicationShortcutDesktop" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="My Installer">
<Directory Id="ar_DZ" Name="ar-DZ" />
<Directory Id="cs" Name="cs" />
<Directory Id="cs_CZ" Name="cs-CZ" />
<Directory Id="de" Name="de" />
<Directory Id="en_US" Name="en-US" />
<Directory Id="fr" Name="fr" />
<Directory Id="fr_FR" Name="fr-FR" />
<Directory Id="pt" Name="pt" />
<Directory Id="pt_BR" Name="pt-BR" />
<Directory Id="Ru" Name="Ru" />
<Directory Id="ru_ru" Name="ru-ru" />
<Directory Id="tr_TR" Name="tr-TR" />
<Directory Id="uz_Latn_UZ" Name="uz-Latn-UZ" />
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="My Installer" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
</Fragment>
<Fragment>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="9bd13330-6540-406f-a3a8-d7f7c69ae7f9">
<Shortcut Id="ApplicationStartMenuShortcut" Name="My Installer" Description="My Installer" Target="[INSTALLFOLDER]My Installer.exe" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="RemoveApplicationProgramsFolder" Directory="ApplicationProgramsFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\My Installer" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
<DirectoryRef Id="DesktopFolder">
<Component Id="ApplicationShortcutDesktop" Guid="cde1e030-eb64-49a5-b7b8-400b379c2d1a">
<Shortcut Id="ApplicationDesktopShortcut" Name="My Installer" Description="My Installer" Target="[INSTALLFOLDER]My Installer.exe" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\My Installer" Name="installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
注2:如果我将Debug文件夹中的.exe替换为安装程序所在的exe,则可以正常运行。我的猜测是 WiX 安装程序在检索 .exe 时遇到问题。
尝试将 运行 msiexec
作为命令:
var startInfo = new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = $"/c \"msiexec /i {fileName}\"",
UseShellExecute = false,
CreateNoWindow = true
};
在这里回答:invoking MSIEXEC within a Process fails
显然,如果您“使用有效证书对 MSI 进行数字签名”,问题就会消失。
此用户对话框的原因可能是:
漏洞利用方法与您所做的非常相似。
另外根据:
您还需要 运行 提升权限的进程。
startInfo.Verb = "运行as";
改编自其他答案示例:
string winDir = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(winDir, @"System32\msiexec.exe"), $"/i {_msiReadPath} /quiet /qn /norestart ALLUSERS=1");
startInfo.Verb = "runas";
startInfo.UseShellExecute = true;
Process.Start(startInfo);