Process.Start()什么都不做

时间:2014-04-01 08:19:48

标签: c# cmd vpn

我必须通过代码启动VPN连接(Fortinet)。 我有一个建立连接的cmd文件。 如果我在shell上调用cmd文件它可以正常工作。 当我通过Process.Start调用它时,它什么也没做。 它不会抛出任何异常,它似乎执行但VPN无法连接。

在标准输出上,我可以读取放在cmd文件上的echo(因此它正在执行正确的文件)。 我启动了一个ping -d来查看vpn何时启动,当我通过shell调用它时,它会在几秒钟后上升,通过C#它不会。

我也尝试过睡眠(30000),但没有。

我的cmd(ConnectFile.cmd):

@echo off
@echo Connecting to VPN
"C:\Program Files (x86)\Fortinet\SslvpnClient\FortiSSLVPNclient.exe" connect -s "vpn myvpn"

我的代码(connectFile和disconnectFile是包含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);
}

1 个答案:

答案 0 :(得分:0)

您必须分开参数。 FileName用于exe文件,而不是整个shell命令(您明确说使用shell)。因此,请将参数放入Arguments中的ProcessStartInfo属性。

在您的情况下,参数应为:

  • FileName - C:\Program Files (x86)\Fortinet\SslvpnClient\FortiSSLVPNclient.exe(没有引号)
  • 参数 - connect -s "vpn myvpn"(同样,没有引用)

其次,如果捕获它,则必须读取标准输出。如果输出缓冲区在读取之前已满,则调用的进程将停止工作 - 它必须等待清空缓冲区。如果您确定该应用程序实际上已在某个时间点完成,只需移除Thread.Sleep并立即致电ReadToEnd即可。否则,请使用例如。异步读取以获取数据。

此外,设置WorkingDirectory通常是个好主意。即使应用程序不需要来自工作目录的任何数据,它也更安全,因为只有管理员可以更改Program Files - 这有助于防止DLL注入黑客。