1. 程式人生 > >windows服務下啟動外部程式

windows服務下啟動外部程式

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");
            }
        }