簡體   English   中英

Process.Start()什么都不做

[英]Process.Start() does nothing

我必須通過代碼啟動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);
}

你必須分開參數。 FileName用於exe文件,而不是整個shell命令(您明確表示使用shell)。 因此,將參數放入ProcessStartInfoArguments屬性。

在您的情況下,參數應為:

  • FileName - C:\\Program Files (x86)\\Fortinet\\SslvpnClient\\FortiSSLVPNclient.exe (無引號)
  • 參數 - connect -s "vpn myvpn" (再次,沒有引用)

其次,如果捕獲它,則必須讀取標准輸出。 如果輸出緩沖區在讀取之前已滿,則調用的進程將停止工作 - 它必須等待清空緩沖區。 如果您確定應用程序實際上會在某個時刻完成,只需刪除Thread.Sleep並立即調用ReadToEnd 否則,請使用例如。 異步讀取以獲取數據。

此外,設置WorkingDirectory通常是個好主意。 即使應用程序不會從工作目錄需要的任何數據,它的安全,因為只有管理員可以修改Program Files -這有助於對DLL注入黑客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM