[英]Process.Start() does nothing when called from a C# written service
[英]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)。 因此,將參數放入ProcessStartInfo
的Arguments
屬性。
在您的情況下,參數應為:
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.