1. 程式人生 > >Windows服務啟動程序----Cjwdev.WindowsApi.dll

Windows服務啟動程序----Cjwdev.WindowsApi.dll

windows服務無法啟動外部程

做一個windows服務監聽服務,涉及到windows服務啟動外部程式的一個過程,但是除錯測試發現,無法簡單的用process.start()這種方法,

原因是在vista和win7這樣的系統下,服務是執行在session 0,而基本上應用是執行在session 1,所以windows服務下無法啟動process.start()。

網上看到windows服務下無法啟動外部程式的原因,解決方案

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

2、在Win7環境中,由於微軟加強了許可權管理,將此功能禁用,需要引用第三方dll,即Cjwdev.WindowsApi.dll

Cjwdev.WindowsApi.xml,dll下載連結:http://pan.baidu.com/share/link?shareid=159544&uk=3288736938

解決方法:使用這樣一個第三方庫,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)
{
Program.Log.Error(exc.Message);
//System.Runtime.InteropServices.Interop.ShowMessageBox(exc.Message, "Comfirm");
}
}

注意:要在windows服務裡面去呼叫啟動外部程式,並且外部程式不能使控制檯程式,建議是winform.exe這樣方便測試。