我必须通过代码启动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);
}
答案 0 :(得分:0)
您必须分开参数。 FileName
用于exe文件,而不是整个shell命令(您明确说不使用shell)。因此,请将参数放入Arguments
中的ProcessStartInfo
属性。
在您的情况下,参数应为:
C:\Program Files (x86)\Fortinet\SslvpnClient\FortiSSLVPNclient.exe
(没有引号)connect -s "vpn myvpn"
(同样,没有引用)其次,如果捕获它,则必须读取标准输出。如果输出缓冲区在读取之前已满,则调用的进程将停止工作 - 它必须等待清空缓冲区。如果您确定该应用程序实际上已在某个时间点完成,只需移除Thread.Sleep
并立即致电ReadToEnd
即可。否则,请使用例如。异步读取以获取数据。
此外,设置WorkingDirectory
通常是个好主意。即使应用程序不需要来自工作目录的任何数据,它也更安全,因为只有管理员可以更改Program Files
- 这有助于防止DLL注入黑客。