Process.Start() 什么都不做
本文关键字:什么 Start Process | 更新日期: 2023-09-27 17:56:06
我必须通过代码启动VPN连接(Fortinet)。我有一个建立连接的cmd文件。如果我在外壳上调用cmd文件,它工作得很好。当我通过Process.Start调用它时,它什么也不做。它不会引发任何异常,它似乎正在执行,但 VPN 无法连接。
在标准输出上,我可以读取我放在cmd文件上的回显(因此它正在执行正确的文件)。我启动了一个 ping -d 以查看 vpn 何时启动,当我通过 shell 调用它时,它会在几秒钟内启动,通过 C# 它不是。
我也尝试了睡眠(30000),但什么都没有。
My cmd(ConnectFile.cmd):
@echo off
@echo Connecting to VPN
"C:'Program Files (x86)'Fortinet'SslvpnClient'FortiSSLVPNclient.exe" connect -s "vpn myvpn"
我的代码(连接文件和断开连接文件是包含cmd文件完整路径的字符串):
try
{
var startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.FileName = connectFile;
startInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(connectFile) ?? "";
System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo);
System.Threading.Thread.Sleep(30000);
base.GetFiles(folder);
}
finally
{
System.Diagnostics.Process.Start(disconnectFile);
}
您必须分隔参数。 FileName
用于 exe 文件,而不是整个 shell 命令(您明确表示不使用 shell)。因此,将参数放入ProcessStartInfo
中的Arguments
属性。
在您的情况下,参数应为:
- 文件名 -
C:'Program Files (x86)'Fortinet'SslvpnClient'FortiSSLVPNclient.exe
(无引号) - 参数 -
connect -s "vpn myvpn"
(再次,没有引用)
其次,如果捕获标准输出,则必须读取它。如果输出缓冲区在您读取之前已满,则被调用的进程将停止工作 - 它必须等待缓冲区被清空。如果您确定应用程序实际上会在某个时候完成,只需删除Thread.Sleep
并立即致电ReadToEnd
。否则,请使用 eg。异步读取以获取数据。
此外,通常最好设置 WorkingDirectory
.即使应用程序不需要工作目录中的任何数据,它也更安全,因为只有管理员可以更改Program Files
- 这有助于防止 DLL 注入黑客攻击。