windows服務下啟動外部程式
阿新 • • 發佈:2019-02-02
1、緣由
公司要想做一個windows服務在檢測自家軟體的執行是否正常,如果不正常的話,就重新啟動它,所以涉及到了windows服務啟動外部程式的一個過程,但是進過測試,無法簡單的用process.start(),這樣的方式,主要原因是在vista和win7這樣的系統下,服務是執行在session 0,而基本上應用是執行在session 1,所以即便是process.start()能夠將外部程式啟動起來,桌面上也是看不到的, 何況啟動不起來呢~~;
2、解決方法:
在網上找到了好久,發現了這樣一個第三方庫,Cjwdev.WindowsApi.dll,能夠用幾行簡單的程式碼從服務啟動外部程式;
public static void openlocalexe(string path) { int _currentAquariusProcessID; /*appStartpath設定為全路徑地址*/ string appStartpath = path; IntPtr userTokenHandle = IntPtr.Zero; ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle); ApiDefinitions.PROCESS_INFORMATION procinfo = new ApiDefinitions.PROCESS_INFORMATION(); ApiDefinitions.STARTUPINFO startinfo = new ApiDefinitions.STARTUPINFO(); startinfo.cb = (uint)Marshal.SizeOf(startinfo); try { ApiDefinitions.CreateProcessAsUser(userTokenHandle, appStartpath, "", IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startinfo, out procinfo ); if (userTokenHandle != IntPtr.Zero) ApiDefinitions.CloseHandle(userTokenHandle); _currentAquariusProcessID = (int)procinfo.dwProcessId; } catch (Exception exc) { Interop.ShowMessageBox(exc.Message, "Comfirm"); } }