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);
}

Process.Start() 什么都不做

您必须分隔参数。 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 注入黑客攻击。