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

windows 服務啟動外部程序

pin eof monit tel 一個 message seh query true

服務使用Process啟動外部程序沒窗體

在WinXP和Win2003環境中,安裝服務後,右鍵單擊服務“屬性”-“登錄”選項卡-選擇“本地系統帳戶”並勾選“允許服務與桌面交互”即可.

在Win7及以後的環境中,由於微軟加強了權限管理,將此功能禁用,需要引用第三方dll (Cjwdev.WindowsApi.dll)

鏈接: https://pan.baidu.com/s/1P6bBHI_AkOOTxvRTHh06aw 密碼: phdj

具體原因分析可參考此文章 :http://www.cnblogs.com/gnielee/archive/2010/04/07/session0-isolation-part1.html

public void AppStart(string appPath,string parms)
        {
            try
            {
                string appStartPath = appPath;
                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);

                ApiDefinitions.CreateProcessAsUser(
                    userTokenHandle,
                    appStartPath,
                    parms,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    false,
                    0,
                    IntPtr.Zero,
                    null,
                    ref startInfo,
                    out procInfo);

                if (userTokenHandle != IntPtr.Zero)
                    ApiDefinitions.CloseHandle(userTokenHandle);

                int _currentAquariusProcessId = (int)procInfo.dwProcessId;
                temppid = _currentAquariusProcessId;
                WriteLog("temppid", _currentAquariusProcessId.ToString());
            }
            catch (Exception ex)
            {
                WriteLog("AppStart", ex.Message);
            }
        }

  

CreateProcessAsUser

  關於參數 lpCommandLine,這裏可以放你給被創建進程傳遞的參數。 註意 C程序在傳遞參數時需要在參數前加一個空格,因為c程序main函數入參默認第一個參數是模塊名稱,從第二個參數開始才是你想要傳遞進去的參數,而參數以空格分隔 所以你要加一個空格啦。

關於通過Bat文件安裝卸載服務

cd /d %~dp0
sc create MonitorService binpath="%cd%\WindowsService1.exe" start= auto
sc start MonitorService
pause

 

sc stop MonitorService 
sc delete MonitorService 
pause

  

 

windows 服務啟動外部程序